Screen Shot 2558-01-11 at 4.18.14 PM
เรื่องที่ 25 ที่นักพัฒนาควรรู้ และ เข้าใจก็คือ The Golden Rule of API Design

การออกแบบ API (Application Programming Interface) นั้นเป็นเรื่องที่ยากพอสมควร
ยิ่งถ้าเป็นการออกแบบในระบบที่ใหญ่ ความยากที่สูงขึ้น
หรือถ้ามีคนใช้งาน API จำนวนมากแล้ว
มันยิ่งทำให้คุณในฐานนะนักพัฒนาต้องใช้ความคิดอย่างมาก
ว่าคุณจะทำการแก้ไข API
ว่าคุณจะออกแบบ API
ในอนาคตอย่างไร เพื่อลดผลกระทบต่อผู้ใช้งานให้น้อยที่สุด

สิ่งที่คุณต้องคิดให้มากขึ้น

ก็คือผู้ใช้งาน API นั้นส่งผลอะไรต่อคุณที่สร้างด้วย !!
ลองจินตนาการดูสิว่า

  • ถ้า API class ของคุณนั้นมี method ที่ทำงานภายใน
  • ส่วนผู้ใช้งานนั้น ก็ทำการ extend จาก class นี้ แล้ว override มันซะ

ลองคิดดูสิว่า มันจะยากลำบากไหม
ถ้าคุณต้องการแก้ไขการทำงานภายใน
บางครั้งคุณอาจจะไม่สามารถแก้ไข method เหล่านั้นได้เลย
เพราะว่า ผู้ใช้งาน API เข้าใจการใช้งานแตกต่างจากสิ่งที่คุณคิดก็เป็นไปได้

แล้วแก้ไขปัญหานี้อย่างไรดีล่ะ ?

วิธีการแก้ไขปัญหามีเยอะมากๆ
แต่วิธีการที่ง่ายๆ คือ การบังคับไม่ให้แก้ไข API class

ตัวอย่างเช่น
ในภาษา Java นั้นสามารถใส่ final ไปที่การประกาศ class และ method ไปเลย
ส่วนในภาษา C# สามารถใช่ sealed ไปเลย
หรือบางครั้ง คุณก็สามารถใช้ design pattern เช่น Singleton หรือ Factory method เป็นต้น

วิธีการแก้ไขมันดูดี มีเหตุผลนะ

แต่คุณคิดว่า วิธีการเหล่านี้มัน คือการแก้ไขปัญหาจริงๆ หรือไม่ ?

หนึ่งในแนวปฏิบัติที่ดีในการพัฒนา software ก็คือ การเขียน unit test
แต่มักพบว่า ไม่ค่อยมีใครนำไปปฏิบัติ หรือ ใช้งานเลย
เรามักจะพบว่า class ต่างๆในระบบงานมันไม่เคยมีการทดสอบด้วย unit test เลย
ยิ่งถ้าคุณใช้งานพวก 3-party API ด้วยแล้วยิ่งลำบากมากๆ
และนั่นคือสิ่งที่ก่อให้เกิดปัญหาในการพัฒนา

ดังนั้นสิ่งที่ขอแนะนำก็คือ

ชีวิตคุณจะดีขึ้นกว่าเดิม …
เมื่อคุณเริ่มทำการออกแบบ API
ให้ทำการคิดการทดสอบตามการใช้งานจริงๆ ว่าทำอย่างไร
แต่โชคไม่ค่อยดี ที่ไม่ค่อยมีคนสนใจเท่าไร

ดังนั้นสิ่งที่อยากให้พึงระลึกไว้ก็คือ Gloden Rule of API Design
กล่าวไว้ว่า

ถ้าคุณคิดว่า API ที่คุณพัฒนามันยังมี unit test ไม่เพียงพอ
ให้ทำการเขียน unit test ในมุมมองของผู้ใช้งานแทนซะ
มันจะทำให้คุณเรียนรู้ว่า คุณควรจะออกแบบ API อย่างไร
เพื่อเป็นอิสระจากผู้ใช้งาน
มันจะทำให้คุณพัฒนา และ แก้ไข API ง่ายขึ้นไหม

แต่ให้เชื่อเถอะว่า

ไม่มีวิธีการใดที่มันจะง่ายๆ หรอกนะ
หรือว่าวิธีใดมันแย่ หรือ มันจะดีที่สุด
เนื่องจากแต่ละวิธีการมันก็มีประโยชน์ตามเป้าหมาย

แต่สิ่งที่สำคัญก็คือ ในเรื่องของการทดสอบ
ก่อนที่จะทำให้คิดก่อนสิว่า

  • จะทดสอบมันอย่างไร ?
  • จะใช้งานมันอย่างไร ?

เพื่อให้การออกแบบมันดีขึ้นกว่าเดิม และดีขึ้นเรื่อยๆ อยู่อย่างเสมอ