Bardzo ostrożnie
Rozgałęzianie funkcji jest opcją, ale uważam, że jest nieco ciężkie. Ułatwia także głębokie modyfikacje, które mogą prowadzić do rozwidlenia aplikacji, jeśli nie są pod kontrolą. Idealnie chcesz w jak największym stopniu ulepszyć dostosowania, starając się, aby Twój podstawowy kod był tak powszechny i ogólny, jak to możliwe.
Oto jak bym to zrobił, chociaż nie wiem, czy ma on zastosowanie do twojej bazy kodu bez ciężkich modyfikacji i ponownego faktoryzacji. Miałem podobny projekt, w którym podstawowa funkcjonalność była taka sama, ale każdy klient wymagał bardzo określonego zestawu funkcji. Stworzyłem zestaw modułów i kontenerów, które następnie zestawiam przez konfigurację (à la IoC).
następnie dla każdego klienta stworzyłem projekt, który zasadniczo zawiera konfiguracje i skrypt kompilacji, aby utworzyć w pełni skonfigurowaną instalację dla ich witryny. Czasami umieszczam tam również komponenty wykonane na zamówienie dla tego klienta. Jest to jednak rzadkie i ilekroć jest to możliwe, staram się zrobić to w bardziej ogólnej formie i spycham w dół, aby inne projekty mogły z nich korzystać.
W rezultacie otrzymałem poziom dostosowywania, którego potrzebowałem, otrzymałem spersonalizowane skrypty instalacyjne, aby po przejściu na stronę klienta nie wyglądało na to, że cały czas aktualizuję system, a jako bardzo znaczącą premię otrzymuję aby móc tworzyć testy regresji zaczepione bezpośrednio na kompilacji. W ten sposób za każdym razem, gdy dostaję błąd, który jest specyficzny dla klienta, mogę napisać test, który zapewni, że system jest wdrażany, a zatem może wykonać TDD nawet na tym poziomie.
w skrócie:
- Mocno modułowy system o płaskiej strukturze projektu.
- Utwórz projekt dla każdego profilu konfiguracji (klienta, chociaż więcej niż jeden może współdzielić profil)
- Złóż wymagane zestawy funkcjonalne jako inny produkt i traktuj je jako takie.
Jeśli zostanie to wykonane poprawnie, zestaw produktu powinien zawierać wszystkie pliki konfiguracyjne oprócz kilku.
Po pewnym czasie korzystania z tego skończyłem, tworząc meta-pakiety, które składają najczęściej używane lub niezbędne systemy jako jednostkę podstawową i używają tego meta-pakietu do zestawów klientów. Po kilku latach otrzymałem duży zestaw narzędzi, który mogłem bardzo szybko zmontować, aby stworzyć rozwiązania dla klientów. Obecnie patrzę na Spring Roo i sprawdzam, czy nie mogę rozwinąć tego pomysłu trochę dalej, mając nadzieję, że pewnego dnia uda mi się stworzyć pierwszy szkic systemu bezpośrednio z klientem w naszym pierwszym wywiadzie ... Wydaje mi się, że można to nazwać kierowanym przez użytkownika Rozwój ;-).
Mam nadzieję, że to pomogło
#ifdef
działa dla ciebie?