Nessun altro ha menzionato la spada a doppio taglio, quindi aggiungerò i miei 2 centesimi. Se hai più progetti e tutti condividono del codice riusabile, in base a buone pratiche di programmazione / principi (ad esempio DRY), devi posizionare il codice in un luogo globale e strutturarlo in modo tale che possa essere condiviso da tutti i tuoi progetti senza modifiche. In altre parole, definisci le interfacce generiche e abbastanza comuni per soddisfare tutti.
Ci sono poche opzioni per farlo:
1) Creare un progetto di base da cui dipendono gli altri. Questo progetto può creare una distribuzione binaria che altri progetti consumano.
2) Tirare un modello open-source all'interno dell'organizzazione. Avere codice comune è il proprio ramo di codice e fare in modo che altri progetti eseguano il codice nello stesso modo in cui si prenderà il codice sorgente da qualsiasi OSS online.
Ora qui è dove entra la spada ...
Inserire codice in un luogo comune su cui altri progetti / persone dipendono può diventare piuttosto costoso. Diciamo che hai un pezzo di codice e altri 4 progetti dipendono da questo. Uno dei tuoi clienti che utilizza il progetto A trova un bug e devi fare una correzione. Ti affretti a risolvere il problema e quel cliente è felice. Ma hai appena modificato un codice da cui dipendono altri 3 progetti. Hai ripetuto di nuovo tutti quelli per assicurarti che non siano state introdotte condizioni marginali?
Il codice comune deve anche essere creato molto più attentamente e le interfacce dei moduli devono essere progettate in modo molto migliore perché quel codice deve ospitare non uno ma 4 client e ognuno di questi potrebbe semplicemente usare questo codice con una differenza così lieve.
Se i tuoi progetti sono in cicli di rilascio diversi, devi essere ancora più attento a gestire il codice comune. Non puoi semplicemente apportare modifiche nel codice comune perché il progetto B ha bisogno di nuove funzionalità, se mancano 3 giorni al taglio dell'immagine finale per il progetto C.
Non sto dicendo che la libreria comune non è la soluzione giusta. Sono un strong sostenitore di DRY e ho creato e supportato codice comune prima e continuo a farlo. Volevo solo metterlo lì fuori che semplicemente facendo codice comune avrà le proprie spese.
Se sei l'unico a riutilizzare questo codice, non è così male. Se hai un team di ingegneri e iniziano a usare il codice comune, le spese aumentano ancora di più. Se altri sono coinvolti, si aspetti di inserire il codice in una libreria comune per impiegare 3 volte il tempo necessario per arrivare a un punto in cui pensi che sia "completo". Sarà necessario a) rendere la libreria più robusta per proteggere da tutti i tipi di condizioni marginali e utilizzo non valido, b) fornire documentazione in modo che altri possano utilizzare la libreria ec) aiutare altre persone a eseguire il debug quando utilizzano la libreria in un modo non ho previsto e la tua documentazione non copre il loro caso d'uso specifico.
Pochi suggerimenti che posso offrire:
- Avere un codice comune coperto da test unitari automatizzati può fare molto e ti dà un po 'di idea che quando apporti una modifica, non hai interrotto solo un altro progetto.
- Metterei solo funzionalità molto stabili nel codice comune. Se hai scritto un corso lo scorso anno per gestire il timer e non lo hai cambiato in 9 mesi e ora hai altri 3 progetti che hanno bisogno di timer, assicurati che sia un buon candidato. Ma se hai appena scritto qualcosa la settimana scorsa, beh ... non hai molte opzioni (e odio il codice copia / incolla probabilmente più del prossimo) ma ci penserei due volte prima di renderlo comune.
- Se un pezzo di codice è banale ma lo hai usato in più punti, forse è meglio mordere il proiettile, lasciare DRY da solo e lasciare vivere più copie.
- A volte vale la pena di non inserire semplicemente il codice comune in un percorso comune e farne riferimento da tutti. Piuttosto, tratta il codice comune come se fosse rilasciabile con versioni, date di rilascio e altro. In questo modo il progetto C può dire: "Io uso la libreria comune v1.3" e se il progetto D ha bisogno di nuove funzionalità, si lascia solo la versione 1.3, si rilascia la versione 1.4 e il progetto C non ne risente. Tieni presente che è MOLTO, MOLTO più costoso trattare il codice comune come prodotto proprio piuttosto che averlo semplicemente controllato in una posizione comune.