Clojure erlaubt die Kapselung und Vererbung, aber kann ich sie kombinieren?

8

Hier ist ein zu einfaches Beispiel zur Illustration:

Ich kann ein Implementierungsdetail wie die Verwendung eines Atoms für einen Zähler einkapseln:

%Vor%

Aber das bedeutet, dass ich alles neu definieren muss, um ein Feature hinzuzufügen (keine Vererbung):

%Vor%

Wenn es möglich wäre, nur die eine Funktion zu erweitern:

%Vor%

Oder ich hätte nur das Atom freilegen können und unabhängige Funktionen gehabt:

%Vor%

Es scheint die beste Option zu sein, auf die Kapselung zu verzichten, wenn "Vererbung" (oder vielleicht genauer: Erweiterung) wünschenswert ist.

    
Timothy Pratley 05.10.2009, 01:06
quelle

2 Antworten

16

Ja, ich denke, idiomatische Clojure ist es, Ihre Daten von Ihren Funktionen zu trennen, gerade deshalb, weil Sie später neue Funktionen schreiben können, um an den alten Daten zu arbeiten.

Das Bündeln von Funktionen mit Daten bedeutet auch, dass Sie Ihre Funktionen später nicht ändern können, ohne alle Ihre Datenstrukturen zu ändern oder neu zu generieren, da Sie diese anonymen Funktionen überall gespeichert haben. Wenn ich mich interaktiv an einer REPL entwickle, würde ich es hassen, alle meine Datenstrukturen aufspüren zu müssen, um sie jedes Mal zu reparieren, wenn ich eine Funktion ändere. Verschlüsse in Hash-Maps sind clever, aber sie sind ziemlich zerbrechlich und ich würde diesen Weg nicht gehen, außer es gibt einen wirklich guten Grund.

Es erfordert nur ein Minimum an Disziplin, um Ihre Schnittstelle zu definieren (als Funktionen) und dann denken Sie daran, sich an Ihre Schnittstelle zu halten und nicht direkt mit dem Atom herumzuspielen. Es ist unklar, welchen Nutzen Sie davon haben werden, Dinge gewaltsam vor sich selbst zu verbergen.

Wenn Sie Vererbung wollen, sind Multimethoden ein guter Weg, dies zu tun.

%Vor%

z.B.

%Vor%     
Brian Carper 05.10.2009, 03:06
quelle
0

Ich bin sicher, dass es nicht idiomatische Clojure ist, aber Sie können geschützte Variablen definitiv simulieren.

In Ihrem Beispiel ist c eine simulierte private Variable. Wenn Sie möchten, dass es sich um eine geschützte Variable handelt, müssen Sie sie so definieren, dass sowohl make-counter als auch make-bi-counter darauf zugreifen können. Übergeben Sie einen Hash mit dem Namen geheim an make-counter . Wenn geheim c enthält, verwende das. Erstelle sonst dein eigenes.

Dann kann make-bi-counter ein secret -Objekt erstellen, das c enthält, und es an make-counter <übergeben / strong> Konstruktor. Jetzt haben sowohl make-bi-counter als auch make-counter Zugriff auf dasselbe c .

    
oillio 21.11.2010 16:38
quelle