Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Swift] มาทำการ refactor code พวก Singleton กันหน่อย

$
0
0

ใน 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
ดังนั้นอาจจะทำการสร้าง constructor เพื่อรับค่าต่าง ๆ เหล่านี้ แสดงดัง code [gist id="fe7f5c6919ce75aaea012524efa496f5" file="ExampleViewController02.swift"] ข้อดีของวิธีนี้ก็คือ ผู้เรียกใช้งานสามารถส่ง 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 นั่นเอง [gist id="fe7f5c6919ce75aaea012524efa496f5" file="ExampleViewController03.swift"] น่าจะทำให้การเขียน code สนุกขึ้น คำถามที่น่าสนใจคือ เราทำการ refactor code กันบ่อยเพียงใด ? คำแนะนำสำหรับการพัฒนาคือ
Go slow and steady and keep shipping

Viewing all articles
Browse latest Browse all 1997

Trending Articles