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

Cách sử dụng mẫu thiết kế chiến lược trong Ruby

Hãy nói về mô hình thiết kế chiến lược!

Mẫu thiết kế này giúp bạn thay đổi thuật toán chính bên trong một phương pháp.

Bạn thực hiện việc này bằng cách chuyển vào một lớp triển khai thuật toán này, thay vì mã hóa cứng vào lớp đó.

Và khi tôi nói thuật toán Ý tôi không phải là một thuật toán khoa học máy tính ưa thích, mà là bất kỳ mã nào tuân theo một trình tự các bước để có được kết quả.

Khi nào sử dụng mẫu chiến lược

Chính xác thì mẫu này đang giải quyết vấn đề gì?

Vấn đề nguyên tắc đóng / mở.

Nguyên tắc này nói rằng:

“Các thực thể phần mềm (lớp, mô-đun, phương thức) phải mở để mở rộng và đóng để sửa đổi.”

Điều này có nghĩa là để làm cho một lớp làm những điều mới, bạn không cần phải thay đổi chính lớp đó. Điều này đồng thời làm cho mã của bạn linh hoạt và mạnh mẽ hơn.

Nhưng làm thế nào để bạn đạt được điều đó?

Sử dụng các mẫu thiết kế như mẫu chiến lược 🙂

Giả sử bạn có ReportGenerator và bạn muốn tạo nhiều loại định dạng báo cáo bằng cách sử dụng cùng một dữ liệu.

Bạn có thể viết một phương thức cho mỗi loại báo cáo, nhưng điều đó có nghĩa là bạn phải thay đổi lớp (bằng cách thêm một phương thức mới) mỗi khi bạn muốn thêm một loại mới, phá vỡ nguyên tắc mở / đóng.

Hoặc thậm chí tệ hơn!

Bạn có thể có một phương thức HUGE duy nhất với tất cả các loại câu lệnh if… Những câu lệnh này thường không kết thúc tốt.

Nhưng điều gì sẽ xảy ra nếu cả lớp không phải biết cách định dạng báo cáo?

Điều gì sẽ xảy ra nếu thuật toán đến từ bên ngoài lớp ?

Sau đó, chúng tôi có thể thay đổi thuật toán định dạng bất cứ khi nào chúng tôi muốn mà không cần thay đổi chính lớp đó.

Điều này giải quyết được vấn đề.

Và đó chính xác là những gì mẫu chiến lược là tất cả về.

Ví dụ về mẫu chiến lược

Chiến lược được thực hiện dưới dạng một lớp với một phương thức duy nhất.

Dưới đây là một số chiến lược định dạng cho ReportGenerator lớp:

require 'json'

module ReportFormatters
  class JSON
    def self.format(data)
      data.to_json
    end
  end

  class PlainText
    def self.format(data)
      data.to_s
    end
  end

  class HTML
    def self.format(data)
      html = ""

      html << "
    " data.each { |product, amount| html << "
  • #{product}: #{amount}
  • " } html << "
" html end end end

Lưu ý cách tất cả các chiến lược triển khai định dạng format phương pháp. Phương thức này sẽ được gọi bởi lớp trình tạo báo cáo.

Đây là mã :

class ReportGenerator
  def self.generate(data, formatter)
    formatter.format(data)
  end
end

data = { onions: 31, potatoes: 24, eggs: 10 }

p ReportGenerator.generate(data, ReportFormatters::HTML)
p ReportGenerator.generate(data, ReportFormatters::JSON)
p ReportGenerator.generate(data, ReportFormatters::PlainText)

Bây giờ:

Nếu bạn muốn thay đổi định dạng đầu ra (từ HTML thành PlainText ) bạn chỉ cần vượt qua một chiến lược khác và nó sẽ hoạt động miễn là chiến lược đó thực hiện định dạng format phương pháp.

Một cách khác để suy nghĩ về mô hình này là bạn đang thuê một nhà tư vấn chuyên về một chiến lược kinh doanh cụ thể, nhà tư vấn sẽ đến & thực hiện chiến lược cho bạn, thì chiến lược này sẽ tạo ra một kết quả cụ thể.

Ngược lại, một mẫu như mẫu trang trí giống như thêm đồ trang trí mới vào cây thông Noel để làm cho nó trở nên hào nhoáng hơn.

Bạn chỉ có thể làm việc với 1 chiến lược tại một thời điểm, nhưng bạn có thể có bao nhiêu đồ trang trí tùy thích.

Video

Tóm tắt

Bạn đã học về mô hình thiết kế chiến lược, hãy sử dụng nó khi bạn cần thay đổi một phần những gì lớp của bạn làm mà không cần phải thay đổi chính lớp đó.

Cảm ơn vì đã đọc!

Đừng quên chia sẻ bài đăng này trên Twitter nếu bạn thấy nó thú vị , nó cũng sẽ giúp nhiều người thích thú hơn 🙂