Các nguyên tắc cơ bản của OOP: Thành phần (Thiết kế)
Khi thiết kế chương trình sử dụng OOP, có một vấn đề là tìm cách chia thành các lớp và quan hệ giữa chúng sao cho tối ưu (theo một số đặc điểm nhất định). Thuật ngữ "thành phần" có thể mang tính mơ hồ và thường được sử dụng với nhiều ý nghĩa khác nhau, bao gồm một trong những trường hợp đặc biệt của việc "tạo thành" các lớp. Phần giải thích này là cần thiết vì khi đọc các tài liệu tin học khác, bạn có thể gặp các cách diễn giải khác nhau về thuật ngữ "thành phần": cả theo nghĩa tổng quát lẫn nghĩa hẹp hơn. Chúng ta sẽ cố gắng giải thích khái niệm này, chỉ rõ ý nghĩa của các thuật ngữ trong từng trường hợp (khi nó ám chỉ việc phát triển "thiết kế/dự án" chung của giao diện phần mềm, và khi nó ám chỉ "tổng hợp thành phần").
Vậy, như chúng ta biết, lớp bao gồm các trường (thuộc tính) và phương thức. Các thuộc tính, đến lượt mình, có thể được mô tả bởi các kiểu tùy chỉnh, tức là chúng có thể là đối tượng của một lớp khác. Có một số cách để liên kết logic các đối tượng này:
Composition
(bao gồm hoàn toàn hoặc tổng hợp thành phần) của các đối tượng-trường vào một đối tượng sở hữu. Quan hệ của các đối tượng này được mô tả bằng mối quan hệ "toàn phần-phần tử", và phần tử không thể tồn tại ngoài toàn phần. Đối tượng sở hữu được cho là "có một" đối tượng thuộc tính, và đối tượng thuộc tính là "một phần của" đối tượng sở hữu. Đối tượng sở hữu tạo ra và hủy bỏ các phần của nó. Việc xóa đối tượng sở hữu sẽ loại bỏ tất cả các phần của nó; đối tượng sở hữu không thể tồn tại mà không có các phần.Aggregation
của các đối tượng-trường bởi đối tượng sở hữu là một kiểu bao gồm "mềm hơn". Mặc dù quan hệ cũng được mô tả là "toàn phần-phần tử", nhưng đối tượng sở hữu chỉ chứa các tham chiếu đến các phần, những phần này có thể được gán, thay đổi và tồn tại độc lập với toàn phần. Hơn nữa, một phần có thể được sử dụng trong nhiều "chủ sở hữu".Association
, tức là một kết nối một chiều hoặc hai chiều giữa các đối tượng độc lập, mang ý nghĩa ứng dụng tùy ý; một đối tượng được cho là "sử dụng" một đối tượng khác.
Một loại quan hệ khác cần ghi nhớ là "là một", đã được thảo luận trước đó trong phần kế thừa.
Ví dụ về bao gồm hoàn toàn là một chiếc xe hơi và động cơ của nó. Ở đây, xe hơi được hiểu là một phương tiện giao thông hoàn chỉnh. Không có động cơ thì không được như vậy. Và một động cơ cụ thể chỉ thuộc về một chiếc xe tại một thời điểm. Các tình huống khi chiếc xe chưa có động cơ (tại nhà máy) hoặc không còn động cơ (tại xưởng sửa xe) tương đương với việc chúng ta đã phá vỡ mã nguồn của chương trình.
Ví dụ về tổng hợp là việc tổ chức các nhóm sinh viên cho việc học các khóa học nhất định: một nhóm cho mỗi khóa học bao gồm nhiều sinh viên, và bất kỳ ai trong số họ cũng có thể thuộc về các nhóm khác (nếu tham gia nhiều môn học). Nhóm "có" các người nghe. Việc một sinh viên rời nhóm không ảnh hưởng đến quá trình học tập của nhóm (những người còn lại vẫn tiếp tục học).
Cuối cùng, để minh họa ý tưởng về liên kết, hãy xem xét một máy tính và một máy in. Chúng ta có thể nói rằng máy tính sử dụng máy in để in. Máy in có thể được bật hoặc tắt theo nhu cầu, và cùng một máy in có thể được sử dụng từ nhiều máy tính khác nhau. Tất cả máy tính và máy in tồn tại độc lập với nhau nhưng có thể được chia sẻ.
Về các đặc điểm thường được dùng để định hướng thiết kế lớp, những đặc điểm nổi tiếng nhất bao gồm:
DRY (Don't Repeat Yourself)
— thay vào đó, hãy chuyển các phần chung vào các lớp cha (có thể là trừu tượng).SRP (Single Responsibility Principle)
— một lớp nên thực hiện một nhiệm vụ duy nhất, và nếu không phải như vậy, bạn cần chia nó thành các lớp nhỏ hơn.OCP (Open-Closed Principle)
— "viết mã mở cho việc mở rộng nhưng đóng cho việc sửa đổi". Nếu nhiều tùy chọn tính toán được mã hóa cứng trong lớp X và có thể xuất hiện thêm các tùy chọn mới, hãy tạo một lớp cơ sở (trừu tượng) cho tính toán riêng biệt và tạo các tùy chọn cụ thể ("mở rộng" chức năng) dựa trên nó, kết nối với lớp X mà không cần sửa đổi nó.
Đây chỉ là một vài trong số các thực hành tốt nhất về thiết kế lớp. Sau khi nắm vững các kiến thức cơ bản về OOP trong phạm vi cuốn sách này, có thể hữu ích khi xem xét các nguồn thông tin chuyên sâu khác về chủ đề này, vì chúng cung cấp các giải pháp sẵn có cho việc phân tách đối tượng trong nhiều tình huống phổ biến.