Ich entwickle eine komplexe Datenstruktur in Clojure mit mehreren Unterstrukturen.Abstraktion von Datenstrukturimplementierungsdetails in Clojure
Ich weiß, dass ich diese Struktur im Laufe der Zeit erweitern möchte und manchmal die interne Struktur ändern möchte, ohne verschiedene Benutzer der Datenstruktur zu brechen (zum Beispiel möchte ich vielleicht einen Vektor in eine Hashmap ändern, addieren eine Art von Indexstruktur aus Leistungsgründen oder ein Java-Typ) integrieren
Mein aktuelles Denken ist:
- ein Protokoll mit Methoden verschiedenen Accessor für die Gesamtstruktur definieren
- eine Mini-Bibliothek erstellen von Funktionen, die durch die Datenstruktur navigieren e .G. (Abfrage-Unterbau-abc param1 param2)
- Implementieren Sie die Datenstruktur unter Verwendung defrecord oder Deftype, mit den Protokoll Methoden definiert, um die Mini-Bibliothek verwenden
Ich denke, das wird funktionieren, aber ich mache mir Sorgen, es fängt an, wie ziemlich viel "Kleber" Code auszusehen. Wahrscheinlich spiegelt es auch meine größere Vertrautheit mit objektorientierten Ansätzen wider.
Was ist der empfohlene Weg, dies in Clojure zu tun?
Danke Michal! Insightful wie immer :-) wird definitiv in die ILookup und Assoziative Optionen – mikera
Dies ist eine sehr nützliche Antwort! Aber fast drei Jahre später wäre es großartig, dies zu aktualisieren (oder eine neue Antwort zu erstellen), basierend auf der Funktion, die jetzt in 1.5 verfügbar ist. Eine Sache, die mir aufgefallen ist, ist, dass "Defrecord" jetzt Factory-Funktionen ausstrahlt, nicht sicher, welche anderen Änderungen diese Antwort beeinflussen könnten. –
Ich denke, diese Antwort könnte auch ein Update verwenden - selbst das O'Reily Clojure-Buch sagt nun, dass clojures Defrecord Factory-Funktionen erzeugt. – djhaskin987