Java projelerinin ayrılması


12

Büyük bir java projem var ve yapım döngümüz için maven kullanıyoruz. Bu bir proje yaygın olarak kullanılmaktadır - diğer projelerde, bazıları içinde bulunan ve bazıları başka yerlerde bulunan çeşitli uygulamalarda ... Dürüst olmak gerekirse, biraz karışıklık (belirli zamanlarda farklı zamanlarda eklenen çeşitli bitler) amaçlar) ve biraz temizlemek istiyorum. Ayrıca, tam olarak test edilmemiştir (uygun birim ve entegrasyon testi olmadan çok sayıda bit eklenmiştir) ve çalışması uzun süren veya gerçekten geçmeyen bazı testler vardır ... (uh-oh) - yani testler maven oluşturma döngüsünde kapatılır (yine uh-oh).

Bu büyük projeyi daha küçük spesifik projelere ayırmayı düşünüyorum, böylece 'nihai' alt proje (veya birkaç alt proje) ihtiyaç duyacağı çeşitli alt projeleri alacak.

Düşüncem şöyle:

  • eğer büyük projeyi çeşitli alt projelere ayırırsam, bu her bir projenin sorumluluğunun ne olduğunu netleştirir.
  • alt projelere ayırarak, her bir alt projenin testini ayrı ayrı temizleyebilir ve maven oluşturma döngüsünde bu alt proje için testi açabilirim.

Bunun inşa süresi üzerinde ne gibi etkileri olabileceğinden biraz endişeliyim.

  • Büyük projeye (yani daha küçük alt projelere) bir yapı koymak derleyiciyi yavaşlatır mı?

Ayrıca, bunun IDE'lerde düzenleme süresinin ne gibi etkileri olabileceğine dair küçük bir endişem var (esas olarak Intellij kullanıyoruz). Intellij, her bir projeyi sırayla bağımlılık ağacı üzerinden inşa ediyor gibi görünüyor - yani C, B'ye bağlıysa A'ya bağlıysa ve A'yı değiştirirsem, A derlenmediği sürece B oluşturmaya çalışmaz. Muhtemelen bu avantajlıdır, ancak - örneğin, A ve B'de yaygın olarak kullanılan bir arabirimi değiştirirsem, bu değişiklikteki tüm hataları düzeltmenin biraz zaman aldığını fark ettim ...

Başka bir soru fabrika sınıflarının nasıl kullanılacağıdır. Projenin bazı yönleri dış kavanozlara bağlıdır. Bazen (neyse ki sık sık değil) bunlar güncellenir ve taşınmamız gerekir. Bunu, dış kodun doğru sürümlerine işaret eden bir Factory sınıfı kullanarak ele alma eğilimindeyiz (bu nedenle kod tabanındaki tüm uygulamaları değiştirmek zorunda değiliz).

Şu anda hepsi büyük projede, ancak alt projelere geçerek yeni dış kodun uygulanması için yeni bir proje geliştirebileceğimi, alt projenin tamamen işlevsel ve test edildiğinden emin olabileceğimi ve sonra kullanıcı projesindeki bağımlılıkları / fabrika sınıfını değiştirin. Bununla birlikte, bu, büyük proje boyunca arayüzlerin yaygın kullanımı ile daha karmaşık hale getirilmektedir. Örneğin

  • alt proje A - arayüzler içerir
  • alt proje B - arayüzler ve eski harici kavanoz için A'ya bağlıdır
  • alt proje C - B'ye (ve dolayısıyla A ve eski harici kavanoza) bağlıdır ve B'nin arabirim uygulamalarını kullanan bir Fabrika sınıfı içerir

B'nin dış kavanozunu değiştirmem gerekirse, şunları yapabilirim:

  • alt proje yarat B_ii - yine A'ya ve şimdi yeni harici kavanoza bağlı
  • Tamamen işlevsel olduğunda, C'nin bağımlılığını B_ii'ye ekleyebilir ve fabrika sınıfını arayüzlerin yeni uygulamalarını kullanacak şekilde değiştirebilirim.
  • hepsi işe yaradığında, C'nin orijinal B'ye bağımlılığını kaldırabilirim ve istenirse B projesini kaldırabilirim.

  • Bunu yapmanın mantıklı bir yolu var mı?

Genel olarak, sorularım:

  • Herkes büyük projeleri parçalama deneyimi var mı? Paylaşmak isteyebileceğiniz ipuçları / püf noktaları var mı?
  • Bunun geliştirme ve inşa süreleriniz üzerinde nasıl bir etkisi oldu?
  • Böyle bir projenin böyle bir bölünmesinin yapılandırılması için ne gibi tavsiyeler sunabilirsiniz?

A, B ve C'nin yan yana ayrı ayrı işaretlendiği bir üst proje oluşturabileceğinizi unutmayın. Bu, örneğin IntelliJ'in üçünün de aynı anda belleğe sahip olmasına ve modül sınırları boyunca yeniden düzenleme yapmasına olanak tanır.
Thorbjørn Ravn Andersen

Yanıtlar:


10

Ben hızlı bir ilk kesim alacağım (büyük Q BTW!):

Büyük projeye (yani daha küçük alt projelere) bir yapı koymak derleyiciyi yavaşlatır mı?

Önemli olan yeterli değil, ek yük aslında Maven çağrılarında.

Ayrıca, bunun IDE'lerde düzenleme süresinin ne gibi etkileri olabileceğine dair küçük bir endişem var (esas olarak Intellij kullanıyoruz). Intellij, her bir projeyi sırayla bağımlılık ağacı üzerinden inşa ediyor gibi görünüyor - yani C, B'ye bağlıysa A'ya bağlıysa ve A'yı değiştirirsem, A derlenmediği sürece B oluşturmaya çalışmaz. Muhtemelen bu avantajlıdır, ancak - örneğin, A ve B'de yaygın olarak kullanılan bir arabirimi değiştirirsem, bu değişiklikteki tüm hataları düzeltmenin biraz zaman aldığını fark ettim ...

Farklı IDE'lerin Maven bağları ve bağımlılık yönetimi açısından farklı güçlü yönleri vardır. Mevcut oyun durumu çoğunlukla en son Eclipse, Netbeans ve IntelliJ üzerinde çalışıyor gibi görünüyor - ancak geliştiricilerinize "Kaynak dosyaları diskten yenile ve ilgili tüm maven projelerini yeniden oluştur" acil durum çiftini öğretmeniz gerekecek.

Bugünlerde bunu daha az yapmak zorunda olduğumu düşünüyorum. SSD sürücüsüne sahip olmak BTW'de büyük bir fark yaratıyor.

snip fabrika sınıfları paragraflar

Bağımlılık yönetimi, uygulamanıza yardımcı olmak için hangi teknolojinin (Maven / Ivy / ne olursa olsun) kullandığından bağımsız olarak inanılmaz derecede önemlidir.

Maven bağımlılık eklentisinden kapsamlı raporlar alarak işe başladım ve sahip olduklarınızı stoklayın. Genel olarak konuşmak gerekirse, POM'un bağımlılık yönetimindeki bağımlılığı gıda zincirini olabildiğince yükseğe çıkarırsınız, ancak daha yüksek olmazsınız. Dolayısıyla, iki alt modülünüz harici bir bağımlılık kullanıyorsa, bunu ana POM'larına vb. Götürün.

Harici JAR'ları yükseltmek her zaman uygun bir mini proje olarak yapılmalıdır. Neden yükseltme yaptığınızı değerlendirin, yeni özelliklerden / hata düzeltmelerinden vb. Yararlanmak için kaynak kodunu değiştirin. Sadece bu analiz ve çalışmayı kullanmadan sürümü çarpmanız sizi sıkıntıya sokacaktır.

Genel olarak, sorularım:

Herkes büyük projeleri parçalama deneyimi var mı? Paylaşmak istediğiniz ipuçları / püf noktaları var mı?

  • Arayüzler ve Bağımlılık enjeksiyonu arkadaşınızdır.
  • Michael Feather'ın eski kodlarla etkili bir şekilde ilgilenme kitabı mutlaka okunmalıdır.
  • Entegrasyon testleri arkadaşınızdır
  • Alt projeleri foo-api (sadece arayüzler!) Ve foo-çekirdeğe bölmek ve sadece foo-api'ye bağlı modüllere sahip olmak büyük ölçüde yardımcı olur ve ayrılmayı zorlar
  • Jboss Modülleri ve / veya OSGi, temiz ayırmanın uygulanmasına yardımcı olabilir

Bunun geliştirme ve inşa süreleriniz üzerinde nasıl bir etkisi oldu?

Geliştirme ve oluşturma süreleri üzerinde çok küçük bir etki - genel sürekli teslimat boru hattımız için büyük bir zaman kazancı.

Böyle bir projenin böyle bir bölünmesinin yapılandırılması için ne gibi tavsiyeler sunabilirsiniz?

Küçük şeyleri doğru yapın ve büyük şeyler daha sonra temiz bir şekilde düşme eğilimindedir. Bu yüzden işleri biraz parçalara ayırın - entegrasyon testlerinizde yüksek bir kapsama alanına sahip olmadığınız sürece, tüm partinin büyük bir yeniden yapılandırmasını yapmayın.

Bölme işleminden önce entegrasyon testleri yazın; bölme işleminden sonra az çok aynı sonuçları almalısınız.

Şimdi sahip olduğunuz modülerliğin şemalarını çizin. Ara adımlar tasarlayın.

Vazgeçmeyin - bazı Yak tıraşları , Ben ve Ben'in İyi Topraklanmış Java Geliştiricisinden "korkusuz hızla inşa edip yeniden düzenleme" yapabilmenin temelini oluşturuyor .

İyi şanslar!


0

Bunu benim almam sadece gerektiğinde ayrı. Ancak, bu bir sonraki soruyu gündeme getirir: Gerekli olup olmadığını nasıl belirlerim?

  • Artefakt farklı olduğunda (yani, aynı projede EAR, WAR, JAR, entegrasyon-test-jar'u inşa etmeyin).
  • Ayrılma sırasında bazı kodların birden fazla eserde var olması gerektiğini fark ederseniz, bunları yeni bir kodla yeniden düzenleyin.
  • Ekibinizin dışındaki başka bir proje, projenizde bulunan bir şeyi kullanmak istediğinde.

Bunun bir nedeni, geliştiricilerin birden fazla projeyle uğraşmaları ve hangi Java paketinin hangi projeye ait olması gerektiğini anlamaya çalışmasıdır. Gerçekten anemik hale gelen projelerde bulundum ve sadece mimari yönelim olduğu için bir işlevi uygulayan dört sınıfı olan bir projem vardı. Bu aynı zamanda Maven popüler olmadan önce de oldu, böylece sınıf yolları ve hem IDE hem de Ant komut dosyalarında kurulması gerekmiyor.

Diğer neden ise, dosyaları sıhhi tesisat açısından ele almak için daha hareketli parçalara sahip olmanız ve muhtemelen bilmeden önce bağımlılık spagetti'ye sahip olmanızdır.

Yeniden düzenleme, bir projede, projeler arasında değil, daha kolaydır.

Oluşturma süresi bir sorunsa, daha iyi bir donanım sağlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.