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

[Swift] ลดการเขียน code ซ้ำ ๆ ด้วย Sourcery กันหน่อย

$
0
0

ในการ 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

Viewing all articles
Browse latest Browse all 1997

Trending Articles