Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Nâng cao mã Ruby: Thành thạo Cohesion & Coupling cho thiết kế OOP sạch hơn

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.

Nâng cao mã Ruby: Thành thạo Cohesion & Coupling cho thiết kế OOP sạch hơn

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ý 🙂