Das größte "Übersetzungsproblem" wird wahrscheinlich von einer Java / OOP-Methodik zu einem Clojure / funktionalen Programmierparadigma übergehen.
Anstatt einen veränderlichen Zustand innerhalb von Objekten zu haben, besteht der "Clojure-Weg" insbesondere darin, den veränderlichen Zustand klar zu trennen und reine (nebenwirkungsfreie) Funktionen zu entwickeln. Das alles weißt du wahrscheinlich schon :-)
Wie auch immer, diese Philosophie führt tendenziell zu einem "Bottom-up" -Entwicklungsstil, bei dem Sie die anfänglichen Bemühungen darauf konzentrieren, die richtigen Tools zur Lösung Ihres Problems zu entwickeln und diese schließlich am Ende zusammenzufügen. Das könnte ungefähr so aussehen
Identifizieren Sie wichtige Datenstrukturen und wandeln Sie sie in unveränderliche Clojure-Karten- oder Datensatzdefinitionen um. Haben Sie keine Angst, viele unveränderliche Karten zu verschachteln - sie sind dank der beständigen Datenstrukturen von Clojure sehr effizient. Sehen Sie sich dieses Video an, um mehr zu erfahren.
Entwickeln Sie kleine Bibliotheken mit reinen, auf Geschäftslogik ausgerichteten Funktionen, die auf diesen unveränderlichen Strukturen basieren (z. B. "Artikel in den Warenkorb legen"). Sie müssen nicht alle auf einmal ausführen, da es später einfach ist, weitere hinzuzufügen. Es ist jedoch hilfreich, einige frühzeitig auszuführen, um das Testen zu erleichtern und zu beweisen, dass Ihre Datenstrukturen funktionieren An der REPL können Sie tatsächlich anfangen, nützliche Dinge interaktiv zu schreiben
Entwickeln Sie separat Datenzugriffsroutinen, mit denen diese Strukturen nach Bedarf in / aus der Datenbank oder dem Netzwerk oder dem alten Java-Code beibehalten werden können. Der Grund, dies sehr getrennt zu halten, besteht darin, dass Sie keine Persistenzlogik mit Ihren "Geschäftslogik" -Funktionen verknüpfen möchten. Vielleicht möchten Sie sich dafür ClojureQL ansehen , obwohl es auch ziemlich einfach ist, jeden Java-Persistenzcode zu verpacken, den Sie mögen.
Schreiben Sie Unit-Tests (z. B. mit clojure.test ), die alle oben genannten Punkte abdecken. Dies ist in einer dynamischen Sprache wie Clojure besonders wichtig, da a) Sie nicht so viel Sicherheitsnetz für die statische Typprüfung haben und b) es hilfreich ist, sicherzustellen, dass Ihre Konstrukte auf niedrigerer Ebene gut funktionieren, bevor Sie zu viel darauf aufbauen oben auf ihnen
Entscheiden Sie, wie Sie die Referenztypen von Clojure (Vars, Refs, Agenten und Atome) verwenden möchten, um den Status jedes Teils auf Anwendungsebene zu ändern. Sie funktionieren alle auf ähnliche Weise, haben jedoch unterschiedliche Transaktions- / Parallelitätssemantiken, je nachdem, was Sie versuchen. Refs werden wahrscheinlich Ihre Standardauswahl sein - sie ermöglichen es Ihnen, "normales" STM-Transaktionsverhalten zu implementieren, indem Sie beliebigen Code in einen (dosync ...) Block einschließen.
Wählen Sie das richtige allgemeine Webframework aus - Clojure hat bereits einige, aber ich würde Ring dringend empfehlen - sehen Sie sich dieses hervorragende Video " Ein Ring zum Binden " sowie entweder Fleet oder Enlive oder Hiccup an, je nach Ihrer Vorlagenphilosophie. Verwenden Sie diese Option, um Ihre Präsentationsebene zu schreiben (mit Funktionen wie "Diesen Einkaufswagen in ein geeignetes HTML-Fragment übersetzen").
Zum Schluss schreiben Sie Ihre Bewerbung mit den oben genannten Tools. Wenn Sie die oben genannten Schritte ordnungsgemäß ausgeführt haben, ist dies tatsächlich ganz einfach, da Sie die gesamte Anwendung durch geeignete Zusammensetzung der verschiedenen Komponenten mit sehr wenig Boilerplate erstellen können.
Dies ist ungefähr die Reihenfolge, in der ich das Problem angreifen würde, da es weitgehend die Reihenfolge der Abhängigkeiten in Ihrem Code darstellt und daher für einen "Bottom-up" -Entwicklungsaufwand geeignet ist. Obwohl Sie sich natürlich in einem guten agilen / iterativen Stil befinden, werden Sie wahrscheinlich frühzeitig zu einem nachweisbaren Endprodukt vordringen und dann ziemlich häufig zu früheren Schritten zurückkehren, um die Funktionalität oder den Refactor nach Bedarf zu erweitern.
ps Wenn Sie dem obigen Ansatz folgen, wäre ich fasziniert zu hören, wie viele Clojure-Zeilen erforderlich sind, um die Funktionalität von 50.000 Java-Zeilen zu erreichen
Update : Seit dieser Beitrag ursprünglich geschrieben wurde, sind einige zusätzliche Tools / Bibliotheken entstanden, die sich in der Kategorie "Muss auschecken" befinden:
- Noir - Webframework, das auf Ring aufbaut.
- Korma - ein sehr schönes DSL für den Zugriff auf SQL-Datenbanken.