Screen Shot 2558-10-22 at 2.02.07 PM
ช่วงนี้เห็น code ในรูปแบบของ Singleton Pattern บ่อยมาก ๆ
บางครั้งมันถูกใช้เยอะมากเกินไป
โดยแบบไร้ซึ่งเหตุผลที่เหมาะสม
ทำให้เกิด Singleton Bubble/Overuse หรือ ใช้งานมากจนเกินไป

ดังนั้นจึงกลับไปอ่านหนังสือ Design Pattern ของ Gang Of Four (GoF) กันหน่อย
รวมทั้งไปอ่านบทความเรื่อง The Little Singleton Pattern ของคุณ Robert C. Martin
ซึ่งทำให้เห็นเหตุผลของการนำ Singleton pattern มาใช้งาน

จากบทความเริ่มต้นด้วยรูปแบบของการใช้งาน Singleton pattern

มี code ดังนี้

คำอธิบาย

  • Constructor จะเป็น private เนื่องจากไม่ต้องการให้ผู้ใช้งานสร้าง instance ได้
  • มี static method ชื่อว่า instance เอาไว้สำหรับให้ผู้ใช้งาน เพื่อทำให้มั่นใจว่าจะมีเพียง instance เดียวเท่านั้น

แต่เราไม่ควรใช้บ่อยนะ ทำไมล่ะ ?

ก็มันทำให้เราทดสอบระบบยากไงล่ะ !!
ก็มันทำให้เรารวมการทำงานต่าง ๆ ไว้ที่นี่
สุดท้าย กลายเป็น code ที่เรียกว่า Manager, Utility, Factory, Formatter และ Service หรือ Bus เป็นต้น
ทำให้เกิดความซับซ้อนมากขึ้นไปอีก !!

มันยากยังไงล่ะ ?

เราจะทำการ mock object ของ Singleton อย่างไรล่ะ มันทำไม่ได้นะ !!
ที่สำคัญ เราไม่สามารถแตะต้องตัวแปร instance ได้เลย
เนื่องจากว่ามันคือ private

บางคนอาจจะบอกว่า

ก็เปลี่ยนไป public สิ !!
ใคร ๆ ก็ใช้ได้แล้วไงล่ะ

แต่บางคนอาจจะมาทำการแก้ไข หรือ เขียนข้อมูลทับนะสิ !!
แสดงว่า คุณไม่ไว้ใจทีมใช่ไหม ?
แสดงว่า มีบางคนที่คุณไม่ไว้ใจใช่ไหม ?

ดังนั้นการเปลี่ยนเป็น public มันทำให้ทดสอบได้นะ แต่มันใช่สิ่งที่คุณต้องการหรอ ?

เราต้องการใช้ Singleton pattern เพื่ออะไร ?

ต้องตอบคำถามนี้ให้ได้ก่อนนะ
และตอบด้วยเหตุ และ ผล ที่สมเหตุสมผล

ไม่ใช่ ใช้เพราะว่า เขาบอกว่าดี
ไม่ใช่ ใช้เพราะว่า เป็น design pattern ที่ดี
ไม่ใช่ ใช้เพราะว่า ลอกมา
ไม่ใช่ ใช้เพราะว่า ทำตาม ๆ กันมา
ไม่ใช่ ใช้เพราะว่า คุณไม่ไว้ใจคนอื่น ๆ ในทีม

ยิ่งถ้าเป็น code ที่ใช้งานกันภายในทีมแล้ว
เรื่องของ Singleton pattern มันน่าจะน้อยมาก ๆ เลยนะ
เพียงใช้ static method ก็พอแล้วมั้ง !!

แต่ถ้าเป็น Pulbic API ก็ว่าไปอย่าง
ซึ่งต้องให้คนข้างนอกใช้งาน code
ดังนั้นเราต้องการให้มีเพียง instance เดียวเท่านั้น
เหตุผลนี้เข้าท่า และ เพียงพอต่อการใช้งานนะ

คุณล่ะ คิดว่า อย่างไรกับการใช้งาน Singleton Pattern ?