Composition over Inheritance trong Java: Từ Effective Java Item 18 đến Kiến trúc Backend Linh hoạt
I. Mở đầu: Bài toán Tái sử dụng Mã nguồn trong Java Trong kỹ nghệ phần mềm hướng đối tượng (OOP) với Java, tái sử dụng mã nguồn và kiểm soát độ phức tạp kiến trúc luôn là bài toán sống còn. Đứng trước yêu cầu thiết kế một tính năng mới, các kỹ sư phần mềm thường cân nhắc giữa hai cơ chế cốt lõi: mở rộng phân cấp lớp thông qua từ khóa extends hoặc liên kết các thành phần độc lập thông qua tham chiếu thuộc tính. Để ánh xạ thế giới thực vào mã nguồn, kiến trúc Java hiện đại xoay quanh ba góc nhìn tư duy: Kế thừa (Implementation Inheritance) — Quan hệ “Is-A” (Là một): Xác định bản chất phân cấp của đối tượng thông qua lớp cơ sở (Superclass) và lớp dẫn xuất (Subclass). Thành phần (Object Composition) — Quan hệ “Has-A” (Có một): Nhúng các tham chiếu đối tượng làm thuộc tính private bên trong một lớp để ủy quyền và tận dụng chức năng của chúng. Giao diện (Interface / Subtyping) — Quan hệ “Can-Do” (Có thể làm gì): Khai báo các bản hợp đồng hành vi (behavioral contracts) qua interface, […] Nguồ...