Continuation Passing Style in Swift

ก่อนอื่นเลย เราอยากบอกว่า Apple ไม่ชอบท่าดัก Exception เท่าไหร่ แม้จะมี try / catch / finally ให้ใช้ แต่ดูได้เลย ไม่มีใครเขียนเป็น Production Code กันเลย (ในประสบการณ์ที่ผมเห็นโค้ดมาน่ะนะ) โดยในการทำ Error Handling บน Objective-C นั้นท่าที่เราเจอประจำคือการใช้ NSError


ส่วนใน Swift นั้นจะตัดการทำ Throw Exception ออกไปเลย (ยกเว้นการทำ assert() ยังคงมีให้ใช้อยู่)
และการใช้ NSError ก็คล้ายกันกับใน Objective-C นั่นแหละ แบบนี้


คราวนี้ใน Swift นั้นมีอีกทางเลือกหนึ่งที่ดูดีกว่า (หรือปล่าว ?) นั่นคือการใช้ Tuples เข้ามาช่วยให้เราส่งค่าหลายๆ ค่าออกมาจาก Function พร้อมๆ กัน แบบนี้


ลองชั่งใจกันเองครับ ว่าท่าไหนสวยกว่า... แต่เคยมีการ Discuss กันใน Facebook ของบรรดาคนในวงการมาตั้งคำถาม (ซึ่งผมหาไม่เจอแล้ว) มีอาจารย์ท่านนึงตอบได้น่าสนใจมากว่า (ผมก็พยายามนึกเอาล่ะนะ ไม่เป๊ะหรอก)
การส่ง Error กลับไปด้วยการทำ Pass by reference นั้นถูกเขียนด้วยความเข้าใจที่ว่า "ฟังก์ชั่นควรส่งค่าอะไรกลับ" ซึ่งในที่นี้ชื่อฟังก์ชั่นบอกเราว่าจะต้องได้ Data กลับมา ดังนั้นเราจะมอง Error ที่เกิดขึ้นเป็นผลพลอยได้ (by-product) ที่อาจจะเกิดขึ้นกับฟังก์ชั่นดังกล่าว ก็เลยไม่ใช้วิธีที่ส่ง Error กลับมาตรงๆ
แล้วถ้าฟังก์ชั่นดังกล่าวเป็น Asynchronous ล่ะ ?

ไหนใครคิดถึง Delegate Pattern บ้าง ยกมือขึ้น! เรามีวิธีดีกว่านั้น เราจะใช้ Closure สองตัวเป็น Parameters ตัวหนึ่งเอาไว้รับข้อมูล (Success Closure) และอีกตัวเอาไว้จัดการ Error (Failure Closure) แบบนี้

การนำ Anonymous Function มาใช้แทนการคืนค่าบางอย่างออกจากฟังก์ชั่น เราจะเรียกมันว่า Continuation Passing Style (CPS)


แล้วเวลาเรียกใช้ก็


นี่เรียกได้ว่าเป็นท่ามาตรฐานเลยทีเดียว สำหรับการทำ Error Handling โดยมากจะเห็นท่านี้ตอนทำ API Request ซึ่งผมชอบเลยทีเดียว อีกอย่างที่เราปรับปรุงโค้ดชุดนี้ได้คือ Refactor Closure ออกมาเป็นค่าคงที่ (ทำบ่อยใน Objective-C เพราะการเขียน Block หรือ Closure ดิบๆ มันไม่สวยเอาซะเลย)


และอีก Style หนึ่งที่ผมเจอคือทำแบบนี้ :)


ก็ประมาณนี้แหละ จริงๆ ก็ยังเคยสงสัยอยู่ว่า การทำแบบนี้มันมีชื่อเรียกอะไรไหม พึ่งรู้จากการอ่านครั้งนี้แหละ เรียกแต่ Completion Block มาตลอดเลย...

Credithttps://www.mikeash.com/pyblog/friday-qa-2010-02-05-error-returns-with-continuation-passing-style.html

Popular posts from this blog

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

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

5 TED Talk ที่จะช่วยให้คุณทำงานดีขึ้น