ทำไม Clojure ไม่ใช้ class ในการ model domain

การปรับตัวสำคัญอย่างหนึ่งสำหรับคนที่เริ่มใช้ Clojure คือ Clojure แนะนำให้ model domain ด้วย data structure ไม่ใช่สร้าง class เหมือนตอนเขียนภาษา OOP

Rich Hickey อธิบายเรื่องนี้ในวิดีโอนี้ได้ดีมาก เค้าบอกว่าเรื่องนี้เป็นส่วนสำคัญอย่างมากที่ทำให้โค้ดที่เขียนด้วย Clojure สั้นกว่า https://www.youtube.com/watch?v=VSdnJDO-xdg&t=2869 (นาทีที่ 47:49 – 54:15)

class ทำให้เกิด specific method ที่เราต้องรู้จักเพิ่มขึ้นอีกมากมาย (Rich แซวว่านี่แหละสาเหตุที่ autocomplete ของ IDE จึงสำคัญมากสำหรับการเขียนภาษาอย่าง Java, C#)

ในขณะที่ฝั่ง Clojure ใช้ data structure ทำให้เราสามารถใช้ collection library ที่มีอยู่ทั้งหมด ที่เรารู้จักและคุ้นเคยในการจัดการกับ data model นี้ ทำให้เราลดการเขียนโค้ดใหม่ขึ้นมาจัดการโดยเฉพาะไปได้

Rich ยกตัวอย่าง HTTP request ซึ่งอันนึงถูก wrap ด้วย Java class HttpServletReq ที่มีเมท็อดเยอะมาก และมีเมท็อดที่ทำงานใกล้เคียงกันอยู่เป็นจำนวนมากที่ถูกใส่เข้ามาเพื่อให้ใช้งานได้ง่ายขึ้น

ในขณะที่ Clojure ใช้ map ธรรมดา ฟังก์ชันที่มีอย่าง get,get-in,assoc,assoc-in,update-in และอีกมากมาย (ใต้หัวข้อ Collections, Sequences ในหน้านี้ http://clojure.org/api/cheatsheet) สามารถนำมาใช้กับ data model ใหม่ของเราได้ทันที

Alan Perlis – Turing Award คนแรกกว่าไว้ว่า
“It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.”
http://www.cs.yale.edu/homes/perlis-alan/quotes.html

การ model domain เป็น data structure ยังมีข้อดีอื่น ๆ อีก อย่างเช่น
– สร้างง่าย ใครเคยต้อง new class ที่ต้องการ parameter มากมายและใน constructor มีการทำงานเยอะ น่าจะพอเห็นภาพ
– debug ง่าย อยากดูอะไรก็ print มันออกมาก เห็นทุกอย่างไม่ต้องไป override เมท็อด .toString
– serialize/deserialize ง่าย ทำให้ persist และส่งผ่าน network ง่ายด้วย ไม่ต้องเขียน serializer/deserializer ของทุก class ที่จะส่งผ่าน network ให้ตรงกับรูปแบบที่ data transfer format รองรับ

โพสครั้งแรกที่ https://www.facebook.com/groups/clojurethai/permalink/1216890918349399/

Advertisements

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