ใน code สำหรับ iOS ที่พัฒนาด้วยภาษา Swift นั้น
พบว่ามีการเขียน code ในรูปแบบ Singleton เยอะมาก ๆ
แน่นอนว่า วิธีการนี้มันมีทั้งข้อดีและข้อเสีย เช่น
พัฒนาได้ง่าย
ใช้งานง่าย
ยากต่อการทดสอบ
ยากต่อการ reuse
state เปลี่ยนได้ตลอด
ขอบเขตการทำงานเป็น global

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

แต่ถ้าเป็น code ที่มีอยู่แล้วละ ?
การจะทำการลบ code เหล่านี้ทิ้ง
น่าจะเป็นงานช้างแน่ ๆ
ดังนั้นเรามาหาวิธีการอยู่กับ Singleton กันเถอะ
นั่นคือการ refactor code นั่นเอง
มาเริ่มกันเลย

ถ้าไปดูใน code ต่าง ๆ ของ Apple จะพบว่า Singleton มีอยู่ทุกหนแห่ง

เช่น

  • UIApplication
  • NotificationCenter
  • UserDefaults
  • URLSession
  • NSTimeZone

แสดงว่ามันก็มีข้อดีเยอะมาก ๆ นะ
แต่เรานั่นเองที่มักนำมาใช้งานแบบผิด ๆ ดังนี้

เมื่อเรานำสิ่งต่าง ๆ เหล่านี้มาใช้งาน

จะมี code ในรูปแบบนี้

จาก code นี้มีปัญหาอะไรบ้าง ?
ถ้าต้องการแก้ไขอะไร น่าจะลำบากมากขึ้นเรื่อย ๆ ตามจำนวน code
ถ้าต้องการทดสอบก็ยากต่อการจำลอง
นับวันยิ่งซับซ้อน !!

ดังนั้นมาทำการปรับปรุง code ให้ดีขึ้นกันหน่อย

วิธีการที่ง่าย ๆ คือ Dependency Injection (DI)

นั่นคือ ผู้เรียกใช้งานทำการส่ง object ที่ทางผู้ถูกเรียกต้องการเข้ามา
จากตัวอย่างนั้นสิ่งที่ต้องส่งเข้ามาประกอบไปด้วย

  • UserDefaults
  • URLSession

ดังนั้นอาจจะทำการสร้าง constructor เพื่อรับค่าต่าง ๆ เหล่านี้
แสดงดัง code

ข้อดีของวิธีนี้ก็คือ
ผู้เรียกใช้งานสามารถส่ง object ที่ต้องการมาได้เลย
ขอให้เป็นชนิดเดียวกันเท่านั้น
ดังนั้น จึงง่ายต่อการทดสอบ
และลดปัญหาของ Singleton ลงไปได้ (ถึงแม้ object ที่ส่งมาจะเป็น singleton ก็ตาม)

ปัญหาที่เกิดขึ้นคือ ส่วนที่เรียกใช้งาน ExampleViewController อยู่แล้ว !!

นั่นคือ compile ไม่ผ่านอย่างแน่นอน
เพราะว่าเราได้เปลี่ยนวิธีการไปจากเดิมโดยสิ้นเชิง
จากเดิมที่สร้าง object ด้วย default constructor
มาเป็น constructor ที่มี argument 3 ตัว

ซึ่งนั่นหมายความว่า
เราทำการ refactor code โดยไม่สนใจใครเลย
เป็นสิ่งที่ไม่ดีอย่างมาก
และขัดแย้งกับแนวคิดของการ refactor code อย่างมาก
นั่นคือ

Easy to change, but difficult to break

ปัญหานี้สามารถแก้ไขง่าย ๆ ด้วย Default parameter value นั่นเอง

น่าจะทำให้การเขียน code สนุกขึ้น
คำถามที่น่าสนใจคือ เราทำการ refactor code กันบ่อยเพียงใด ?

คำแนะนำสำหรับการพัฒนาคือ

Go slow and steady and keep shipping