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

วิธีใช้รูปแบบซิงเกิลตันในทับทิม (และทำไมคุณควรหลีกเลี่ยง)

คุณเคยต้องการสร้างคลาสที่มีเพียงอินสแตนซ์เดียวเท่านั้นหรือไม่

ใช่? ไม่? อาจจะ?

ก็…

นั่นคือสิ่งที่รูปแบบซิงเกิลตัน คือ.

ไม่มีปัญหากับสิ่งนั้น

แต่บางคนเรียกสิ่งนี้ว่าการต่อต้านรูปแบบเพราะสามารถใช้เป็นข้ออ้างสำหรับการออกแบบที่ไม่ดีได้

มาดูตัวอย่างโค้ดเพื่อเรียนรู้วิธีใช้งาน

ตัวอย่างโค้ดรูปแบบซิงเกิลตัน

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

ตามนี้ :

  • คุณสร้าง new วิธีการส่วนตัว
  • คุณกำหนดวิธีการเรียนชื่อ instance ที่ส่งคืนอินสแตนซ์เฉพาะสำหรับคลาส

เนื่องจากเป็นรูปแบบการออกแบบยอดนิยม ไลบรารีมาตรฐาน Ruby จึงมาพร้อมกับ Singleton โมดูลที่คุณสามารถรวมไว้ในชั้นเรียนใดก็ได้

หน้าตาเป็นแบบนี้ :

require 'singleton'

class Shop
  include Singleton
end

ตอนนี้ถ้าคุณพยายามสร้าง Shop วัตถุที่มี Shop.new คุณจะเห็นสิ่งนี้:

Shop.new
# NoMethodError: private method `new' called for Shop:Class

และถ้าอยากได้ Shop . ที่เดียวเท่านั้น วัตถุที่คุณสามารถใช้ instance วิธีการ:

Shop.instance.object_id

# 5659218

Shop.instance.object_id

# 5659218

คุณสามารถบอกได้ว่ามันเป็นวัตถุเดียวกันเสมอเพราะ object_id ไม่เปลี่ยนแปลง

สิ่งที่คุณต้องจำไว้ :

นี่เป็นรูปแบบที่เรียบง่าย โดยจำกัดการสร้างวัตถุไว้ที่ 1 รายการ และคุณสามารถขอวัตถุนั้นได้ทุกเมื่อที่ต้องการ

ทำไมคุณไม่ควรใช้รูปแบบนี้

รูปแบบซิงเกิลตันมักเป็นข้ออ้างที่จะมีรูปแบบของตัวแปรส่วนกลางบางรูปแบบ และเรารู้ว่าตัวแปรส่วนกลางไม่ดีเพราะคุณไม่สามารถควบคุมได้ ทำให้การทดสอบยากขึ้นและสามารถเพิ่มการมีเพศสัมพันธ์ได้

“ปัญหาที่แท้จริงของ Singletons คือพวกเขาให้ข้อแก้ตัวที่ดีกับคุณที่จะไม่คิดอย่างรอบคอบเกี่ยวกับการมองเห็นที่เหมาะสมของวัตถุ” – เคนท์ เบ็ค

ลองนึกภาพการมีออบเจ็กต์ที่คลาสส่วนใหญ่ของคุณพึ่งพา นั่นคือสิ่งที่รูปแบบซิงเกิลตันสามารถเป็นได้ ขอให้โชคดีในการปรับโครงสร้างใหม่!

ตอนนี้ :

มีประโยชน์สำหรับรูปแบบนี้หรือไม่

การค้นหาบน Github เปิด repos บางส่วนโดยใช้รูปแบบ Singleton ร่วมกับรูปแบบวัตถุ Null

ฉันเดาว่ามันสมเหตุสมผลแล้ว Rails ใช้สิ่งนี้เป็นส่วนหนึ่งของ ActionPack

นี่คือรหัส :

class AllType < Type
  include Singleton

  def initialize
    super "*/*", :all
  end

  def all?; true; end
  def html?; true; end
end

นี่คือคลาสที่สืบทอดมาจาก Type .

เมื่อคุณสร้าง AllType วัตถุผ่าน instance เมธอด มันจะเรียก super &ส่งคืนอ็อบเจ็กต์

ทุกครั้งที่โทร instance หลังจากนั้นคุณจะได้ของเดิม

โดยสรุป :

ใช่ รูปแบบนี้อาจมีประโยชน์ในสถานการณ์ที่เหมาะสม แต่คุณไม่ต้องการใช้รูปแบบนี้โดยไม่ได้คิดมาก

วิดีโอ

สรุป

คุณได้เรียนรู้เกี่ยวกับรูปแบบการออกแบบซิงเกิลตัน วิธีนำไปใช้ใน Ruby และเหตุผลที่คุณควรหลีกเลี่ยงเป็นส่วนใหญ่

คุณคิดอย่างไรเกี่ยวกับรูปแบบนี้? คุณเคยเห็นมันมาก่อนหรือไม่? แจ้งให้เราทราบในความคิดเห็น 🙂

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