ใน code สำหรับ iOS ที่พัฒนาด้วยภาษา Swift นั้น
พบว่ามีการเขียน code ในรูปแบบ Singleton เยอะมาก ๆ
แน่นอนว่า วิธีการนี้มันมีทั้งข้อดีและข้อเสีย เช่น
พัฒนาได้ง่าย
ใช้งานง่าย
ยากต่อการทดสอบ
ยากต่อการ reuse
state เปลี่ยนได้ตลอด
ขอบเขตการทำงานเป็น global
ไป ๆ มา ๆ ข้อเสียเยอะนะเนี่ย !!
ดังนั้นจึงเป็นเหตุผลว่า
ทำไมควร ลด ละ เลิก
หรือถ้าต้องการใช้งานจริง ๆ ก็ควรระมัดระวังให้มากเข้าไว้
แต่ถ้าเป็น code ที่มีอยู่แล้วละ ?
การจะทำการลบ code เหล่านี้ทิ้ง
น่าจะเป็นงานช้างแน่ ๆ
ดังนั้นเรามาหาวิธีการอยู่กับ Singleton กันเถอะ
นั่นคือการ refactor code นั่นเอง
มาเริ่มกันเลย
ถ้าไปดูใน code ต่าง ๆ ของ Apple จะพบว่า Singleton มีอยู่ทุกหนแห่ง
เช่น- UIApplication
- NotificationCenter
- UserDefaults
- URLSession
- NSTimeZone
เมื่อเรานำสิ่งต่าง ๆ เหล่านี้มาใช้งาน
จะมี code ในรูปแบบนี้ [gist id="fe7f5c6919ce75aaea012524efa496f5" file="ExampleViewController.swift"] จาก code นี้มีปัญหาอะไรบ้าง ? ถ้าต้องการแก้ไขอะไร น่าจะลำบากมากขึ้นเรื่อย ๆ ตามจำนวน code ถ้าต้องการทดสอบก็ยากต่อการจำลอง นับวันยิ่งซับซ้อน !!ดังนั้นมาทำการปรับปรุง code ให้ดีขึ้นกันหน่อย
วิธีการที่ง่าย ๆ คือ Dependency Injection (DI)
นั่นคือ ผู้เรียกใช้งานทำการส่ง object ที่ทางผู้ถูกเรียกต้องการเข้ามา จากตัวอย่างนั้นสิ่งที่ต้องส่งเข้ามาประกอบไปด้วย- UserDefaults
- URLSession
ปัญหาที่เกิดขึ้นคือ ส่วนที่เรียกใช้งาน ExampleViewController อยู่แล้ว !!
นั่นคือ compile ไม่ผ่านอย่างแน่นอน เพราะว่าเราได้เปลี่ยนวิธีการไปจากเดิมโดยสิ้นเชิง จากเดิมที่สร้าง object ด้วย default constructor มาเป็น constructor ที่มี argument 3 ตัว ซึ่งนั่นหมายความว่า เราทำการ refactor code โดยไม่สนใจใครเลย เป็นสิ่งที่ไม่ดีอย่างมาก และขัดแย้งกับแนวคิดของการ refactor code อย่างมาก นั่นคือEasy to change, but difficult to breakปัญหานี้สามารถแก้ไขง่าย ๆ ด้วย Default parameter value นั่นเอง [gist id="fe7f5c6919ce75aaea012524efa496f5" file="ExampleViewController03.swift"] น่าจะทำให้การเขียน code สนุกขึ้น คำถามที่น่าสนใจคือ เราทำการ refactor code กันบ่อยเพียงใด ? คำแนะนำสำหรับการพัฒนาคือ
Go slow and steady and keep shipping