ในการ coding นั้นเรื่องของ copy-and-paste
รวมทั้ง code ที่ต้องเขียนซ้ำไปซ้ำมา
บางครั้งเป็น code ที่ไม่ควรจะต้องมี
แต่ด้วยโครงสร้างของภาษาก็จำเป็นต้องเขียน
ทำให้เสียเวลาในการพัฒนาระบบไปอย่างมาก
นั่นแสดงว่าเราได้ปฏิบัติตัวขัดแย้งกับ DRY principle อย่างมาก
DRY ย่อมาจาก Don’t Repeat Yourself
ดังนั้นเรามา ลด ละ เลิก กันบ้างแถอะ
หนึ่งในนั้นคือ การ generate code จาก template
ซึ่งในบทความนี้ขอแนะนำ Sourcery
ยกตัวอย่างเช่น code ที่เขียนด้วยภาษา Swift
เมื่อเราต้องการเปรียบเทียบระหว่าง object จำเป็นต้องเขียน extension จาก Equatable protocol เสมอดังนี้ [gist id="d93c03c42f2fed808038a07b6476bf10" file="Employee.swift"] มันเป็นเรื่องที่น่าเบื่อมาก ๆ ลองคิดดูสิว่า ถ้ามีการเปรียบเทียบข้อมูลระหว่าง object แบบนี้เยอะ ๆ จะเขียนเยอะไหม จะ copy-and-paste แล้วมาแก้ไขเยอะไหม ? ถ้ามีการเปลี่ยนแปลงเช่นเพิ่มหรือแก้ไขหรือลบ property ต่าง ๆ จะต้องมาแก้ไขเองอีกใช่ไหม ? ยังไม่พอนะ ถ้ามีกรณีอื่น ๆ หรือ รูปแบบอื่น ๆ อีกล่ะ ทั้ง Hashable, Enum และ Tests เป็นต้น ก็ต้องมานั่งทำเองหมด มันไม่น่าจะสนุกเท่าไรนะครับ ดังนั้นมาหาวิธีการที่ง่ายขึ้นหน่อยดีกว่าสิ่งที่เลือกมาแนะนำคือ Sourcery
เป็น command line tool ที่จะทำการ scan source code เพื่อวิเคราะห์ว่ามี code ส่วนไหนตรงกับ template ที่กำหนดไว้บ้าง จากนั้นก็จะทำการ generate source code ให้เองแบบอัตโนมัติ โดย template จะอยู่ในรูปแบบของ Stencil และสามารถดูตัวอย่าง template เพิ่มเติมได้ที่นี่ จากตัวอย่างข้างต้นสามารถเขียน template ได้ดังนี้ [gist id="d93c03c42f2fed808038a07b6476bf10" file="template.stencil"]จากนั้นให้ทำการติดตั้ง Sourcery
โดยทำการ download ได้จากที่นี่ หรือทำการติดตั้งผ่าน CocoaPods หรือทำการติดตั้งผ่าน Swift Package Managerต่อมาทำการ run ด้วยคำสั่ง
[code] $sourcery Employee.swift template.stencil Employee.more.swift [/code] ถ้าอยากให้ทำการ monitoring การเปลี่ยนแปลงตลอดเวลา ก็เพิ่ม --watch เข้าไปดังนี้ [code] $sourcery Employee.swift template.stencil Employee.more.swift --watch [/code] คำอธิบาย Parameter ตัวที่ 1 คือ input file Parameter ตัวที่ 2 คือ template file Parameter ตัวที่ 3 คือ output file ผลการทำงานเป็นดังนี้ [code] Scanning sources... Found 1 types. Loading templates... Loaded 1 templates. Generating code... Processing time 0.0418089628219604 seconds [/code] มาดู output file จะได้ source code ดังนี้ [gist id="d93c03c42f2fed808038a07b6476bf10" file="Employee.more.swift"] มาถึงตรงนี้น่าจะช่วยลดเวลาในการเขียน code ซ้ำ ๆ ได้บ้างนะครับ แถวเอาคำสั่งนี้ไปไว้ใน build phase ก็น่าจะแจ่มขึ้นไปอีก ขอให้การเขียน code สนุกขึ้นครับปล. IDE และ Text Editor หลาย ๆ ตัวก็มี feature เหล่านี้ให้ใช้งานนะครับ ลองไปค้นหากันดูReference Websites https://medium.com/@orron/meta-programming-swift-with-sourcery-3843eafb248#.f43b6bcay