我有一些Clojure的代碼看起來像這樣:如何封裝clojure?
(defn rect [x y w h]
{:x x, :y y, :w w, :h h})
(def left :x)
(def top :y)
(def width :w)
(def height :h)
(defn right [r]
(+ (left r) (width r)))
(defn bottom [r]
(+ (top r) (height r)))
現在下面的代碼似乎有點少見:
(def left :x)
但是我不知道任何其他方式獲得的封裝。
假設我後來想用不同的方式來表示我的矩形。 然後依靠(:x rect)並不是一個好主意,因爲:x只對hashmap和記錄起作用,所以我會在api中泄漏實現細節,至少在OO語言中這被認爲是不好的做法。現在
,如果我決定執行我在java中矩形相反,它會變得更糟,因爲那樣我會寫這樣的包裝:
(defn left [rect] (.getLeft rect))
,以確保該接口並沒有改變。
clojure如何解決這個問題?