Ho un grande progetto Java e usiamo Maven per il nostro ciclo di costruzione. Questo progetto è ampiamente utilizzato - in altri progetti, in varie applicazioni, alcuni dei quali sono contenuti in esso e altri che sono altrove ... Ad essere sinceri, è un po 'un casino (vari bit aggiunti in momenti diversi per specifici scopi) e vorrei ripulirlo un po '. Inoltre, non è completamente testato (molti bit sono stati aggiunti senza un corretto test di unità e integrazione) e ci sono alcuni test che richiedono molto tempo per essere eseguiti o che in realtà non passano ... (uh-oh) - quindi 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 tale che il sottoprogetto "finale" (o diversi sottoprogetti) raccolga i vari sottoprogetti di cui avrebbe bisogno.
Il mio pensiero è il seguente:
- se separo il grande progetto in vari sottoprogetti, ciò chiarisce qual è la responsabilità di ciascun progetto.
- separandomi in sottoprogetti, posso quindi ripulire i test di ciascun sottoprogetto singolarmente e attivare i test per quel sottoprogetto nel ciclo di costruzione di Maven.
Sono leggermente preoccupato per l'impatto che questo potrebbe avere sul tempo di costruzione.
- L'imposizione di una struttura al grande progetto (ovvero in sottoprogetti più piccoli) rallenterebbe il compilatore?
Inoltre, ho una leggera preoccupazione sull'impatto che questo potrebbe avere sui tempi di modifica degli IDE (utilizziamo principalmente Intellij). Intellij sembra costruire ogni progetto a turno attraverso l'albero delle dipendenze - cioè se C dipende da B dipende da A, e cambio A, non tenterà di costruire B a meno che A non venga compilato, 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 utilizzare le classi di fabbrica. Alcuni aspetti del progetto dipendono da vasi esterni. Occasionalmente (per fortuna non spesso) questi vengono aggiornati e dobbiamo migrare. Tendiamo a gestirlo usando una classe Factory che punta alle versioni corrette del codice esterno (quindi non dobbiamo cambiare tutte le implementazioni attraverso la base di codice).
Al momento questo è tutto nel grande progetto, ma sto pensando che passando a sottoprogetti, potrei sviluppare un nuovo progetto per l'implementazione di un nuovo codice esterno, assicurarmi che il sottoprogetto sia completamente funzionale e testato, e quindi cambiare le dipendenze / la classe di fabbrica nel progetto utente. Tuttavia, ciò è reso più complicato dall'ampio uso di interfacce in tutto il grande progetto. Per esempio
- sottoprogetto A - contiene interfacce
- sottoprogetto B - dipende da A per le interfacce e il vecchio vaso esterno
- sottoprogetto C - dipende da B (e quindi da A e dal vecchio vaso esterno) e contiene una classe Factory che utilizza le implementazioni di interfacce di B
Se devo cambiare il vaso esterno di B, posso:
- creare un sottoprogetto B_ii - dipende ancora da A, e ora dal nuovo vaso esterno
- una volta pienamente funzionante, posso aggiungere la dipendenza di C a B_ii e cambiare la classe Factory per usare le nuove implementazioni delle interfacce.
quando tutto funziona, posso quindi rimuovere la dipendenza di C dall'originale B e, se lo si desidera, rimuovere il sottoprogetto B.
È un modo sensato di farlo?
Quindi, in generale, le mie domande sono:
- Qualcuno ha esperienza di rottura di grandi progetti? Ci sono suggerimenti / trucchi che vorresti condividere?
- Che impatto ha avuto sul tuo sviluppo e sui tempi di costruzione?
- Che consiglio potresti offrire sulla strutturazione di una simile rottura di un tale progetto?