ในการ coding นั้นเรื่องของ copy-and-paste
รวมทั้ง code ที่ต้องเขียนซ้ำไปซ้ำมา
บางครั้งเป็น code ที่ไม่ควรจะต้องมี
แต่ด้วยโครงสร้างของภาษาก็จำเป็นต้องเขียน
ทำให้เสียเวลาในการพัฒนาระบบไปอย่างมาก

นั่นแสดงว่าเราได้ปฏิบัติตัวขัดแย้งกับ DRY principle อย่างมาก
DRY ย่อมาจาก Don’t Repeat Yourself

ดังนั้นเรามา ลด ละ เลิก กันบ้างแถอะ
หนึ่งในนั้นคือ การ generate code จาก template
ซึ่งในบทความนี้ขอแนะนำ Sourcery

ยกตัวอย่างเช่น code ที่เขียนด้วยภาษา Swift

เมื่อเราต้องการเปรียบเทียบระหว่าง object
จำเป็นต้องเขียน extension จาก Equatable protocol เสมอดังนี้

มันเป็นเรื่องที่น่าเบื่อมาก ๆ

ลองคิดดูสิว่า
ถ้ามีการเปรียบเทียบข้อมูลระหว่าง object แบบนี้เยอะ ๆ
จะเขียนเยอะไหม จะ copy-and-paste แล้วมาแก้ไขเยอะไหม ?
ถ้ามีการเปลี่ยนแปลงเช่นเพิ่มหรือแก้ไขหรือลบ property ต่าง ๆ
จะต้องมาแก้ไขเองอีกใช่ไหม ?

ยังไม่พอนะ ถ้ามีกรณีอื่น ๆ หรือ รูปแบบอื่น ๆ อีกล่ะ
ทั้ง Hashable, Enum และ Tests เป็นต้น
ก็ต้องมานั่งทำเองหมด
มันไม่น่าจะสนุกเท่าไรนะครับ
ดังนั้นมาหาวิธีการที่ง่ายขึ้นหน่อยดีกว่า

สิ่งที่เลือกมาแนะนำคือ Sourcery

เป็น command line tool ที่จะทำการ scan source code
เพื่อวิเคราะห์ว่ามี code ส่วนไหนตรงกับ template ที่กำหนดไว้บ้าง
จากนั้นก็จะทำการ generate source code ให้เองแบบอัตโนมัติ
โดย template จะอยู่ในรูปแบบของ Stencil
และสามารถดูตัวอย่าง template เพิ่มเติมได้ที่นี่

จากตัวอย่างข้างต้นสามารถเขียน template ได้ดังนี้

จากนั้นให้ทำการติดตั้ง Sourcery

โดยทำการ download ได้จากที่นี่
หรือทำการติดตั้งผ่าน CocoaPods
หรือทำการติดตั้งผ่าน Swift Package Manager

ต่อมาทำการ run ด้วยคำสั่ง

$sourcery Employee.swift template.stencil Employee.more.swift

ถ้าอยากให้ทำการ monitoring การเปลี่ยนแปลงตลอดเวลา
ก็เพิ่ม –watch เข้าไปดังนี้

$sourcery Employee.swift template.stencil Employee.more.swift --watch

คำอธิบาย
Parameter ตัวที่ 1 คือ input file
Parameter ตัวที่ 2 คือ template file
Parameter ตัวที่ 3 คือ output file

ผลการทำงานเป็นดังนี้

Scanning sources...
Found 1 types.
Loading templates...
Loaded 1 templates.
Generating code...
Processing time 0.0418089628219604 seconds

มาดู output file จะได้ source code ดังนี้

มาถึงตรงนี้น่าจะช่วยลดเวลาในการเขียน code ซ้ำ ๆ ได้บ้างนะครับ
แถวเอาคำสั่งนี้ไปไว้ใน build phase ก็น่าจะแจ่มขึ้นไปอีก
ขอให้การเขียน code สนุกขึ้นครับ

ปล. IDE และ Text Editor หลาย ๆ ตัวก็มี feature เหล่านี้ให้ใช้งานนะครับ
ลองไปค้นหากันดู

Reference Websites
https://medium.com/@orron/meta-programming-swift-with-sourcery-3843eafb248#.f43b6bcay

Tags: