แนวทางการ design api บน Clojure

วันนี้ไปเจอโปรเจ็คเล็ก ๆ ที่ชื่อว่า progrock ซึ่งเป็นไลบราลีที่ช่วยในการวาด progress bar บน Clojure

ด้วยความที่มันเล็ก แก้ปัญหาที่เข้าใจง่าย และมีขอบเขตชัดเจนนี้เอง ผมจึงรู้สึกว่ามันเป็นโปรเจ็คสำหรับการศึกษาการจัดวางโค้ด Clojure ที่ดีเลย ด้วยขนาด code แค่ 100 บรรทัด และ test อีก 50 บรรทัด ทำให้น่าจะเข้าใจได้ง่าย

จุดสังเกตหนึ่งที่ผมอยากจะกล่าวถึงสำหรับโปรเจ็คนี้ คือ Clojure api design เน้นให้ความสำคัญกับ data เสมอ จะเห็นว่าหน้าตาของ data จะอยู่ในส่วนต้นๆ ของ README เลย ผลลัพธ์ในกระบวนการทำงานใดๆ จะอยู่ในรูป data structure (ซึ่งส่วนใหญ่จะเป็น map) จากนั้นค่อยนำ data strucutre นี้ไปวาดเป็น UI ใน presentation logic ซึ่งในโปรเจ็คก็จะแยกออกเป็น render และ print อีกที ลักษณะการออกแบบโดยแยก pure function logic และ side effect (ในที่นี้คือฟังก์ชัน print ที่มีการ print ออก standard output) ออกชัดเจนเช่นนี้ ทำให้หลายๆ อย่างง่ายขึ้น ไม่ว่าจะเป็น

  • โค้ดเข้าใจได้ง่ายขึ้น เพราะ logic จะชัดเจน มีแค่ 1 เรื่อง คือการสร้าง output
  • นำไปเล่นกับ REPL ได้ง่าย
  • ใช้ประโยชน์จาก built-in collection library ได้เต็มที่
  • การเขียน test ที่สามารถเขียนได้ง่าย เพราะโค้ดเป็นแค่ input – output ธรรมดา
  • การ debug ง่ายเช่นเดียวกัน เพราะแค่ print data structure ออกมาดู ทำบน REPL ก็จะยิ่งสะดวกขึ้น
  • การทำ concurrency หากจะมีหลาย ๆ thread มา update progress พร้อม ๆ กันก็ทำได้ โดยการจับยัดใส่ atom
  • การเปลี่ยน presentation logic จะส่งเป็น json ไปให้ client ที่อื่นก็ทำได้ทันที เพราะ data structure มันอยู่ใน format ที่ serialize ง่ายอยู่แล้ว

ผมเคยเล่าถึงมุมอื่นของการให้ความสำคัญกับ data ของ Clojure ไปแล้วบ้างแล้วที่นี่ Data oritented 

Advertisements

2 thoughts on “แนวทางการ design api บน Clojure

    1. Tap Post author

      ใช่แล้ว render รับ data structure มาแปลงเป็น string พร้อมสำหรับการแสดงผล ส่วน print ทำการ print ออก standard output ด้วยฟังก์ชัน core/print (ต้องระบุ namespace core เพราะเค้าใช้ชื่อ print ซ้ำ)

      Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s