Hai trong những nguyên tắc hướng đối tượng quan trọng nhất là cohesion (sự gắn kết) & coupling (sự phụ thuộc).
Cohesion là về mối quan hệ giữa tất cả các phương thức bên trong một class. Chúng có sử dụng cùng một tập biến instance & tham số, đều cùng làm việc hướng tới cùng mục tiêu không? Hay mỗi phương thức cảm thấy tách biệt với nhau?
Coupling là mức độ một class phụ thuộc vào các class khác, nó “liên kết” như thế nào với phần còn lại của hệ thống, và khả năng class này có thể được sử dụng độc lập.

Cả hai khái niệm này giúp bạn nhìn thấy mọi class trong codebase của bạn qua một bộ kính cụ thể. Những bộ kính này giúp bạn tìm ra thiết kế class của bạn có chắc chắn không & nơi bạn có thể thực hiện một số thay đổi.
Để có kết quả tốt nhất, bạn nên nhắm tới high cohesion (cohesion cao) & low coupling (coupling thấp).
Ví dụ về Cohesion
Low cohesion giống như có topping lạ trên pizza, trong khi high cohesion cảm thấy mọi thứ đều ở đúng chỗ.
Bạn có thể cảm nhận được, nhưng khó đo lường, bạn không thể chỉ lấy một con số cho biết class của bạn cohesive đến đâu. Vì vậy để làm cho nó dễ hiểu tôi muốn chỉ cho bạn ví dụ mã nơi nó thực sự rõ ràng.
Đây bạn:
class Library def lend_book end def return_book end def make_coffee end end
Trong ví dụ này make_coffee nổi bật khá nhiều, ngay cả khi thư viện này có quán cà phê, nó cũng không có lý do gì để class Library pha cà phê 🙂
Quán cà phê không cần bất kỳ thông tin nào về sách nó có, cách mượn sách, v.v.
Và thư viện không cần biết còn bao nhiêu cà phê hay cách pha nó.
Đó chính là ý nghĩa của LOW cohesion.
Tất nhiên:
Điều này không luôn rõ ràng như vậy, đôi khi bạn cần chú ý & nhìn xa hơn tên phương thức.
- Các phương thức này thực sự đang làm gì?
- Chúng đang làm việc với dữ liệu gì?
- Chúng đang cộng tác với đối tượng nào?
Những câu hỏi này sẽ cho bạn ý tưởng về mức độ cohesion của class bạn.
Làm thế nào để sửa low cohesion?
Bạn sẽ cần trích xuất các phương thức không thuộc về class này sang class khác, thường là một class mới.
Ví dụ về Coupling
Bây giờ hãy xem coupling.
Đây là ví dụ:
class ShoppingCart
attr_accessor :items
def initialize
@items = []
end
end
class Order
def process_order(cart)
cart.items.map(&:price).inject(:+)
end
end
Trong ví dụ này Order highly coupled (phụ thuộc cao) với ShoppingCart vì nó biết quá nhiều về nó, nó biết có biến items & nó đang làm một số tính toán với nó.
Bây giờ nếu bạn thay đổi triển khai items của ShoppingCart, bạn cũng sẽ phải thay đổi Order.
Không tốt!
Chúng ta có thể sửa như sau:
class ShoppingCart
attr_accessor :items
def initialize
@items = []
end
def calculate_total
items.map(&:price).inject(:+)
end
end
class Order
def process_order(cart)
cart.calculate_total
end
end
Chúng ta đã giảm coupling bằng cách di chuyển chi tiết tính toán đến nơi nó thuộc về.
Nếu bạn cần ẩn dụ cho điều này, hãy nghĩ về những điện thoại đi kèm pin cố định, đó là high coupling.
Nếu bạn có thể thay pin thì đó là low coupling.
Lưu ý rằng bạn vẫn cần một mức độ coupling nào đó, điện thoại không hoạt động nếu không có pin & class Order không hoạt động nếu không biết phải thu bao nhiêu từ khách hàng.
Tóm tắt
Bạn đã học về hai nguyên tắc OOP rất quan trọng, cohesion & coupling. Hai khái niệm này giúp bạn tìm ra các phương thức trong class làm việc cùng nhau như thế nào & class của bạn độc lập như thế nào so với phần còn lại của hệ thống.
Bạn có thể áp dụng ngay bây giờ cho một dự án của bạn, mở nó lên & xem một số class của bạn. Làm thế nào bạn có thể cải thiện chúng bằng những gì bạn vừa học?
Cảm ơn bạn đã đọc! Đừng quên chia sẻ & đăng ký bản tin nếu bạn chưa đăng ký 🙂