May 05, 2016

ซ่อน API ที่ซับซ้อนด้วย Builder Pattern

สำหรับตอนนี้ เป็นการเอาเหล้าเก่าในขวดใหม่มาเล่าต่อ สำหรับใครที่เคยเขียนภาษา​ Java หรือ Groovy มาก่อน ก็จะคุ้ยเคยกับคลาสที่ลงท้ายด้วยคำว่า Builder กัน รวมถึงวิธีใช้งานคลาสเหล่านี้ด้วย

ทีนี้ถึงคราวของ Swift บ้าง เรามาลองออกแบบ Builder Class ด้วย Swift อย่างง่ายๆ กัน

บน iOS ก็มี API บางตัวเวลาเราจะใช้งานมันได้ ก็ต้องสร้างนั่นสร้างนี่ 2-3 ขั้นตอน กว่าเราจะรวมร่างให้มันกลายเป็นสิ่งที่เราต้องการได้ ยกตัวอย่างเช่น การแสดง Alert ขึ้นมาบนหน้าจอ ที่เวลาเราจะสร้าง Alert ขึ้นมาสักอัน เราจำเป็นต้องรู้ก่อน ว่าเราจะใช้ UIAlertController สำหรับกำหนด title, message และใช้ UIAlertAction สำหรับสร้างปุ่มบน Alert และ action ที่จะเกิดขึ้นตามมาหลังจากกดปุ่มนั้น พอสร้างเสร็จก็เพิ่มลงไปใน UIAlertController และสุดท้าย ก็สั่งให้ UIViewController แสดง UIAlertController ที่กำหนดค่าเรียบร้อยแล้วขึ้นมาบนหน้าจอให้ User เชยชม

จะเห็นว่าเราต้องรู้จักขั้นตอนต่างๆ เพื่อที่เราจะสร้าง Alert ง่ายๆ ขึ้นมาสักอันหนึ่งตามที่ได้อธิบายไป และในคราวนี้ผมจะยกตัวอย่างการประยุกต์ใช้ Builder Pattern กับการสร้าง Alert ให้ดูกัน


ยกตัวอย่างโค้ดแสดงขั้นตอนการสร้าง Alert ตามที่ได้อธิบายไป ก็คือสร้าง action 3 อัน และนำไปกำหนดค่าลง alert controller ดังนี้



เห็นว่ามีขั้นตอนมากมาย และโค้ดก็ยืดเยื้อ ทีนี้เรามาลองสร้าง Builder ให้โค้ดชุดข้างบนกัน ก็จะได้โค้ดแบบนี้ออกมา พบว่าแต่ละ function จะ return self กลับออกไป เพื่อให้เรา chain เรียก function อื่นๆ ต่อไปได้นั่นเอง



จากนั้นลองสร้าง Alert จาก Builder ที่เราสร้างดูก็จะได้แบบนี้



จะเห็นว่าโค้ดที่ใช้สร้าง Alert นั้นสั้นลงมาก และผู้ใช้ก็ไม่จำเป็นต้องรู้ว่าขั้นตอนในการสร้าง alert นั้นเป็นย่างไร ทีนี้ เราลองสร้าง Alert อีกอัน ที่เหลือแค่ Title และปุ่มกดเพียงปุ่มเดียว ก็จะได้โค้ดแบบนี้



โดยที่เราสามารถสลับการเรียก function ยังไงก็ได้ กำหนดปุ่มก่อน แล้วกำหนด title ทีหลังก็ได้ แต่ต้องจบด้วย function show เสมอ

หวังว่าคงได้ไอเดียนำ pattern นี้ไปใช้กันดูนะ