2015-04-25 3 views
9

Ich versuche, Clojure Architektur wie Onkel Bob did http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html dort zu implementieren und wie er in sauberer Code in Episode 07 beschreiben - Architektur, Use Cases und High Level Design.Clojure Architektur wie Onkel Bob tat

Nichts in einem inneren Kreis kann überhaupt etwas über etwas in einem äußeren Kreis wissen.

enter image description here enter image description here

Ich möchte mit allen Geschäftsregeln und Tests Kern der App codieren. Dieser Kern muss Definitionen von Operationen an "Objekten" in der Datenbank haben, wie Benutzer, Bezahlung, Werbung usw. Aber die Implementierung dessen, wie dies zu tun ist, muss auf einer höheren Ebene der Anwendung sein.

Also die Frage ist: Können Sie mir ein Beispiel für gute Architektur-Anwendung auf GitHub wie auf Bild mit Kreisen geben? Ich lerne Clojure und möchte sehen, wie es technisch machbar ist. Ich versuche es selbst, aber ich habe schlechte Ergebnisse. Ein einfaches Beispiel für Code wird mir sehr helfen. Ich möchte wissen, wie Ebenen in Clojure wie auf Bild Schritt für Schritt erstellen.

Ich werde mich freuen für jede Information, wie man das mit hoher Qualität in Clojure macht. Kann Code, Video oder Artikel sein. Kann frei sein oder kaufen.

+2

Das Schlüsselelement für die saubere Architektur von Onkel Bob ist die Abhängigkeitsinversion.Es gibt mehrere Möglichkeiten, dies mit Clojure zu implementieren: die Verwendung von Funktionen und Protokollen höherer Ordnung sind wahrscheinlich die zwei wichtigsten (schamloser Stecker: http://blog.find-method.de/index.php?/archives/209-Dependency-inversion) -in-Clojure.html). Allerdings müssen Sie auch die verschiedenen Kreise implementieren: das ist im Grunde eine Frage der Verwendung von Namespaces und sicherstellen, dass Sie z. Protokolldefinitionen in die richtigen inneren Kreise/Ebenen und die Implementierungen in die richtige äußere Ebene. – schaueho

+0

Danke. Artikel ist genau über was ich versuche zu lösen und dieser Typ ist über ein paar Schritte weiter, dann ich :) – kabra

+0

@schaueuho Ihr Kommentar und Link zu den ausgearbeiteten und wertvollen Beitrag ist mehr als die durchschnittliche Antwort, könnten Sie es in eine Antwort verwandeln. Ich denke, dass Kabra es dann akzeptieren könnte –

Antwort

6

Das Schlüsselelement für die saubere Architektur von Onkel Bob ist die Abhängigkeitsinversion. Es gibt mehrere Möglichkeiten, dies mit Clojure zu implementieren: die Verwendung von Funktionen und Protokollen höherer Ordnung sind wahrscheinlich die zwei wichtigsten (schamloser Stecker für eine blog post of mine on dependency inversion in Clojure). Zum Beispiel könnten Sie ein Persistenz-Protokoll für Ihre Daten definieren, die völlig unwissend von der jeweiligen Implementierung ist:

(defprotocol MyDataDao 
    (load-data []) 
    (save-data [])) 

Sie dann eine Implementierung des Protokolls haben könnte, die die Datenbank oder das normale Dateisystem (Hinweis verwenden: die Verwendung von reify ist nur eine Option):

(defn make-mydata-db-dao [] 
    [... db-setup-code ... ] 
    (reify MyDataDao 
     (load-data [] 
      [... data-query-code ...]) 
     (save-data [] 
      [... data-save-code ...]))) 

Statt der handgefertigten make-mydata-db-dao Sie Stuart Sierra ausgezeichnete component library aussehen könnte wollen.

Allerdings müssen Sie auch die verschiedenen Kreise implementieren: das ist im Grunde eine Frage der Verwendung von Namespaces und sicherzustellen, dass Sie z. Protokolldefinitionen in die richtigen inneren Kreise/Ebenen und die Implementierungen in die richtige äußere Ebene.

Nehmen wir an, Ihr Gateway-Code ist im Allgemeinen im Namensraum app.gateway.*. Dann könnte das Protokoll MydataDao im Namensraum app.gateway.dao enden. Die Implementierung würde jedoch in einen anderen, äußeren Kreis gehören. Angenommen, Ihr gesamter DB-Code befindet sich im Namespace app.db.*, dann können Sie make-mydata-db-dao in app.db.dao eingeben.

Leider kenne ich keine vorhandene Codebasis in Clojure, die dies gründlich implementiert. Eigentlich wäre ich daran interessiert, ein realistisches Beispiel dafür in irgendeiner Sprache umzusetzen und mehr über die Vorteile und Nachteile oder Schwierigkeiten bei der Verwendung zu erfahren.