Tuesday, August 15, 2023

malleable design

malleable design 又可以稱之為 evolvable design 。舉例子來說明的話:

  • Lisp Macro: 提供你一個 compiler plugin
  • Postgres UDF (user defined function) / Object system / foreign data interface
  • Protocol, atom semantic in Clojure

上述這些可以延展系統的接口設計,都可以讓後人巧妙地去增加原本的抽象層的廣度與深度。如果善用這些接口的話,日後使用系統的人,可以充分地享受 conceptual integrity 的好處,而不是得到一個層層疊床架屋才勉強構築出來的系統。

雖然我寫 Clojure 也好一陣子了,對於『延展 Clojure』的技巧,一直沒有充分地掌握。仔細想想的話,這個才是 Clojure 最 powerful 的技巧之一,真的要講的話,像大名鼎鼎的 Reagent 就是用這種技巧做出的 library 。使用 reagent 的感覺非常奇妙:一方面,你知道你在寫的東西,它的底層是 React 。另一方面,你又可以使用 Clojure 的高階 semantic ,直接用 @ operator 來取得 reagent 內部的資料。