1 L L Ậ Ậ P TRÌNH HƯ P TRÌNH HƯ Ớ Ớ NG Đ NG Đ Ố Ố I TƯ I TƯ Ợ Ợ NG NG C C ++ ++ Bộ mônCôngnghệ phầnmềm Khoa Công Nghệ Thông Tin ĐạiHọcBáchkhoa–Đạihọc ĐàNẵng CHƯƠNG CHƯƠNG 1 1 18/02/2009 L L ậ ậ p Tr p Tr ì ì nh Hư nh Hư ớ ớ ng Đ ng Đ ố ố i Tư i Tư ợ ợ ng ng (Object (Object - - oriented Programming) oriented Programming) Mụctiêu Giớithiệunhững khái niệmcơ bảntronglập trình hướng đốitượng Nộidung Trừutượng hóa, đốitượng, lớp Thuộctínhvàphương thức Thông điệpvàtruyền thông điệp Tính bao gói, tính kế thừa, tính đahình 18/02/2009 Kh Kh á á i i Ni Ni ệ ệ m m Lậptrìnhhướng đốitượng (OOP- Object- Oriented Programming) mộtcáchtư duy mới, tiếpcậnhướng đốitượng để giải quyếtvấn đề bằng máy tính. mộtphương pháp thiếtkế và phát triểnphầnmềm dựatrênkiếntrúclớpvàđốitượng. Quá trình tiếnhóacủa OOP 1. Lậptrìnhtuyến tính 2. Lập trình có cấutrúc 3. Sự trừutượng hóa dữ liệu 4. Lậptrìnhhướng đốitượng 18/02/2009 L L ậ ậ p p tr tr ì ì nh nh không không c c ó ó c c ấ ấ u u tr tr ú ú c c (non (non - - structured programming) structured programming) Là phương pháp xuấthiện đầutiên các ngôn ngữ như Assembly, Basic sử dụng các biếntổng thể lạmdụng lệnh GOTO Các nhược điểm khó hiểu, khó bảo trì, hầunhư không thể sử dụng lại chấtlượng kém chi phí cao không thể phát triển các ứng dụng lớn 2 18/02/2009 L L ậ ậ p p tr tr ì ì nh nh không không c c ó ó c c ấ ấ u u tr tr ú ú c c (non (non - - structured programming) structured programming) Đoạn trình trên khó theo dõi, khó hiểu, dễ gây lỗi, khó sửa đổi. 10 k=1 20 gosub 100 30 if y > 120 goto 60 40 k = k + 1 50 goto 20 60 print k, y 70 stop 100 y = 3*k*k + 7*k - 3 110 return Lệnh nhảy đếnvị trí bất kỳ trong chương trình 18/02/2009 L L ậ ậ p p tr tr ì ì nh nh c c ó ó c c ấ ấ u u tr tr ú ú c/l c/l ậ ậ p p tr tr ì ì nh nh th th ủ ủ t t ụ ụ c c (structured/procedural programming) (structured/procedural programming) sử dụng các lệnh có cấu trúc: for, do while, if then else các ngôn ngữ: Pascal, C, chương trình là tập các hàm/thủ tục Mã chương trình tập trung thể hiệnthuật toán: làm như thế nào. Ưu điểm chương trình đượccụcbộ hóa, do đódễ hiểu, dễ bảo trì hơn dễ dàng tạoracácthư việnphầnmềm 18/02/2009 V V í í d d ụ ụ int func(int j) { return (3*j*j + 7*j-3); } int main() { int k = 1 while (func(k) < 120) k++; printf("%d\t%d\n", k, func(k)); return(0); } 18/02/2009 L L ậ ậ p p tr tr ì ì nh nh c c ó ó c c ấ ấ u u tr tr ú ú c/l c/l ậ ậ p p tr tr ì ì nh nh th th ủ ủ t t ụ ụ c c Nhược điểm dữ liệuvàmãxử lý là tách rời dữ liệuthụđộng, xử lý chủđộng khó đảmbảo tính đúng đắncủadữ liệu không tựđộng khởitạo hay giải phóng dữ liệu động không đảmbảo được tính nhất quán và các ràng buộccủadữ liệu khó cấmmãứng dụng sửadữ liệucủathư viện khó bảo trì code phầnxử lý có thể nằmrảirác ngườilập trình phảibiếtcấutrúcdữ liệu(vấn đề này mộtthờigiandàiđược coi là hiểnnhiên) khi thay đổicấutrúcdữ liệuthìmãxử lý (thuật toán) phảithayđổitheo 3 18/02/2009 V V í í d d ụ ụ struct Date { int day; int month; int year; }; void setDate(Date& date, int newDay, int newMonth, int newYear) { date.day = newDay; … } … Chuyệngìxảyranếucácđốisố newDay, newMonth, newYear tạo thành ngày tháng năm không hợplệ? 18/02/2009 T T ạ ạ i i sao sao ph ph ả ả i i thay thay đ đ ổ ổ i i c c ấ ấ u u tr tr ú ú c c d d ữ ữ li li ệ ệ u u ? ? Cấutrúcdữ liệulàmôhìnhcủa bài toán cầngiải quyết Do thiếukiếnthứcvề bài toán, về miền ứng dụng , không phải lúc nào cũng tạo đượccấutrúcdữ liệu hoàn thiện ngay từđầu. Tạoramộtcấutrúcdữ liệuhợp lý luôn là vấn đề đau đầucủangườilập trình. Bản thân bài toán cũng không bấtbiến Cầnphải thay đổicấutrúcdữ liệu để phù hợpvớicác yêu cầuthayđổi. 18/02/2009 C C á á c c v v ấ ấ n n đ đ ề ề Thay đổicấutrúc dẫn đếnviệcsửalạimãchương trình (thuật toán) tương ứng và làm chi phí phát triểntăng cao. không tái sử dụng đượccácmãxử lý ứng vớicấu trúc dữ liệucũ. Đảmbảo tính đúng đắncủadữ liệu một trong những nguyên nhân chính gây ra lỗiphần mềm là gán các dữ liệu không hợplệ cầnphảikiểm tra tính đúng đắncủadữ liệumỗikhi thay đổigiátrị 18/02/2009 V V í í d d ụ ụ : : MyDate MyDate struct Date { int year, month, day; }; Date d; d.day = 32; // invalid day d.day = 31; d.month = 2; // how to check d.day = d.day + 1; // 4 18/02/2009 V V í í d d ụ ụ : : MyDate MyDate (2) (2) Thay đổicấutrúcdữ liệu: struct Date { short year; short mon_n_day; }; 18/02/2009 Gi Gi ả ả i i ph ph á á p p Che dấudữ liệu(chedấucấutrúc) Truy cậpdữ liệu thông qua giao diệnxácđịnh class MyDate { private int year, mon, day; public int getDay() { } public boolean setDay(int) { } }; 18/02/2009 S S ử ử d d ụ ụ ng ng giao giao di di ệ ệ n n MyDate d;; d.day = 30; // compile error d.setDay(31); d.setMonth(2); // should return False 18/02/2009 T T ạ ạ i i Sao Sao Ti Ti ế ế p p C C ậ ậ n n Hư Hư ớ ớ ng ng Đ Đ ố ố i i Tư Tư ợ ợ ng ng ? ? Loại bỏ những thiếu sót của tiếp cận theo thủ tục Trong OOP Dữ liệu được xem như một phần tử chính yếu và được bảo vệ Hàm gắnkết với dữ liệu, thao tác trên dữ liệu Phân tách bài toán thành nhiều thực thể (đối tượng) Æ xây dựng dữ liệu + hàm cho các đối tượng này. Tăng cường khả năng sử dụng lại 5 18/02/2009 Đ Đ ặ ặ c Đi c Đi ể ể m Quan Tr m Quan Tr ọ ọ ng ng Nhấn mạnh trên dữ liệu hơn là thủ tục Các chương trình được chia thành các đối tượng Dữ liệu được che giấu và không thể được truy xuất từ các hàm bên ngoài Các đối tượng có thể giao tiếp với nhau thông qua các hàm Dữ liệu hay các hàm mới có thể được thêm vào khi cần Theo tiếp cận từ dưới lên 18/02/2009 Thu Thu ậ ậ n L n L ợ ợ i i So với các tiếp cận cổ điển thì OOP có những thuận lợi sau: OOP cung cấp một cấu trúc module rõ ràng Giao diện được định nghĩa tốt Những chi tiết cài đặt được ẩn OOP giúp lập trình viên duy trì mã và sửa đổi mã tồn tại dễ dàng (các đối tượng được tạo ra với những khác nhau nhỏ so với những đối tượng tồn tại). OOP cung cấp một framework tốt với các thư viện mã mà các thành phần có thể được chọn và sửa đổi bởi lập trình viên. 18/02/2009 L L ị ị ch ch s s ử ử OOP OOP Các ngôn ngữ lậptrìnhhướng đốitượng không mới Simula (1967) là ngôn ngữđầu tiên, có lớp, thừakế, liên kết động (hay còn gọi là hàm ảo) Nhưng các ngôn ngữ hướng đốitượng chậm hơn các ngôn ngữ thờikỳđầu nên chúng chỉđược dùng rộng rãi khi máy tính bắt đầuchạy nhanh (khoảng thờigianchiếc máy Pentium đầutiênrađời) Lưuý rằng biên dịch các chương trình hướng đối tượng cũng chậm 18/02/2009 L L ị ị ch ch s s ử ử OOP OOP Mộtsố hệ thống “hướng đốitượng” thờikỳđầu không có các lớp chỉ có các “đốitượng” và các “thông điệp” (v.d. Hypertalk) Hiệngiờ, đãcósự thống nhấtrằng hướng đốitượng là: lớp-class thừakế - inheritance và liên kết động - dynamic binding Mộtsốđặc tính củalậptrìnhhướng đốitượng có thể đượcthựchiệnbằng C hoặc các ngôn ngữ lậptrìnhthủ tục khác. Điểm khác biệtsự hỗ trợ và ép buộc ba khái niệmtrên đượccàihẳn vào trong ngôn ngữ. Mức độ hướng đốitượng của các ngôn ngữ không giống nhau Eiffel (tuyệt đối), Java (rất cao), C++ (nửanọ nửakia) 6 18/02/2009 L L ị ị ch ch s s ử ử ngôn ngôn ng ng ữ ữ l l ậ ậ p p tr tr ì ì nh nh FORTRAN I FORTRAN II ALGOL 60 LISP ALGOL 58 CPL COBOL COMTRAN FLOW-MATIC PROLOG ADA PASCAL SIMULA 67 SIMULA I PL/1 BASIC FORTRAN IV B BCPL ALGOL 68 SMALLTALK 80 EIFFEL C++ C BETA JAVA 1957 1960 1965 1970 1975 1980 1985 1990 1995 MODULA 2 MODULA 3OBERON C# 2000 18/02/2009 Tr Tr ừ ừ u u Tư Tư ợ ợ ng ng H H ó ó a a (Abstraction) (Abstraction) Trừutượng hóa Phân biệt cầnthiết với chi tiết Giao diện–Càiđặt Cái gì – Thế nào Phân tích – Thiếtkế Các kỹ thuậttrừutượng Đóng gói (encapsulation) Ẩn thông tin (information hiding) Thừakế (inheritance) Đahình(polymorphism) 18/02/2009 Đ Đ ố ố i Tư i Tư ợ ợ ng ng (Object) (Object) Đối tượng là chìa khóa để hiểu đượckỹ thuật hướng đốitượng Trong hệ thống hướng đốitượng, mọithứđềulàđối tượng Viếtmộtchương trình hướng đốitượng nghĩalàđang xây dựng mộtmôhìnhcủamộtvàibộ phậntrongthế giớithực 18/02/2009 Đ Đ ố ố i i Tư Tư ợ ợ ng ng Th Th ế ế Gi Gi ớ ớ i i Th Th ự ự c c (Real Object) (Real Object) Một đốitượng thế giớithực là mộtthực thể cụ thể mà thông thường bạncóthể sờ, nhìn thấy hay cảmnhận được. Tấtcả có trạng thái (state) và hành động (behaviour) 7 18/02/2009 Đ Đ ố ố i i Tư Tư ợ ợ ng ng Ph Ph ầ ầ n n M M ề ề m m (Software Object) (Software Object) Các đốitượng phầnmềm có thểđược dùng để biểudiễn các đốitượng thế giới thực. Cũng có trạng thái và hành động Trạng thái: thuộc tính (attribute; property) Hành động: phương thức (method) 18/02/2009 Đ Đ ố ố i i Tư Tư ợ ợ ng ng Đốitượng (object) là một thựcthể phầnmềm bao bọccácthuộctínhvà các phương thức liên quan. Đốitượng phầnmềm Đốitượng phầnmềm Xe Đạp Thuộc tính đượcxácđịnh bởigiátrị cụ thể gọilà thuộctínhthể hiện. Một đốitượng cụ thể đượcgọilàmột thể hiện. 18/02/2009 L L ớ ớ p p (Class) (Class) Trong thế giớithực có nhiều đốitượng cùng loại. Chương trình hướng đốitượng có nhiều đối tượng cùng loạichiasẻ những đặc điểm chung. Ví dụ 18/02/2009 L L ớ ớ p p (Class) (Class) Một lớp là mộtthiếtkế (blueprint) hay mẫu (prototype) cho các đốitượng cùng kiểu Ví dụ:lớp XeDap là mộtthiếtkế chung cho nhiều đốitượng xe đạp đượctạora Lớp định nghĩacácthuộctínhvàcácphương thức chung cho tấtcả các đốitượng của cùng mộtloại nào đó Một đốitượng là một thể hiện cụ thể củamộtlớp. Ví dụ: mỗi đốitượng xe đạplàmộtthể hiệncủalớp XeDap Mỗithể hiệncóthể có những thuộc tính thể hiện khác nhau Ví dụ: mộtxeđạpcóthểđang ở bánh răng thứ 5 trong khi mộtxe khác có thể là đang ở bánh răng thứ 3. 8 18/02/2009 Đ Đ ố ố i i tư tư ợ ợ ng ng (Object) (Object) Đốitượng có định danh thuộc tính (dữ liệu) hành vi (phương thức) Mỗi đốitượng bấtkểđang ở trạng thái nào đềucó định danh và được đốixử như mộtthựcthể riêng biệt. mỗi đốitượng có một handle (trong C++ là địa chỉ) hai đốitượng có thể có giá trị giống nhau nhưng handle khác nhau 18/02/2009 V V í í D D ụ ụ L L ớ ớ p p Xe Xe Đ Đ ạ ạ p p Khai báo cho lớp XeDap Đốitượng củalớp XeDap 18/02/2009 Thu Thu ộ ộ c c T T í í nh nh L L ớ ớ p p & & Phương Phương Th Th ứ ứ c c L L ớ ớ p p 18/02/2009 Thu Thu ộ ộ c c T T í í nh nh L L ớ ớ p p & & Phương Phương Th Th ứ ứ c c L L ớ ớ p p Thuộctínhlớp (class attribute) là mộthạng mụcdữ liệu liên kếtvớimộtlớpcụ thể mà không liên kếtvới các thể hiệncủalớp. Nó được định nghĩa bên trong định nghĩalớpvàđượcchiasẻ bởitấtcả các thể hiện củalớp. Phương thứclớp (class method) là mộtphương thức đượctriệugọi mà không tham khảotớibấtkỳ một đốitượng nào. Tấtcả các phương thứclớp ảnh hưởng đếntoànbộ lớpchứ không ảnh hưởng đến mộtlớp riêng rẽ nào. 9 18/02/2009 Thu Thu ộ ộ c c T T í í nh nh & & Phương Phương Th Th ứ ứ c c Thuộctính(attribute) là dữ liệu trình bày các đặc điểmvề một đốitượng. Phương thức (method) cóliênquantới những thứ mà đốitượng có thể làm. Một phương thức đáp ứng mộtchứcnăng tác động lên dữ liệucủa đốitượng (thuộc tính). 18/02/2009 Thông Thông Đi Đi ệ ệ p p & & Truy Truy ề ề n n Thông Thông Đi Đi ệ ệ p p Thông điệp (message) là mộtlờiyêucầu mộthoạt động. Gồmcó: Đốitượng nhận thông điệp Tên củaphương thứcthựchiện Các tham số mà phương thứccần Truyền thông điệp: một đốitượng triệu gọimột hay nhiềuphương thứccủa đối tượng khác để yêu cầuthôngtin. 18/02/2009 T T í í nh nh Bao Bao G G ó ó i i (Encapsulation) (Encapsulation) Đóng gói (encapsulation) là tiếntrìnhche giấuviệcthựcthichi tiếtcủamột đối tượng. 18/02/2009 Ẩ Ẩ n n Thông Thông Tin Tin (Information Hiding) (Information Hiding) Đóng gói Æ Thuộctínhđượclưutrữ hay phương thức đượccàiđặtnhư thế nào Æ đượcchegiấu đitừ các đối tượng khác Việc che giấunhững chi tiếtthiếtkế và cài đặttừ những đốitượng khác đượcgọilàẩn thông tin 10 18/02/2009 T T í í nh nh Th Th ừ ừ a a K K ế ế (Inheritance) (Inheritance) Hệ thống hướng đốitượng cho phép các lớp được định nghĩakế thừatừ các lớp khác Ví dụ, lớp xe đạpleonúivà xe đạp đua là những lớp con (subclass) củalớp xe đạp. Thừakế nghĩalàcácphương thứcvàcác thuộctínhđược định nghĩa trong mộtlớp có thểđượcthừakế hoặc đượcsử dụng lạibởilớp khác. 18/02/2009 T T í í nh nh Th Th ừ ừ a a K K ế ế (Inheritance) (Inheritance) cho phép các phần mềmsử dụng quan hệ “là” giúp ta thiếtkế các dịch vụ tổng quát rồi chuyên môn hóa chúng 18/02/2009 T T í í nh nh Đa Đa H H ì ì nh nh (Polymorphism) (Polymorphism) Đahình: “nhiềuhìnhthức”, hành động cùngtêncóthểđượcthựchiện khác nhau đốivớicácđốitượng/các lớp khác nhau. Ngữ cảnh khác Æ kếtquả khác Đường Thẳng Hình TrònĐiểm Hình Vuông Vẽ 18/02/2009 T T í í nh nh Đa Đa H H ì ì nh nh (Polymorphism) (Polymorphism) Đa hình hàm - Functional polymorphism cơ chế cho phép một tên thao tác hoặcthuộctínhcóthểđược định nghĩatạinhiềulớpvàcóthể có nhiềucàiđặt khác nhau tại mỗilớptrongcáclớp đó v.d. lớp Date cài 2 phương thức setDate(),mộtnhận tham số là một đốitượng Date, phương thứckianhận 3 tham số day, month, year. Đahìnhđốitượng - Object polymorphism các đốitượng thuộccáclớp khác nhau có khả năng hiểucùngmột thông điệp theo các cách khác nhau vd. khi nhận được cùng một thông điệp draw(), các đốitượng Rectangle và Triangle hiểuvàthựchiện các thao tác khác nhau . triểnphầnmềm dựatrênkiếntrúclớpvàđốitượng. Quá trình tiếnhóacủa OOP 1. Lậptrìnhtuyến tính 2. Lập trình có cấutrúc 3. Sự trừutượng hóa dữ liệu 4. Lậptrìnhhướng đốitượng 18 /02/2009 L L ậ ậ p p tr tr ì ì nh nh không không c c ó ó c c ấ ấ u u tr tr ú ú c c (non (non - - structured. Đahình(polymorphism) 18 /02/2009 Đ Đ ố ố i Tư i Tư ợ ợ ng ng (Object) (Object) Đối tượng là chìa khóa để hiểu đượckỹ thuật hướng đốitượng Trong hệ thống hướng đốitượng, mọithứđềul đối tượng Viếtmộtchương trình. 58 CPL COBOL COMTRAN FLOW-MATIC PROLOG ADA PASCAL SIMULA 67 SIMULA I PL /1 BASIC FORTRAN IV B BCPL ALGOL 68 SMALLTALK 80 EIFFEL C++ C BETA JAVA 19 57 19 60 19 65 19 70 19 75 19 80 19 85 19 90 19 95 MODULA 2 MODULA 3OBERON C# 2000 18 /02/2009 Tr Tr ừ ừ u u Tư Tư ợ ợ ng ng H H ó ó a a (Abstraction) (Abstraction)