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
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:
- bai_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
- 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.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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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