Największym „problemem translacyjnym” będzie prawdopodobnie przejście od metodologii Java / OOP do paradygmatu Clojure / programowania funkcjonalnego.
W szczególności, zamiast mieć zmienny stan w obiektach, „sposób Clojure” polega na wyraźnym oddzieleniu zmiennego stanu i opracowaniu czystych (wolnych od skutków ubocznych) funkcji. Prawdopodobnie już to wszystko wiesz :-)
W każdym razie ta filozofia prowadzi do czegoś w rodzaju stylu rozwoju „oddolnego”, w którym początkowe wysiłki koncentrują się na budowaniu odpowiedniego zestawu narzędzi do rozwiązania problemu, a na końcu łączą je razem. To może wyglądać mniej więcej tak
Zidentyfikuj kluczowe struktury danych i przekształć je w niezmienną mapę Clojure lub definicje rekordów. Nie bój się zagnieżdżać wielu niezmiennych map - są one bardzo wydajne dzięki trwałym strukturom danych Clojure. Warto obejrzeć ten film, aby dowiedzieć się więcej.
Twórz małe biblioteki czystych funkcji zorientowanych na logikę biznesową, które działają na tych niezmiennych strukturach (np. „Dodaj pozycję do koszyka”). Nie musisz robić tego wszystkiego naraz, ponieważ później łatwo jest dodać więcej, ale warto zrobić kilka na początku, aby ułatwić testowanie i udowodnić, że struktury danych działają ..... tak czy inaczej w rzeczywistości możesz zacząć interaktywnie pisać przydatne rzeczy w REPL
Oddzielnie opracuj procedury dostępu do danych, które w razie potrzeby mogą utrwalać te struktury do / z bazy danych lub sieci lub starszego kodu Java. Powodem, dla którego należy to bardzo oddzielić, jest to, że nie chcesz, aby logika trwałości była powiązana z funkcjami „logiki biznesowej”. W tym celu możesz spojrzeć na ClojureQL , chociaż dość łatwo jest opakować dowolny kod trwałości Java, który chcesz.
Napisz testy jednostkowe (np. Za pomocą clojure.test ), które obejmują wszystkie powyższe. Jest to szczególnie ważne w dynamicznym języku, takim jak Clojure, ponieważ a) nie masz tak dużej siatki bezpieczeństwa przed statycznym sprawdzaniem typów i b) pomaga upewnić się, że konstrukcje niższego poziomu działają dobrze, zanim zaczniesz zbyt dużo budować górę z nich
Zdecyduj, w jaki sposób chcesz używać typów referencyjnych Clojure (zmiennych, referencji, agentów i atomów) do zarządzania stanami poziomu aplikacji, które można modyfikować. Wszystkie działają w podobny sposób, ale mają inną semantykę transakcyjną / współbieżną w zależności od tego, co próbujesz zrobić. Domyślnym wyborem będą prawdopodobnie odwołania - pozwalają one na implementację „normalnego” zachowania transakcyjnego STM poprzez zawijanie dowolnego kodu w blok (dosync ...).
Wybierz właściwą ogólne ramy internetowej - Clojure ma już całkiem sporo, ale bym zalecamy Ring - zobacz ten doskonały film „ Jeden, by związać ” plusa albo Fleet lub Enlive lub Czkawka zależności od filozofii szablonów. Następnie użyj tego do napisania swojej warstwy prezentacji (z funkcjami takimi jak „przetłumacz ten koszyk na odpowiedni fragment HTML”)
Na koniec napisz swoją aplikację przy użyciu powyższych narzędzi. Jeśli poprawnie wykonałeś powyższe kroki, będzie to faktycznie łatwe, ponieważ będziesz w stanie zbudować całą aplikację poprzez odpowiedni skład różnych komponentów z bardzo małą ilością gotówki.
Jest to z grubsza kolejność, w której chciałbym zaatakować problem, ponieważ ogólnie reprezentuje on porządek zależności w Twoim kodzie, a zatem nadaje się do tworzenia „od podstaw”. Chociaż oczywiście w dobrym, zwinnym / iteracyjnym stylu, prawdopodobnie szybko przechodzisz do przodu do możliwego do udowodnienia produktu końcowego, a następnie często wracasz do wcześniejszych kroków, aby rozszerzyć funkcjonalność lub refaktoryzację w razie potrzeby.
ps Jeśli zastosujesz się do powyższego podejścia, byłbym zafascynowany tym, ile linii Clojure potrzeba, aby dopasować funkcjonalność 50000 linii Java
Aktualizacja : ponieważ ten post został pierwotnie napisany, pojawiło się kilka dodatkowych narzędzi / bibliotek, które należą do kategorii „trzeba sprawdzić”:
- Noir - framework sieciowy, który jest oparty na Ring.
- Korma - bardzo ładne DSL do uzyskiwania dostępu do baz danych SQL.