Tìm Hiểu Về Nguyên Lý "Composition over Inheritance"

Bài viết giải thích về nguyên lý “Composition over Inheritance” trong lập trình với ví dụ sử dụng ngôn ngữ PHP.
Rất mong mọi người cho ý kiến đóng góp

http://www.codehub.vn/Tim-Hieu-Ve-Nguyen-Ly-Composition-over-Inheritance

1 Like

Composition và Inheritance là 2 kĩ thuật trong các kĩ thuật để tránh vấn đề Duplication bằng cách reuse từ class khác, thay đổi 1 số thành phần.

Inheritance thực thi tại compile time, có thể nhìn thấy cơ chế reuse của nó. Ngược lại, composition thực thi ở runtime, khó nhìn thấy cách reuse. Đối với app nhỏ thì composition hay inheritance không có sự khác biệt, đọc code là hiểu ngay, nhưng khi app phát triển, thì lập trình viên khó hiểu cách reuse ở composition hơn là ở inheritance.

Quy trình phát triển phần mềm hiện tại là quy trình Agile, app phải đáp ứng được yêu cầu thay đổi (change) nên người ta chuộng composition hơn nheritance. Vì họ có thể thay đổi cơ chế kế thừa tại runtime mà không cần tác động source code, chỉ cần tạo file mới. Trong khi đối với inheritance, phải compile lại nguyên toàn bộ class hierarchy, và khi change requirement xảy ra ở superclass thì tất cả subclasses đều bị ảnh hưởng.

cái này hôm trước có đọc 1 cái ví dụ trong cuốn HeadFirstDesignPatterns nó giải thích rất rõ ràng về vấn đề này tùy vào từng trường hợp mà áp dụng cho hợp lý làm sao đảm bảo được sự linh hoạt của chương trình , chứ không phải cứ dùng composition là tốt đâu mấy cái này liên quan đế thiết kế hướng đối tượng …trên youtube cũng có vài video nói về cái này mà mình thấy ông nào cũng đưa vd đúng của mình ra để cãi cả nên…:grin:

Hầu hết ngôn ngữ lập trình ra đời gần đây toàn loại bỏ tính năng inheritance. Golang là 1 ví dụ, Go chỉ sử dụng composition thôi.
Mới đây thì Apple giới thiệu ngôn ngữ Swift, trong Swift đưa ra khái niệm mới là Value Type, cũng không có inheritance.

giờ thấy đang chuộng lập trình hàm hơn oop thì phải , còn việc loại bỏ inheritance mình thấy không đúng lắm đồng ý là composition sẽ làm cho code uyển chuyển hơn nhưng trong 1 vài trường hợp thì compositon không thể thay thế cho inheritance đươc vd ở decorator pattern bắt buộc phải dùng inheritance ko thể dùng composition để giải quyết được , còn những ngôn ngữ sau này nó phát triển thêm những tính năng mới để phụ vụ tốt hơn cho việc phát triển phần mềm nhưng nếu đó là 1 ngôn ngữ OOP thì không thể loại bỏ tính kế thừa đc…

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?