Saturday, January 29, 2022

剝皮接枝法

問題的 Context: 我用 Clojure 去呼叫 Slack java API ,在 client side 取得 Slack 的 message event。Slack java API 傳回的 message 都是使用 java object 的形式來傳回。

Clojure 有兩組 API 可以處理這種問題。如果只需要取得第一層的 property ,就用 core library 的 bean 即可。

https://clojuredocs.org/clojure.core/bean

但是,如果要把重重嵌套的物件,遞迴地轉成重重嵌套的 Clojure hash map ,就得使用耗時耗記憶體的 from-java

https://github.com/clojure/java.data

由於考慮到 execution efficiency ,所以我就自己手刻轉換的函數來轉換。(為了效能,必要的開發??) 然而, Arne Brasseur 則提出了一個不同的解決方案,我稱之為「剝皮接枝法

- 由於 Slack java API 它其實是把本來是 json 形式的 data ,用 java class 包裝起來,讓 java 程式容易(?)調用而設計的。

- 好的 java program 通常會有一些 factory 的設計,Slack 的 library 也是如此,這些都是可以置換 implementation 的 software seam

- 基於上述兩項事實,我們可以放棄從既有的 Slack java API 來做 integration 。剝掉一層 java API 的 skin ,往下挖一層,直接挖到 Slack java API 的下層,透過 web socket 傳輸 json 資料的程式碼。然後,透過 Clojure 的 web socket library 去串接網路與 json 資料。取得 json 之後,直接轉成 Clojure hash map 。

用這個方式的話,可以同時滿足機器效能與長期開發效率的要求。

;;;;;;;;;;;;;;;;;;;;; 結論 ;;;;;;;;;;;;;;;;;

上頭一大串是平庸的 software developer 我,對這一則簡短的 twitter 的解釋…

Much of Clojure development is peeling back layers and layers of Java libraries to get to the bit that actually matters, then wrapping that in a tiny API layer over plain data.