PDA

View Full Version : [TUTOR] OOP 4 : Code Reusability



danceswithwolves
30-09-2002, 14:37
OOP 4 : Tái sử dụng mã - Code Reusability

Mỗi class sau khi được thiết kế và kiểm tra (test) cẩn thận được xem như một đơn vị code hữu dụng. Client programmer sử dụng những class này cho các ứng dụng của họ (xài chùa hay mua lại). Như vậy một class được viết ra có thể được dùng lại rất rất nhiều lần ở các ứng dụng khác. Tính "tái dụng mã" (code reusability) là một trong những thế mạnh lớn nhất mà những NNLT hướng đối tượng cung cấp.

Phương pháp tái dụng mã đơn giản nhất là khởi tạo trực tiếp một object từ class có sẵn. Điều này giống như bạn đi xin (nếu được, nhưng chắc phải mua) bản thiết kế nhà (class có sẵn) của người khác, đem về thiết kế một cái nhà (object) cho riêng mình.

Cách khác là thiết kế một class cho riêng bạn, mà trong class này sử dụng object của class có sẵn (gọi là tạo object thành viên - member object). Liên hệ ra đời sống : giống như mấy nhà máy sản xuất xe máy ở VN, nguyên cả cái xe máy là của mình thiết kế, nhưng một vài bộ phận khó thì chịu, đến khi sản xuất xe (tạo object) thì mấy bộ phần này phải nhập (object member) -> xe máy VN. Cách này được gọi là composition hay tổng quát hơn là aggregation. Quan hệ giữa class mới và class có sẵn là quan hệ "có"/"has-a" (xe máy VN "có" động cơ Campuchia).

Composition mang lại sự linh hoạt tuyệt vời. Thường thì các member objects trong class mới sẽ được đặt là private -> vô hình đối với client programmer. Nếu các member objects được thay đổi (thường là được nâng cấp, xảy ra khi class của các member objects được nâng cấp) thì class mới của bạn cũng được hưởng lợi.

Lập trình hướng đối tượng được đặc trưng bởi một cái... bánh 3 miếng. Không lạ, không lạ đối với những OO programmers, đó là Polymorphism (tính đa hình), Inheritance (tính thừa kế) và Encapsulation (tính đóng gói) -> 3 miếng hợp thành một cái bánh (PIE). Chương này bàn về code reusability nên chúng ta sẽ xem xét miếng Inheritance trước, hai miếng còn lại để dành ăn sau.

Thừa kế (inheritance) là khái niệm muôn đời quan trọng của lập trình hướng đối tượng. Những nhà lập trình OO tương lai nên luôn tâm niệm rằng, tận dụng được inheritance là các bạn đã có sức mạnh to lớn của OOP. Đương nhiên, cũng như thực tế, được thừa kế, tức không làm mà có xài chơi thì ai mà hổng khoái ? Nhưng, hãy nhớ rằng inheritance ngoài cung cấp khả năng tái dụng mã còn cho phép class creators thiết lập hệ thống cấp bậc cho các class.

Giả sử Chúa thiết kế được class Horse như sau :


class Horse
(properties)
...
(methods)
Gallop
Whinny
...
end class

một ngày nọ, Chúa bỗng muốn có một loài ngựa biết bay cho thế giới thêm màu sắc. Nếu như thiết kế lại từ đầu một loài ngựa mới có các tính chất và hành vi như ngựa thường, thêm vào khả năng bay thì quả là tốn nhiều công sức. Thế nên, phương pháp thừa kế được Người sử dụng như sau :


class Pegasus inherits from Horse
(methods)
Fly
end class

Với phương pháp này, loài Pegasus này sẽ thừa hưởng tất cả những gì loài Horse có, ngoài ra loài này còn có thêm khả năng riêng là "bay". Class Pegasus được gọi là sub/child/derived/inherited class, còn class Horse được gọi là super/base/parent class. Quan hệ giữa base class và sub class là quan hệ "là"/"is-a". Ta có thể nói một con Thiên Mã (Pegasus) là một con Ngựa (Horse), đơn giản vì nó rút cuộc cũng chỉ là một con ngựa, cho dù nó biết bay.

Các NNLT hướng đối tượng chạy qua hệ nền trung gian (và có cơ chế lượm rác - Garbage Collector) như Java hay C# (không có OOPL nào là thực sự OO pure) chỉ hỗ trợ thừa kế đơn (tuy nhiên hỗ trợ đa giao diện - multi-interface - sẽ bàn sau). Tức là mỗi sub class chỉ thừa kế trực tiếp từ tối đa một base class mà thôi. Điều này được quy định để hỗ trợ cho cơ chế lượm rác hoạt động, thoạt xem có vẻ như hạn chế công tác lập trình nhưng thực chất là góp phần cho code được sáng sủa. Còn, hic, C++ thì bất chấp, một sub class có thể được thừa kế từ nhiều base class. Một ví dụ đa thừa kế :


class Horse (xem phía trên)

class Bird
(properties)
...
(methods)
Fly
Sing
...
end class

class Pegasus inherits from Horse and Bird
end class

với những gì thừa hưởng từ hai loài Horse và Bird, loài Pegasus có khả năng phi nước đại (gallop), hí (whinny), bay (fly) và thậm chí... hót (sing).

xp2002_
30-09-2002, 14:44
danceswithwolves ơi, hãy cụ thể hoá bài viết của cậu để mọi người ai cũng có thể hiểu được nhé. Trước hết bạn hãy bỏ bớt những phần kỹ thuật bên dưới vì sẽ làm rối cho người mới học đấy.:D

danceswithwolves
01-10-2002, 07:16
hi there, phần kỹ thuật nào cơ ? tớ dùng pseudo code mà ?

Old Shark
01-10-2002, 08:17
Hay lắm DWW, tiếp tục đi...

danceswithwolves
02-10-2002, 07:50
thanx, ông già mập :).