Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีใช้รูปแบบการออกแบบกลยุทธ์ใน Ruby

มาพูดถึงรูปแบบการออกแบบกลยุทธ์กันเถอะ!

รูปแบบการออกแบบนี้ช่วยให้คุณเปลี่ยนอัลกอริทึมหลักภายในวิธีการได้

คุณทำได้โดยส่งผ่านคลาสที่ใช้อัลกอริทึมนี้ แทนที่จะฮาร์ดโค้ดลงในคลาส

และเมื่อฉันพูด อัลกอริทึม ฉันไม่ได้หมายถึงอัลกอริธึมวิทยาการคอมพิวเตอร์แฟนซี แต่โค้ดใดๆ ที่ทำตามขั้นตอนตามลำดับเพื่อให้ได้ผลลัพธ์

เมื่อใดควรใช้รูปแบบกลยุทธ์

รูปแบบนี้แก้ปัญหาอะไรกันแน่?

ปัญหาหลักการเปิด/ปิด

หลักการนี้กล่าวว่า:

“ซอฟต์แวร์เอนทิตี (คลาส โมดูล เมธอด) ควรเปิดเพื่อขยายและปิดเพื่อแก้ไข”

ซึ่งหมายความว่าเพื่อให้ชั้นเรียนทำสิ่งใหม่ ๆ คุณไม่จำเป็นต้องเปลี่ยนชั้นเรียนเอง ซึ่งจะทำให้โค้ดของคุณมีความยืดหยุ่นและแข็งแกร่งมากขึ้นไปพร้อม ๆ กัน

แต่คุณจะทำอย่างไรให้สำเร็จ?

การใช้รูปแบบการออกแบบ เช่น รูปแบบกลยุทธ์ 🙂

สมมติว่าคุณมี ReportGenerator และคุณต้องการสร้างรูปแบบรายงานหลายประเภทโดยใช้ข้อมูลเดียวกัน

คุณสามารถเขียนวิธีการสำหรับรายงานแต่ละประเภทได้ แต่นั่นหมายความว่าคุณต้องเปลี่ยนชั้นเรียน (โดยการเพิ่มวิธีการใหม่) ทุกครั้งที่คุณต้องการเพิ่มประเภทใหม่ ทำลายหลักการเปิด/ปิด

หรือแย่กว่านั้นอีก!

คุณสามารถมีวิธีการขนาดใหญ่เพียงวิธีเดียวด้วยคำสั่ง if ทุกประเภท… ซึ่งมักจะจบลงได้ไม่ดีนัก

แต่ถ้าชั้นเรียนไม่จำเป็นต้องรู้วิธีจัดรูปแบบรายงานล่ะ

จะเกิดอะไรขึ้นหากอัลกอริทึมมาจาก นอกชั้นเรียน ?

จากนั้นเราสามารถเปลี่ยนอัลกอริทึมการจัดรูปแบบได้ทุกเมื่อที่ต้องการโดยไม่ต้องเปลี่ยนคลาสเอง

วิธีนี้ช่วยแก้ปัญหาได้

และนั่นคือสิ่งที่รูปแบบกลยุทธ์ คือทั้งหมดที่เกี่ยวกับ

ตัวอย่างรูปแบบกลยุทธ์

กลยุทธ์ถูกนำไปใช้ในรูปแบบของคลาสด้วยวิธีเดียว

นี่คือกลยุทธ์การจัดรูปแบบบางส่วนสำหรับ ReportGenerator คลาส:

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

สังเกตว่ากลยุทธ์ทั้งหมดใช้ format กระบวนการ. เมธอดนี้จะถูกเรียกโดยคลาสตัวสร้างรายงาน

นี่คือรหัส :

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)

ตอนนี้:

หากคุณต้องการเปลี่ยนรูปแบบเอาต์พุต (จาก HTML เป็น PlainText ) คุณเพียงแค่ต้องผ่านกลยุทธ์อื่น &มันจะใช้งานได้ตราบใดที่กลยุทธ์ใช้ format วิธีการ

อีกวิธีในการคิดเกี่ยวกับรูปแบบนี้คือ คุณกำลังจ้างที่ปรึกษาที่เชี่ยวชาญในกลยุทธ์ทางธุรกิจเฉพาะ ที่ปรึกษาจะเข้ามา &นำกลยุทธ์ไปใช้ สำหรับคุณแล้ว กลยุทธ์นี้จะให้ผลลัพธ์ที่เฉพาะเจาะจง

ในทางตรงกันข้าม รูปแบบอย่างลวดลายมัณฑนากรก็เหมือนการเพิ่มเครื่องประดับใหม่ให้กับต้นคริสต์มาสเพื่อให้ดูฉูดฉาดยิ่งขึ้น

คุณสามารถทำงานกับกลยุทธ์ได้ครั้งละ 1 กลยุทธ์เท่านั้น แต่คุณสามารถมีเครื่องประดับได้มากเท่าที่คุณต้องการ

วิดีโอ

สรุป

คุณได้เรียนรู้เกี่ยวกับรูปแบบการออกแบบกลยุทธ์แล้ว ใช้เมื่อคุณต้องการเปลี่ยนบางส่วนของสิ่งที่ชั้นเรียนทำโดยไม่ต้องเปลี่ยนชั้นเรียนเอง

ขอบคุณสำหรับการอ่าน!

อย่าลืมแชร์โพสต์นี้ บน Twitter หากคุณพบว่ามัน น่าสนใจ , มันจะช่วยให้คนสนุกมากขึ้นด้วย 🙂