Nessun altro ha ancora menzionato la spada a doppio taglio, quindi aggiungerò i miei 2 centesimi. Se hai più progetti e tutti condividono del codice riutilizzabile, secondo le buone pratiche / principi di programmazione (DRY per esempio), dovresti posizionare il codice in un posto globale e strutturarlo in modo che possa essere condiviso da tutti i tuoi progetti senza alcuna modifica. In altre parole, definire le interfacce come generiche e abbastanza comuni per soddisfare tutti.
Ci sono alcune opzioni per farlo: 1) Crea un progetto base da cui dipendono gli altri. Questo progetto può creare una distribuzione binaria utilizzata da altri progetti. 2) Tirare un modello open source all'interno dell'organizzazione. Avere il codice comune come proprio ramo di codice e fare in modo che altri progetti inseriscano il codice nello stesso modo in cui si prenderebbe il codice sorgente da qualsiasi OSS online.
Ora ecco dove arriva la spada ...
Mettere il codice in un luogo comune da cui dipendono altri progetti / persone 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 del codice da cui dipendono altri 3 progetti. Hai ripetuto di nuovo tutti questi test per assicurarti che non siano state introdotte condizioni ai bordi?
Il codice comune deve anche essere creato con molta più attenzione e le interfacce dei moduli devono essere progettate molto meglio perché quel codice deve ospitare non uno ma 4 client e ognuno di questi potrebbe usare questo codice con una differenza così minima.
Se i tuoi progetti hanno cicli di rilascio diversi, devi essere ancora più attento alla gestione del codice comune. Non puoi semplicemente apportare modifiche al codice comune perché il progetto B necessita di nuove funzionalità, se hai 3 giorni di distanza dal taglio dell'immagine finale per il progetto C.
Non sto dicendo che la biblioteca comune non sia la soluzione giusta. Sono un grande sostenitore di DRY e in precedenza ho creato e supportato codice comune e continuo a farlo. Volevo solo dirlo che semplicemente rendere comune il codice avrebbe le sue spese.
Se sei l'unico a riutilizzare questo codice, non è così male. Se hai un team di ingegneri e iniziano a utilizzare il codice comune, le spese aumentano ancora di più. Se ne sono coinvolti altri, aspettati che il posizionamento del codice in una libreria comune impieghi 3 volte il tempo necessario per arrivare a un punto in cui pensi che sia "completo". Dovrai: a) rendere la libreria più solida per proteggere da tutti i tipi di condizioni limite e di utilizzo non valido, b) fornire documentazione in modo che altri possano utilizzare la libreria e c) aiutare altre persone a eseguire il debug quando usano la libreria in modo tale non ho previsto e la tua documentazione non ha riguardato il loro caso d'uso specifico.
Alcuni suggerimenti che posso offrire:
- Avere il codice comune coperto da test di unità automatizzati può fare molto e darti un'idea del fatto che quando fai una modifica, non hai semplicemente interrotto qualche altro progetto.
- Vorrei solo inserire funzionalità molto stabili nel codice comune. Se hai scritto una lezione l'anno scorso per fare la gestione del timer e non l'hai cambiata in 9 mesi e ora hai altri 3 progetti che hanno bisogno di timer, allora sicuramente è un buon candidato. Ma se hai appena scritto qualcosa la scorsa settimana, beh ... non hai molte opzioni (e odio copiare / incollare il codice probabilmente più del prossimo ragazzo) ma ci penserei due volte su come renderlo comune.
- Se il pezzo di codice è banale ma l'hai usato in diversi punti, forse è meglio mordere il proiettile, lasciare DRY da solo e lasciare vivere più copie.
- A volte vale la pena non semplicemente mettere il codice comune in una posizione comune e fare in modo che tutti lo facciano riferimento. Ma piuttosto considera il codice comune come il suo rilasciabile con le versioni, le date di rilascio e tutto il resto. In questo modo il progetto C può dire "Uso la libreria comune v1.3" e se il progetto D necessita di nuove funzionalità, si lascia v1.3 da sola, la versione v1.4 e il progetto C non ne risentono. Tieni presente che è MOLTO, MOLTO più costoso trattare il codice comune come un prodotto proprio piuttosto che semplicemente controllarlo in un luogo comune.