En büyük "çeviri sorunu" muhtemelen bir Java / OOP metodolojisinden Clojure / işlevsel programlama paradigmasına gidecek.
Özellikle, nesneler içinde değişebilir duruma sahip olmak yerine, "Clojure yolu", değişebilir durumu açıkça ayırmak ve saf (yan etkisiz) işlevler geliştirmektir. Muhtemelen bunların hepsini zaten biliyorsunuz :-)
Her neyse, bu felsefe, probleminizi çözmek için doğru araçlar setini oluşturmaya ilk çabalarınızı odakladığınız ve sonunda bunları sonunda birleştirdiğiniz "aşağıdan yukarıya" bir geliştirme tarzına yönelme eğilimindedir. Bu böyle bir şeye benzeyebilir
Temel veri yapılarını tanımlayın ve bunları değişmez Clojure haritasına veya kayıt tanımlarına dönüştürün. Çok sayıda değişmez haritayı iç içe yerleştirmekten korkmayın - Clojure'un kalıcı veri yapıları sayesinde çok verimlidirler. Daha fazlasını öğrenmek için bu videoyu izlemeye değer .
Bu değişmez yapılar üzerinde çalışan saf, iş mantığı odaklı işlevlerden oluşan küçük kitaplıklar geliştirin (ör. "Alışveriş sepetine bir öğe ekle"). Daha sonra daha fazlasını eklemek kolay olduğu için bunların hepsini aynı anda yapmanız gerekmez, ancak testi kolaylaştırmak ve veri yapılarınızın çalıştığını kanıtlamak için erken bir kaç adım yapmak yardımcı olur ..... her iki şekilde de REPL'de gerçekten etkileşimli olarak yararlı şeyler yazmaya başlayabilirsiniz.
Gerektiğinde bu yapıları veritabanına veya ağa veya eski Java koduna / veritabanından devam ettirebilen veri erişim rutinlerini ayrı ayrı geliştirin. Bunu çok ayrı tutmanın nedeni, kalıcılık mantığının "iş mantığı" işlevlerinizle bağlantılı olmasını istememenizdir. Bunun için ClojureQL'e bakmak isteyebilirsiniz , ancak beğendiğiniz herhangi bir Java kalıcı kodunu paketlemek oldukça kolaydır.
Yukarıdakilerin tümünü kapsayan birim testleri (örn. Clojure.test ile ) yazın . Bu özellikle Clojure gibi dinamik bir dilde önemlidir, çünkü a) statik tip kontrolünden çok fazla bir güvenlik ağına sahip değilsinizdir ve b) çok fazla şey inşa etmeden önce alt düzey yapılarınızın iyi çalıştığından emin olmanıza yardımcı olur. üstleri
Her bir parçanın değiştirilebilir uygulama düzeyi durumunu yönetmek için Clojure'un referans türlerini (değişkenler, başvurular, aracılar ve atomlar) nasıl kullanmak istediğinize karar verin. Hepsi benzer şekilde çalışır, ancak ne yapmaya çalıştığınıza bağlı olarak farklı işlem / eşzamanlılık anlamlarına sahiptir. Referanslar muhtemelen varsayılan seçiminiz olacaktır - herhangi bir kodu bir (dosync ...) bloğuna sararak "normal" STM işlem davranışını uygulamanıza izin verirler.
Doğru genel web çerçevesini seçin - Clojure'da zaten birkaç tane var, ancak Ring'i şiddetle tavsiye ederim - bu mükemmel videoyu " Onları Bağlamak İçin Bir Yüzük " ve şablon oluşturma felsefenize bağlı olarak Fleet veya Enlive veya Hiccup izleyin. Ardından, sunum katmanınızı yazmak için bunu kullanın ("bu alışveriş sepetini uygun bir HTML parçasına çevir" gibi işlevlerle)
Son olarak, yukarıdaki araçları kullanarak uygulamanızı yazın. Yukarıdaki adımları doğru bir şekilde yaptıysanız, bu aslında kolay olan bit olacaktır çünkü uygulamanın tamamını, çok az standart metne sahip çeşitli bileşenlerin uygun bileşimi ile oluşturabileceksiniz.
Bu, kabaca, kodunuzdaki bağımlılıkların sırasını geniş bir şekilde temsil ettiği için soruna saldıracağım sıradır ve bu nedenle "aşağıdan yukarıya" bir geliştirme çabası için uygundur. Elbette iyi çevik / yinelemeli tarzda olsa da, muhtemelen kendinizi gösterilebilir bir son ürüne erken doğru ilerlerken ve daha sonra işlevselliği genişletmek veya gerektiği gibi yeniden düzenlemek için oldukça sık önceki adımlara geri dönerken bulursunuz.
ps Yukarıdaki yaklaşımı izlerseniz, 50.000 satır Java'nın işlevselliğine uyması için kaç Clojure satırının gerektiğini duymak beni şaşırtabilir.
Güncelleme : Bu gönderi başlangıçta yazıldığından beri, "kontrol edilmesi gerekenler" kategorisinde birkaç ekstra araç / kitaplık ortaya çıktı:
- Noir - Ring'in üzerine inşa edilen web çerçevesi.
- Korma - SQL veritabanlarına erişmek için çok güzel bir DSL.