Bài giảng Nhập môn Công nghệ phần mềm - Chương 2: Tổ chức cấu trúc phần mềm hướng đối tượng

pdf 15 trang phuongnguyen 5530
Bạn đang xem tài liệu "Bài giảng Nhập môn Công nghệ phần mềm - Chương 2: Tổ chức cấu trúc phần mềm hướng đối tượng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_nhap_mon_cong_nghe_phan_mem_chuong_2_to_chuc_cau_t.pdf

Nội dung text: Bài giảng Nhập môn Công nghệ phần mềm - Chương 2: Tổ chức cấu trúc phần mềm hướng đối tượng

  1. Chương 2 Tổ chứccấutrúcphầnmềmhướng ₫ốitượng 2.1 Sự phát triểntrongcấutrúctổ chứcphầnmềm 2.2 Cấutrúccủa1 ứng dụng hướng ₫ốitượng 2.3 Đốitượng, thuộctính, tácvụ 2.4 Abstract type 2.5 Class 2.6 Tính bao ₫óng 2.7 Tính thừakế & cơ chế 'override' 2.8 Tính bao gộp 2.9 Thông ₫iệp, tính ₫axạ và kiểmtrakiểu 2.10 Tính tổng quát hóa 2.11 Kếtchương Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 1 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm ƒ Ban ₫ầu, chương trình thường rất Lệnh 1 ngắn, chỉ giải quyết1 vấn ₫ề nhỏ, rõ ràng, ₫ơngiản. Lệnh 2 ƒ Lúc này, chương trình là 1 danh Lệnh 3 Dữ liệu1 sách ngắncáclệnh, các lệnh này . Dữ liệu2 sẽ xử lý tậpcácdữ liệu(số lượng Lệnh i Dữ liệu3 cũng rấtít). . . Lệnh j Dữ liệun . Lệnh n Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 2
  2. 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm ƒ Nếuphântíchkỹ hơn, ta thấy trong danh sách các lệnh củachương trình có hiệntượng sau : ₫oạnlệnh giảiquyếtvầnvề nhỏ hơnnào₫ó Dữ liệu1 xuấthiệnnhiềulầnvìchương trình Dữ liệu2 cầnthựchiệnnónhiềulần. Dữ liệu3 ƒ Ta viết ₫oạnlệnh này 1 lần, gán . chonó1 tênnhậndạng. Ta gọinó là chương trình con. Trong họ ngôn Dữ liệun ngữ C, ta dùng thuậtngữ function. ƒ Function giúp ta tổ chứcchương trình nhất quán hơn, gọnnhẹ hơn, dễ bảo trì và phát triểnhơn. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 3 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm ƒ Trong chương trình bên phải, ta thấychứcnăng tính cos(x) cần3 lần trong chương trình, ta ₫ịnh nghĩa Cos(0) hàm cos(x) 1 lầnvới tham số x. Dữ liệu1 ƒ Mỗikhicần tính cos(x) trong Cos(90) Dữ liệu2 chương trình, ta chỉ cầnviết1 lệnh Dữ liệu3 gọi hàm ₫ơngiản. Cos(45) . Dữ liệun Cos(x) Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 4
  3. 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm ƒ Trong thựctế hiện nay, chương trình thường giảiquyếtnhiềuvấn ₫ề lớn, phứctạp, nó tương ứng vớisố lượng rấtlớn các hàm và dữ liệu. Lúc này ₫ể chúng trong 1 module (file) rấtbấttiện, khó duy trì ƒ Ta phải tìm cách khác tổ chứcphầnmềm : phân rã module rất lớnvàphứctạp ban ₫ầu thành nhiều module nhỏ : mỗi module chỉ chứa 1 ít hàm chứcnăng và dữ liệucómối quan hệ mậtthiết nào ₫ó. ƒ Đây là cách tổ chứcphầnmềmhướng cấutrúccổ₫iểntrước ₫ây. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 5 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm Chương trình = tập các module chứcnăng, mỗi module chứa1 số hàm + dữ liệucóliênquan. dữ liệu Module trong (file) module nhưng có thể ₫ược truy xuấttự do bấtkỳ Điểmnhập ₫âu chương trình (hàm dữ liệucục Main) bộ trong từng hàm Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 6
  4. 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm ƒ Mặcdùmỗi hàm hay dữ liệu ₫ược ₫ặt trong 1 module xác ₫ịnh, nhưng mặc ₫ịnh chúng ₫ượctruyxuấttự do bớibấtkỳ₫âu trong chương trình. Đây là 1 khuyết ₫iểmlớn, ta khắcphụcbằng cách miêu tả tầmvựcriêngchotừng phầntử : mặc ₫ịnh trong các ngôn ngữ C, C++, mỗiphầntử₫ềucótầmvựccôngcộng, nghĩa là bấtkỳ₫âu trong chương trình ₫ềutruyxuất ₫ược nó. ƒ Nếumuốnhạnchế việctruyxuấttừ ngoài module, ta dùng từ khóa static kếthợpvớiphầntử cần bao ₫óng, phầntử sẽ có tầm vựccụcbộ, bên ngoài module không truy xuất ₫ượcnónữa. ƒ Mộtphương pháp khác ₫ể hạnchế tầmvựctruyxuấttừng phần tử là ₫ịnh nghĩanótheocấutrúclồng nhau dạng phân cấp: nếu A chức B thì B chỉ ₫ượctruyxuấtbởiA, cácnơi khác bên ngoài A sẽ không thấyvàtruyxuất ₫ược B. Pascal là ngôn ngữ₫iểnhình về hỗ trợ khả năng này. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 7 2.1 Sự phát triển trong cấutrúctổ chứcphầnmềm ƒ Cho dù ₫ã dùng 1 số biệnphápở slide trướcthìcấutrúctổ chức phầnmềmhướng cấutrúcvẫncòn1 số khuyết ₫iểmkhác. ƒ Thí dụ, trong phầnmềmtacầnnhiều module có cùng chứcnăng A, số lượng là ₫ộng chưabiếttrước. Cấutrúchướng cấutrúcchỉ cho phép nhân bản module A vớisố lượng tĩnh biếttrướckhi phầnmềmchạy. Do ₫ótacần tìm 1 cấutrúctổ chứcphầnmềm khác : ₫ólàcấutrúctổ chứcphầnmềmhướng ₫ốitượng mà ta dùng chủ yếuhiệnnay. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 8
  5. 2.2 Cấutrúctổ chứcchương trình OOP Chương trình = tậpcác₫ốitượng sống ₫ộclập, tương tác nhau khi cầnthiết ₫ể hoàn thành nhiệmvụ củachương trình (ứng dụng). Đốitượng (object) dữ liệucục bộ trong ₫ốitượng Điểmnhập chương trình (hàm dữ liệucục Main) bộ trong từng hàm Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 9 2.2 Cấutrúctổ chứcchương trình OOP ƒ Cấutrúcchương trình hướng ₫ốitượng rấtthuầnnhất, chỉ chứa1 loại thành phần: ₫ốitượng. ƒ Các ₫ốitượng có tính ₫ộclậprấtcao⇒ quản lý, kiểm soát chương trình rấtdễ (cho dù chương trình có thể rấtlớn) ⇒ dễ nâng cấp, bảo trì. ƒ Không thể tạoradữ liệu toàn cụccủachương trình ⇒ ₫iểmyếu nhấtcủachương trình cấutrúckhôngtồntạinữa. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 10
  6. 2.3 Đốitượng (Object) ‰ Đốitượng là nguyên tử cấu thành ứng dụng. ‰ Đốitượng bao gồm2 loại thành phần chính yếu: ƒ Tậpcáctácvụ (operation) : mỗitácvụ thựchiện1 chứcnăng rõ ràng ₫ơngiản nào ₫ó mà bên ngoài cần dùng. ƒ Tậpcácthuộc tính dữ liệu (attribute) : mỗithuộc tính có kiểu dữ liệucụ thể, và chứa1 giátrị cụ thể thuộckiểutương ứng tại từng thời ₫iểm. Các thuộc tính phụcvụ cho các tác vụ và là ₫ốitượng xử lý bởicáctácvụ, do ₫ó nên bao ₫óng và ẩndấu chúng trong ₫ốitượng, không cho bên ngoài thấyvàtruyxuất trựctiếp. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 11 2.3 Đốitượng (Object) ‰ Viếtphầnmềmhướng ₫ốitượng là qui trình ₫ặctả các loại ₫ối tượng cấu thành ứng dụng. ‰ Đặctả mộtloại ₫ốitượng là ₫ặctả 2 góc nhìn khác nhau về₫ối tượng : ƒ Góc nhìn sử dụng : dùng phát biểu interface. ƒ Góc nhìn hiệnthựccụ thể : dùng phát biểu class.Implementation (class) Interface (abstract type) Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 12
  7. 2.4 Kiểutrừutượng (Abstract type) hay interface ‰ Phát biểu interface ₫ịnh nghĩa thông tin sử dụng ₫ốitượng mà bên ngoài thấy, kếthợp các thông tin này với 1 tên gọi, tên này ₫ượcgọilàtênkiểutrừutượng (Abstract type) hay ngắngọnlà type. ‰ Interface là tậphợpcác₫iểmnhập (entry) mà bên ngoài có thể giao tiếpvới ₫ốitượng. C# cho phép ₫ịnh nghĩa nhiềuloại ₫iểm nhập, nhưng phổ biếnnhấtlàtácvụ chứcnăng (operation). ‰ Ta dùng chữ ký (signature) ₫ể ₫ịnh nghĩavàphânbiệtmỗi ₫iểm nhập. Chữ ký của1 tácvụ gồm: 1. tên tác vụ (operation) 2. danh sách tham số hình thức, mỗi tham số ₫ược ₫ặctả bởi3 thuộc tính : tên, type và chiều di chuyển (IN, OUT, INOUT). 3. ₫ặctả chứcnăng củatácvụ (thường ở dạng chú thích). Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 13 2.4 Kiểutrừutượng (Abstract type) hay interface ‰ Muốnlàmviệcvới1 ₫ốitượng nào ₫ó, ta thường dùng biến ₫ối tượng. Biến ₫ốitượng nên ₫ược ₫ặctả kiểubằng tên interface, hạnchế dùng tên class cụ thể. ‰ Biến ₫ốitượng là biến tham khảo, nó không chứatrựctiếp ₫ối tượng, nó chỉ chứa các thông tin ₫ể truy xuất ₫ược ₫ốitượng, bất chấp ₫ốitượng ₫ang nằm ở₫âu. ‰ Biến ₫ốitượng thuộckiểu interface có thể tham khảo ₫ếnnhiều ₫ốitượng thuộc các class cụ thể khác nhau miễnsaocác₫ối tượng này hỗ trợ ₫ược interface tương ứng. ‰ Như vậy, nếu ta dùng ₫ốitượng thông qua biếnthuộckiểu interface thì ta không cầnbiếtbấtkỳ thông tin hiệnthực chi tiết nào về₫ốitượng mà mình ₫ang dùng, nhờ vậy code ứng dụng sẽ ₫ộclậphoàntoànvới class hiệnthựccủa ₫ốitượng ₫ượcsử dụng trong ứng dụng. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 14
  8. Thí dụ interface ‰ Thí dụ sau ₫ây miêu tả 1 interface của ₫ốitượng mà hỗ trợ 2 tác vụ chuẩn hóa chuỗitiếng Việtvề dạng tổ hợpvàdựng sẵn. Thông qua interface, ngườidùngkhônghề thấyvàbiết chi tiếtvề hiệnthựccủacáctácvụ, nhưng ₫iều này không hề ngăncảnhọ trong việc dùng ₫ốitượng nào ₫ó có interface IVietLib. interface IVietLib { //tác vụ chuẩn hóa chuỗitiếng Việtvề dạng tổ hợp int VnPre2Comp(String src, int len, ref String dst); //tác vụ chuẩn hóa chuỗitiếng Việtvề dạng dựng sẵn int VnComp2Pre(String src, int len, ref String dst); } Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 15 2.5 Class (Implementation) ‰ Phát biểu class ₫ịnh nghĩa chi tiếthiệnthực ₫ốitượng : ƒ ₫ịnh nghĩacácthuộc tính, mỗithuộctính₫ược ₫ặctả bởicác thông tin về nó như tên nhậndạng, kiểudữ liệu, tầmvựctruy xuất, Kiểucủathuộc tính có thể là type cổ₫iển(kiểugiátrị : số nguyên, thực, ký tự, chuỗikýtự, ) hay kiểu ₫ốitượng (kiểu tham khảo), trong trường hợpsauthuộctínhsẽ là tham khảo ₫ến ₫ốitượng khác. Trạng thái của ₫ốitượng là tậpgiátrị của tấtcả thuộc tính của ₫ốitượng tạithời ₫iểmtương ứng. ƒ 'coding' các tác vụ (miêu tả giảithuật chi tiếtvề hoạt ₫ộng của tác vụ), các hàm nộibộ trong class và các thành phần khác. ‰ Ngoài các thành phầnchứcnăng, ta còn phải ₫ịnh nghĩacáctác vụ quảnlý₫ốitượng như : khởitạotrạng thái ban ₫ầu (constructor), dọndẹp các phầntử liên quan ₫ến ₫ốitượng khi ₫ốitượng bị xóa (destructor). Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 16
  9. Thí dụ về class ‰ Thí dụ sau ₫ây miêu tả 1 class hiệnthực interface IVietLib : class MyVietLib : IVietLib { //₫ịnh nghĩacácthuộctínhcần dùng cho 2 tác vụ //₫ịnh nghĩa2 tácvụ quảnlý₫ốitượng MyVietLib() { } ~MyVietLib() { } //₫ịnh nghĩathuậtgiảitácvụ chuẩnhóachuỗitiếng Việtvề dạng tổ hợp int VnPre2Comp(String src, int len, ref String dst) { .} //₫ịnh nghĩathuậtgiảitácvụ chuẩnhóachuỗitiếng Việtvề dạng dựng sẵn int VnComp2Pre(String src, int len, ref String dst) { } } Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 17 2.6 Tính bao ₫óng (encapsulation) ‰ Bao ₫óng: chedấumọi chi tiếthiệnthựccủa ₫ốitượng, không cho bên ngoài thấyvàtruyxuất ⇒ tạo ₫ộ ₫ộclập cao giữacác ₫ốitượng (tính nối ghép — coupling — hay phụ thuộcgiữacác₫ối tượng rấtthấp), nhờ vậyviệcquảnlý, hiệuchỉnh và nâng cấp từng thành phầnphầnmềmdễ dàng, không ảnh hưởng ₫ếncác thành phần khác. ƒ che dấucácthuộctínhdữ liệu: nếucần cho phép bên ngoài truy xuất1 thuộctínhvật lý, ta tạo 1 thuộctínhluậnlý(2 tác vụ get/set tương ứng) ₫ể giám sát và kiểm soát việctruyxuất. ƒ che dấu chi tiếthiệnthựccáctácvụ. ƒ che dấu các local function và sự hiệnthựccủa chúng. ‰ C# cung cấpcáctừ khóa private, protected, internal, public (slide 5, chương 3) ₫ể xác ₫ịnh tầmvựctruyxuấttừng thành phầncủa class. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 18
  10. 2.7 Tính thừakế (inheritance) ‰ Tính thừakế cho phép giảmnhẹ công sức ₫ịnh nghĩa interface/class : ta có thể₫ịnh nghĩa các interface/class không phảitừ₫ầumàbằng cách kế thừa interface/class có sẵnnhưng gầngiống vớimình: ƒ Miêu tả tên cha : mọi thành phầncủa cha trở thành củamình. ƒ override 1 số method của class cha, kếtquả override chỉ tác dụng trên ₫ốitượng của class con. ƒ ₫ịnh nghĩa thêm các chi tiếtmới(thường khá ít). ‰ Đathừakế hay ₫ơnthừakế. C# cho phép ₫athừakế interface (₫ahiệnthực), nhưng chỉ hỗ trợ₫ơnthừakế class. ‰ Thừakế tạoramối quan hệ cha/con : phầntử₫ãcólàcha, phần tử thừakế cha ₫ượcgọi là con. Cha/con có thể là trựctiếphay gián tiếp. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 19 2.7 Tính thừakế (inheritance) ‰ Vớicáctínhchấtvề thừakế như slide trước, ta rút ra ₫ược1 số kếtluận: ƒ Đốitượng của class con luôn lớn hay hay ít nhấtbằng ₫ối tượng class cha. ƒ Và như thế, ₫ốitượng class con hoàn toàn có thể₫óng vai trò của ₫ốitượng class cha và thay thế₫ốitượng class cha khi cầnthiết, nhưng ngượclạithường không ₫ược. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 20
  11. 2.8 Tính bao gộp (aggregation) ‰ 1 ₫ốitượng có thể chứa nhiều ₫ốitượng khác ⇒ tạonênmối quan hệ bao gộp 1 cách ₫ệ quy giữacác₫ốitượng. Thí dụ₫ối tượng quốcgiachứanhiều ₫ốitượng tỉnh, ₫ốitượng tỉnh chứa nhiều ₫ốitượng quận/huyện, ‰ Có 2 góc nhìn về tính bao gộp: ngữ nghĩa& hiệnthực. Góc nhìn ngữ nghĩa Góc nhìn hiệnthực O2 O O1 2 O1 O3 O3 Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 21 Ví dụ về bao gộp //₫ịnh nghĩa class miêu tả₫ốitượng ₫ồ họacơ bản abstract class Geometry { // abstract base class public abstract void Draw (Graphics g); // abstract operation protected int xPos, yPos; protected COLORREF color; }; //₫ịnh nghĩa class ₫ồ họaphứchợp= tậpcác₫ốitượng ₫ồ họa ₫ãcó class GeoGroup : Geometry { public override void Draw (Graphics g) { } ; // override private Geometry [] objList; //danh sách các ₫ốitượng thành phần; int count; //số lượng các ₫ốitượng thành phần }; Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 22
  12. 2.9 Thông ₫iệp (Message), ₫axạ (Polymorphism) ‰ Thông ₫iệplàphương tiệngiaotiếp (hay tương tác) duy nhấtgiữa các ₫ốitượng, nó cho phép gọi 1 tác vụ chứcnăng của1 ₫ối tượng từ 1 tham khảo ₫ến ₫ốitượng. ‰ Thông ₫iệp bao gồm 3 thành phần: ƒ tham khảo ₫ến ₫ốitượng cầnnhờ. ƒ tên tác vụ muốngọi. ƒ danh sách tham số thựccầntruyền cho (hay nhậnvề từ) tác vụ. public override void Draw (Graphics g) { for (int i=0; i < count; i++) objList[i].Draw(g); //gởi thông ₫iệpnhờ₫ốitượng objList[i] // tự hiểnthị mình lên ₫ốitượng vẽ g } Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 23 2.9 Thông ₫iệp (Message), ₫axạ (Polymorphism) ‰ Xét ₫oạnlệnh sau : C1 obj = new C1(); obj.func(); //lần1 obj = new C2(); obj.func(); //lần2 ‰ Lệnh gởi thông ₫iệp obj.func() kích hoạttácvụ func() của class C1 hay tác vụ func() của class C2 ? 1. Dùng kỹ thuật xác ₫ịnh hàm và liên kếttĩnh : Dựavào thông tin tạithời ₫iểmdịch, biếnobjthuộckiểu C1 và máy dịch lờigởi thông ₫iệp obj.func() thành lờigọi hàm C1_func(). Như vậymỗikhimáychạylệnh này, hàm C1_func() sẽ chạy, bấtchấptạithời ₫iểmchạy, obj ₫ang tham khảo ₫ốitượng của class khác (C2). Điều này không ₫úng vớiý muốnngườilập trình. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 24
  13. 2.9 Thông ₫iệp (Message), ₫axạ (Polymorphism) 2. Dùng kỹ thuật xác ₫ịnh hàm và liên kết ₫ộng : Lệnh gởi thông ₫iệp obj.func() không ₫ượcdịch ra 1 lờigọi hàm nào cả mà ₫ượcdịch thành ₫oạnlệnh máy vớichứcnăng sau : xác ₫ịnh biến obj ₫ang tham khảo ₫ến ₫ốitượng nào, thuộc class nào, rồigọi hàm func() của class ₫óchạy. Như vậy, nếu obj ₫ang tham khảo ₫ốitượng thuộc class C1 thì hàm C1_func() sẽ ₫ượcgọi, còn nếuobj₫ang tham khảo ₫ốitượng thuộc class C2 thì hàm C2_func() sẽ ₫ượcgọi. Ta nói lờigởithông ₫iệp obj.func() có tính ₫axạ. Điều này giải quyết ₫úng ý muốn ngườilập trình. ‰ Tính ₫axạ : cùng 1 lệnh gởi thông ₫iệp ₫ến ₫ốitượng thông qua cùng 1 tham khảonhưng ở vị trí/thời ₫iểm khác nhau có thể kích hoạtviệcthựcthitácvụ khác nhau củacác₫ốitượng khác nhau. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 25 Kiểmtrakiểu (type check) ‰ Khi lập trình, ta thường phạmnhiềulỗi: lỗivề từ vựng, cú pháp, lỗivề thuậtgiải Trong các lỗithìlỗivề việc gán dữ liệukhác kiểuthường xảyranhất. ‰ Để phát hiệntriệt ₫ể và sớmnhấtcáclỗisaivề kiểu, máy sẽ dùng cơ chế kiểmtrakiểuchặtvàsớmtạithời ₫iểmdịch. ‰ Trong lúc dịch, bấtkỳ hoạt ₫ộng gán dữ liệu nào (lệnh gán, truyền tham số) ₫ều ₫ượckiểmtrakỹ lưỡng, nếudữ liệuvàbiến lưutrữ không "tương thích" thì báo sai. ‰ Tiêu chí không "tương thích" là gì ? ƒ dùng kỹ thuật so trùng tên kiểu: tênkiểu không trùng nhau là không tương thích. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 26
  14. Kiểmtrakiểu (type check) ƒ dùng mối quan hệ 'conformity' (tương thích tổng quát). KiểuA 'conformity' vớikiểuB nếu A cung cấpmọitácvụ mà B có, từng tác vụ của A cung cấptương thích vớitácvụ tương ứng của B. Nói nôm na A lớnhơnhay bằng B thì A 'conformity' với B. ‰ Như vậy, quan hệ so trùng hay quan hệ con/cha (sub/super) là trường hợp ₫ặcbiệtcủa quan hệ tương thích tổng quát. ‰ Nhờ dùng mối quan hệ 'conformity', mộtbiến obj thuộckiểuC1 có thể chứa tham khảo ₫ếnnhiều ₫ốitượng thuộcnhiều class khác nhau, miễn sao các class này tương thích vớiclass ₫ược dùng ₫ể ₫ịnh nghĩabiếnobj. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 27 2.10 Tính tổng quát hóa (Generalization) ‰ Viếtphầnmềmhướng ₫ốitượng là quá trình lặp: viết phát biểu interface/class ₫ể ₫ặctả từng loại ₫ốitượng cấu thành phần mềm. ‰ Nếusố lượng class cấu thành ứng dụng quá lớnthìviệcviếtphần mềmsẽ khó khăn, tốn nhiềuthờigiancôngsứchơn. ‰ Làm sao giảmnhẹ thời gian, công sứclập trình các ứng dụng lớn ? 1. sử dụng cơ chế thừakế trong ₫ịnh nghĩa interface/class. 2. thay vì trựctiếpviết các class cụ thể₫ặctả cho các ₫ốitượng trong phầnmềm, ta chỉ viết 1 class tổng quát hóa, rồinhờ class này sinh tự₫ộng mã nguồn các class cụ thể. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 28
  15. 2.10 Tính tổng quát hóa (Generalization) ‰ Thí dụ, thay vì phảiviết n class gầngiống nhau như danh sách các số nguyên, danh sách các số thực, danh sách các chuỗi, danh sách các record Sinhvien, danh sách các ₫ốitượng ₫ồ họa, ta chỉ cầnviết 1 class tổng quát hóa : danh sách các phần tử có kiểuhìnhthứcT. Khicầntạo 1 class danh sách các phầntử thuộckiểucụ thể nào ₫ó, ta chỉ viếtlệnh gọi class tổng quát hóa và truyềntênkiểucụ thể củaphầntử trong danh sách. ‰ Mỗingônngữ hướng ₫ốitượng (C++, Java, C#) có khả năng, tính chất, mức ₫ộ hỗ trợ tổng quát hóa khác nhau. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 29 2.11 Kếtchương ‰ Chương này ₫ãgiớithiệucấutrúccủachương trình hướng ₫ối tượng, các phương tiện ₫ặctả₫ốitượng như interface, class. ‰ Chương này cũng ₫ãgiớithiệu các tính chất liên quan ₫ếnviệc ₫ặctả và sử dụng ₫ốitượng như thừakế, bao ₫óng, bao gộp, tổng quát hóa. ‰ Chương này cũng ₫ãgiớithiệuphương tiệngiaotiếp duy nhất giữacác₫ốitượng là thông ₫iệp, nhu cầucầnphảicótính₫axạ trong việcthựchiệnlệnh gởi thông ₫iệp. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 2 : Tổ chứccấutrúcphầnmềmhướng ₫ốitượng © 2010 Slide 30