Ho un grande progetto java e usiamo Maven per il nostro ciclo di build. Questo progetto è ampiamente utilizzato - in altri progetti, in varie applicazioni, alcuni dei quali sono contenuti in esso e altri che sono altrove ... Per essere onesti, è un po 'un casino (diversi bit aggiunti in momenti diversi per specifici scopi), e mi piacerebbe pulirlo un po '. Inoltre, non è completamente testato (sono stati aggiunti molti bit senza test di unità e integrazione adeguati), e ci sono alcuni test che richiedono molto tempo per essere eseguiti o che non passano effettivamente ... (uh-oh) - così i test sono disattivati nel ciclo di costruzione di Maven (di nuovo, uh-oh).
Sto pensando di separare questo grande progetto in progetti specifici più piccoli, in modo che il sottoprogetto "finale" (o diversi sottoprogetti) raccolga i vari sottoprogetti di cui avrebbe bisogno.
Il mio modo di pensare è il seguente:
- se separo il grande progetto in vari sottoprogetti, questo rende chiaro quale sia la responsabilità di ciascun progetto.
- separando in sottoprogetti, posso quindi ripulire individualmente i test di ciascun sottoprogetto e attivare il test per quel sottoprogetto nel ciclo di costruzione di maven.
Sono leggermente preoccupato per l'impatto che questo potrebbe avere sul tempo di costruzione.
- Imporre una struttura al progetto di grandi dimensioni (ad esempio in sottoprogetti più piccoli) rallenterebbe il compilatore?
Inoltre, ho una leggera preoccupazione sull'impatto che questo potrebbe avere nel tempo di editing degli IDE (principalmente utilizziamo Intellij). Intellij sembra costruire ogni progetto a sua volta attraverso l'albero delle dipendenze - cioè se C dipende da B dipende da A, e io cambio A, non proverò a costruire B a meno che A non compili, e così via. Probabilmente è vantaggioso, ma ho scoperto che se, ad esempio, cambio un'interfaccia in A ampiamente utilizzata in B e C, ci vuole del tempo per correggere tutti gli errori da quella modifica ...
Un'altra domanda è come usare le classi di fabbrica. Alcuni aspetti del progetto dipendono da vasi esterni. Occasionalmente (per fortuna non spesso) questi sono aggiornati, e dobbiamo migrare. Tendiamo a gestirlo utilizzando una classe Factory che punta alle versioni corrette del codice esterno (quindi non è necessario modificare tutte le implementazioni in tutto il codice base).
Al momento questo è tutto nel grande progetto, ma sto pensando che passando a progetti, potrei sviluppare un nuovo progetto per l'implementazione di un nuovo codice esterno, assicurarmi che il sottoprogetto sia completamente funzionale e testato, e quindi passare le dipendenze / classe factory nel progetto utente. Tuttavia, questo è reso più complicato dall'uso esteso delle interfacce in tutto il grande progetto. Ad esempio
- sottoprogetto A - contiene interfacce
- progetto secondario B - dipende da A per interfacce e vecchio jar esterno
- sotto-progetto C - dipende da B (e quindi A e vecchio jar esterno) e contiene una classe Factory che utilizza le implementazioni di interfacce di B
Se ho bisogno di cambiare il barattolo esterno di B, posso:
- crea il sottoprogetto B_ii - di nuovo dipende da A, e ora il nuovo jar esterno
- una volta completamente funzionante, posso aggiungere la dipendenza di C a B_ii e cambiare la classe Factory per usare le nuove implementazioni di interfacce.
-
quando tutto funziona, posso rimuovere la dipendenza di C dall'originale B e, se lo desideri, rimuovere il sottoprogetto B.
-
È un modo sensato di fare questo?
Quindi, in generale, le mie domande sono:
- Qualcuno ha qualche esperienza di rottura di grandi progetti? Ci sono suggerimenti / trucchi che vorresti condividere?
- Che impatto ha avuto sul tuo sviluppo e i tempi di costruzione?
- Che consiglio potresti offrire per strutturare una tale rottura di un simile progetto?