ho qualche codice clojure che assomiglia a questo:Come incapsulare in 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)))
Ora il seguente codice sembra un po 'poco comune:
(def left :x)
Tuttavia non so altro modo per ottenere l'incapsulamento.
Supponiamo, in seguito, voglio rappresentare il mio retto in un modo diverso. Quindi fare affidamento su (: x rect) non è una buona idea, perché: x funziona solo su hashmap e record, quindi dovrei rilasciare i dettagli di implementazione nell'api, che almeno nelle lingue OO è considerato una cattiva pratica.
Ora, se decido di realizzare il mio rect in Java, invece, diventa ancora peggio, perché allora avrei dovuto scrivere wrapper come:
(defn left [rect] (.getLeft rect))
per assicurarsi che l'interfaccia non cambia.
Come fa Clojure a risolvere questo problema?