Keep Swift Models and Classes Clean through Extension

วันนี้จะมาแนะนำเทคนิคเล็กๆ น้อยๆ บน Swift ที่ทำให้ Model, Controller เรามันสะอาดขึ้นอีกนิดนึง :) ไม่ต้องอธิบายกันยาว ไปดูตัวอย่างกันเลยครับ


Version 1.0:

Model ของ OozouMember ประกอบด้วย property 3 ตัวคือ ชื่อ ตำแหน่ง และรูปประจำตัว แล้วถ้าเราต้องการแสดงข้อมูลทั้งหมดล่ะ ? ง่ายๆ เนอะ จะสร้าง function ใหม่ก็ได้ หรือจะ override description property ก็ได้ (Printable Protocol) แบบนี้


Version 2.0:

เห็นอะไรแปลกๆ ไหม ? ถ้าเริ่มมีฟังก์ชั่นที่ต้องใช้งานเยอะขึ้น เยอะขึ้น ก็จะเริ่มอ่านไม่รู้เรื่องแล้วใช่ไหม แล้วจะทำยังไงดี ? จะสร้าง Class ที่เอาไว้แสดง Property เลยไหม ที่พอส่ง Object ใดๆ ไปก็จะแสดงทั้งหมด ไม่ดีหรอก การสร้าง Class เพื่อ Logic เล็กๆ พวกนั้นทำให้ Project ของเราดูยุ่งยากและบวมโดยใช่เหตุ หรือว่าจะใส่ไว้ใน Controller (M-V-C) ดีล่ะ ? ก็ดีนะ แต่ Controller ยากต่อการนำไปใช้ซ้ำน่ะสิ (reuse) เวลาเขียนโค้ดเราควรจะเดินตามหลักการ DRY (Don't Repeat Yourself) ใช่ไหม ? ลองแก้ปัญหาด้วย Extension ไหม ?


Version 3.0

Extension คือสิ่งเดียวกับ Category บน Objective-C นั่นแหละ แต่เราจะใช้ในแนวทางของการแยก Logic ของ Model ออกมาจากตัว Model แน่นอนว่าการทำแบบนี้เราสามารถใช้ฟังก์ชั่นที่เขียนขึ้นมา ซ้ำที่ใดก็ได้ใน Module เดียวกันอีกด้วย

อีกตัวอย่างหนึ่งก็คือการทำ Protocol Conformance
ซึ่งจะทำกับ Module หรือ Controller ก็ได้ ผมจะยกตัวอย่างใน Controller นะ เพราะน่าจะเจอกันบ่อยกว่า
แทนที่จะ Override Delegate method ใส่ลงใน Controller ตรงๆ ก็ทำผ่าน Extension แทน เช่น ผมมี TeamViewController อยู่ ซึ่งตรงนี้จะมีหน้าจัดการ Property และ View Controller Life Cycle (viewDidLoad, viewWillAppear) เท่านั้น


และถ้าจะต้อง Conform Protocol ใดๆ ก็แยกออกมาเป็น Extension แบบนี้


หรือถ้า Controller ตัวไหนต้อง Conform หลายๆ อัน แต่ละอันไม่เกี่ยวข้องกัน ก็แยกมันให้หมดเลยครับ อย่าลืมใส่ MARK: ไว้หน่อยนะ จะได้กระโดดผ่าน Jump Bar ได้ง่ายๆ (แต่แยกแบบนี้ก็พออ่านง่ายแล้วล่ะ)


เท่านี้ก็จะพอเห็นภาพแล้วล่ะเนอะ ตอนแรกที่พบวิธีนี้ใหม่ๆ นั้น (Xcode 6.0.1) มีปัญหาเนื่องจาก Autocomplete ไม่ทำงานตอนอยู่ใน Scope ของ Extension แต่ Bug นั้นผม Report ไปแล้วถูกแก้ใน Xcode 6.1 แล้วล่ะ (น่าจะมีหลายคน Request นะ)

Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android