Ich habe einige clojure Code, der wie folgt aussieht:Wie in clojure einzukapseln?
(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)))
nun der folgende Code scheint ein wenig ungewöhnlich:
(def left :x)
jedoch weiß, dass ich keine andere Art und Weise Verkapselung zu erhalten.
Angenommen, ich möchte später meinen rect einen anderen Weg darstellen. Dann auf (: x rect) angewiesen ist keine gute Idee, denn: x funktioniert nur auf Hashmaps und Datensätze, so würde ich dann Implementierungsdetails in der API, was zumindest in OO-Sprachen als schlechte Praxis ist leckt.
Nun, wenn ich stattdessen meine rect in Java zu implementieren entscheiden, es wird noch schlimmer, denn dann würde ich Wrapper schreiben müssen wie:
(defn left [rect] (.getLeft rect))
um sicherzustellen, dass die Schnittstelle nicht ändert.
Wie löst clojure dieses Problem?