Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách cải thiện đáng kể mã Ruby của bạn với các nguyên tắc cơ bản của OOP

Hai trong số các nguyên tắc hướng đối tượng quan trọng nhất là gắn kết và khớp nối.

Sự liên kết là về mối quan hệ giữa tất cả các phương thức bên trong một lớp. Họ có đang sử dụng cùng một tập hợp các biến và tham số phiên bản không, tất cả đều hoạt động cùng nhau để hướng tới cùng một mục tiêu ? Hay mọi phương pháp đều tách biệt với nhau?

Khớp nối là lớp phụ thuộc vào các lớp khác như thế nào, nó “gắn kết với nhau” như thế nào với phần còn lại của hệ thống và khả năng sử dụng riêng biệt của lớp này.

Cách cải thiện đáng kể mã Ruby của bạn với các nguyên tắc cơ bản của OOP

Cả hai khái niệm này đều giúp bạn nhìn thấy mọi lớp trong cơ sở mã của mình thông qua một bộ thấu kính cụ thể. Những ống kính này giúp bạn tìm ra thiết kế đẳng cấp của mình chắc chắn như thế nào và bạn có thể thực hiện một số thay đổi ở đâu.

Để có kết quả tốt nhất, bạn muốn gắn kết cao & khớp nối thấp .

Ví dụ về sự gắn kết

Tính liên kết thấp giống như có một lớp phủ bất thường trên bánh pizza của bạn, trong khi sự gắn kết cao cho cảm giác như mọi thứ đều ở đúng vị trí của nó.

Bạn có thể cảm nhận được điều đó, nhưng rất khó để đo lường, bạn không thể chỉ có một con số cho bạn biết lớp học của bạn gắn kết đến mức nào. Vì vậy, để làm cho nó dễ hiểu Tôi muốn cho bạn xem một ví dụ mã mà nó thực sự rõ ràng.

Của bạn đây:

class Library
  def lend_book
  end

  def return_book
  end

  def make_coffee
  end
end

Trong ví dụ này make_coffee khá nổi bật, ngay cả khi thư viện này có nhà ăn thì điều đó không có ý nghĩa gì đối với Library lớp học pha cà phê 🙂

Căn tin không cần bất kỳ thông tin nào về sách, cách cho mượn sách, v.v.

Và thư viện không cần biết lượng cà phê còn lại hay cách pha cà phê.

Đó là những gì chúng tôi muốn nói đến sự gắn kết THẤP.

Tất nhiên :

Không phải lúc nào điều này cũng hiển nhiên, đôi khi bạn cần chú ý &nhìn xa hơn các tên phương thức.

  • Những phương pháp này thực sự đang làm gì?
  • Họ đang làm việc với dữ liệu nào?
  • Họ đang cộng tác với những đối tượng nào?

Những câu hỏi này sẽ cung cấp cho bạn ý tưởng về mức độ gắn kết của lớp học của bạn.

Làm cách nào để khắc phục tính liên kết thấp?

Bạn sẽ cần trích xuất các phương thức không thuộc lớp này sang lớp khác, thường là một phương thức mới.

Ví dụ về ghép nối

Bây giờ chúng ta hãy xem xét khớp nối.

Đâ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 rất được kết hợp với ShoppingCart bởi vì nó biết quá nhiều về nó, nó biết có một items biến &nó đang thực hiện một số phép tính với điều đó.

Bây giờ nếu bạn thay đổi ShoppingCart Triển khai của items , bạn cũng sẽ phải thay đổi Order .

Không tốt!

Chúng tôi có thể khắc phục sự cố như thế này :

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 tôi đã giảm khớp nối bằng cách di chuyển các chi tiết của phép tính đến nơi chúng thuộc về.

Nếu bạn cần một phép ẩn dụ cho điều này, hãy nghĩ về những điện thoại di động có pin cố định này, đó là khớp nối cao .

Nếu bạn có thể thay pin thì đó là khớp nối kém .

Lưu ý rằng bạn vẫn cần một số mức độ ghép nối, điện thoại sẽ không hoạt động nếu không có pin &Order lớp học sẽ không hoạt động nếu không biết phải tính phí khách hàng là bao nhiêu.

Tóm tắt

Bạn đã học về hai nguyên tắc OOP rất quan trọng, sự gắn kết và sự kết hợp. Hai khái niệm này giúp bạn tìm ra cách các phương thức trong một lớp hoạt động cùng nhau và lớp của bạn độc lập với phần còn lại của hệ thống như thế nào.

Bạn có thể áp dụng điều này ngay bây giờ cho một trong các dự án của mình, mở nó ra và xem một số lớp học của bạn . Làm thế nào bạn có thể cải thiện chúng bằng cách sử dụng những gì bạn vừa học được?

Cảm ơn vì đã đọc! Đừng quên chia sẻ &đăng ký nhận bản tin nếu bạn chưa đăng ký 🙂