Mam duży projekt Java i używamy maven do naszego cyklu budowania. Ten jeden projekt jest szeroko stosowany - w innych projektach, w różnych aplikacjach, z których niektóre są w nim zawarte, a niektóre gdzie indziej ... Szczerze mówiąc, jest to trochę bałagan (różne bity dodawane w różnych momentach dla określonych celów) i chciałbym to trochę posprzątać. Ponadto nie jest w pełni przetestowany (wiele bitów zostało dodanych bez odpowiednich testów jednostkowych i integracyjnych), a niektóre testy trwają długo lub wcale nie przechodzą ... (uh-oh) - więc testy są wyłączone w cyklu budowy maven (znowu, uh-oh).
Zastanawiam się nad podzieleniem tego dużego projektu na mniejsze konkretne projekty, tak aby „końcowy” podprojekt (lub kilka podprojektów) zbierał różne podprojekty, których potrzebowałby.
Moje myślenie jest następujące:
- jeśli podzielę duży projekt na różne podprojekty, stanie się jasne, jaka jest odpowiedzialność za każdy projekt.
- dzieląc na podprojekty, mogę następnie wyczyścić testowanie każdego podprojektu indywidualnie i włączyć testy dla tego podprojektu w cyklu budowania raju.
Jestem nieco zaniepokojony wpływem, jaki może to mieć na czas kompilacji.
- Czy nałożenie struktury na duży projekt (tj. Na mniejsze podprojekty) spowolniłoby kompilator?
Ponadto mam niewielkie obawy dotyczące wpływu, jaki może to mieć czas edytowania w IDE (głównie używamy Intellij). Wydaje się, że Intellij buduje każdy projekt kolejno przez drzewo zależności - tzn. Jeśli C zależy od B zależy od A, a ja zmienię A, nie będzie próbował zbudować B, chyba że A się skompiluje i tak dalej. Prawdopodobnie jest to korzystne, ale odkryłem, że jeśli - na przykład zmieniam interfejs w A, który jest powszechnie używany w B i C, zajmuje trochę czasu, aby naprawić wszystkie błędy z tej zmiany ...
Kolejne pytanie dotyczy sposobu korzystania z klas fabrycznych. Niektóre aspekty projektu zależą od zewnętrznych słoików. Czasami (na szczęście nie często) są one aktualizowane i musimy przeprowadzić migrację. Mamy tendencję do radzenia sobie z tym za pomocą klasy Factory, która wskazuje na poprawne wersje kodu zewnętrznego (więc nie musimy zmieniać wszystkich implementacji w całej bazie kodu).
W tej chwili jest to wszystko w dużym projekcie, ale myślę, że przechodząc do podprojektów, mógłbym opracować nowy projekt do wdrożenia nowego kodu zewnętrznego, upewnić się, że podprojekt jest w pełni funkcjonalny i przetestowany oraz następnie przełącz zależności / klasę fabryczną w projekcie użytkownika. Jest to jednak bardziej skomplikowane ze względu na szerokie zastosowanie interfejsów w całym dużym projekcie. Na przykład
- podprojekt A - zawiera interfejsy
- podprojekt B - zależy od A dla interfejsów i starego zewnętrznego słoika
- podprojekt C - zależy od B (a więc A i starego zewnętrznego słoika) i zawiera klasę Factory, która wykorzystuje implementacje interfejsów B
Jeśli muszę zmienić zewnętrzny słoik B, mogę:
- utwórz podprojekt B_ii - znowu zależy od A, a teraz nowego zewnętrznego słoika
- kiedy już będzie w pełni funkcjonalny, mogę dodać zależność C do B_ii i zmienić klasę Factory, aby korzystać z nowych implementacji interfejsów.
kiedy to wszystko działa, mogę następnie usunąć zależność C od pierwotnego B, a w razie potrzeby usunąć podprojekt B.
Czy to rozsądny sposób, aby to zrobić?
Ogólnie moje pytania są następujące:
- Czy ktoś ma doświadczenie w rozkładaniu dużych projektów? Czy są jakieś wskazówki / triki, którymi chętnie się podzielisz?
- Jaki to miało wpływ na twoje czasy rozwoju i kompilacji?
- Jaką radę mógłbyś udzielić w sprawie zorganizowania takiego rozpadu takiego projektu?