Mam niektóre kodu Clojure, który wygląda tak:Jak hermetyzować w 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)))
Teraz następujący kod wydaje się nieco Niezbyt często:
(def left :x)
Jednak nie znam żadnego innego sposobu na zdobycie enkapsulacji.
Załóżmy, że później chcę reprezentować mój rect w inny sposób. Wówczas poleganie na (: x rect) nie jest dobrym pomysłem, ponieważ: x działa tylko na hashmapach i zapisach, więc wtedy byłyby nieszczelne szczegóły implementacji w api, co przynajmniej w językach OO jest uważane za złą praktykę.
Teraz, jeśli zdecyduję się realizować moje rect w java zamiast, to jeszcze gorzej, bo wtedy musiałbym napisać obwolut jak:
(defn left [rect] (.getLeft rect))
aby upewnić się, że interfejs nie zmienia.
W jaki sposób clojure rozwiązuje ten problem?