Sto cercando indicazioni su accoppiamento DRY vs codice. Non mi piace duplicare il mio codice e inoltre non mi piace l'accoppiamento di codice tra moduli non correlati. Quindi io refactoring il codice duplicato se trovo il codice identicamente duplicato un anno dopo che la duplicazione è stata introdotta. Tuttavia, ho sempre più sperimentato situazioni in cui il mondo reale è molto più imprevedibile e, dopo aver rifatto il codice, sorgono situazioni che richiedono di nuovo il codice.
Ad esempio, se avessi il codice per gestire auto a benzina, SUV a benzina, auto elettriche e SUV elettrici, diciamo che ho rifatto il codice duplicato nella gerarchia della "benzina" e nella gerarchia "elettrica", entrambi discendenti dal "veicolo" gerarchia. Fin qui tutto bene. E poi, la mia azienda introduce un'auto ibrida e una semi ibrida - che richiederebbe modifiche fondamentali alla mia stessa gerarchia originale. Forse richiederebbe "composizione" tra la benzina e le gerarchie elettriche.
La duplicazione del codice chiaramente non è buona perché aumenta il tempo necessario per implementare una modifica comune a tutti i prodotti sopra citati. Ma il refactoring del codice comune rende ugualmente difficile introdurre variazioni specifiche del prodotto, e porta a un sacco di "salto di classe" quando si deve trovare la linea di codice per correggere un bug - una modifica in una classe genitore di livello superiore potrebbe innescare i bug di regressione del trigger tra tutti i discendenti.
Come si ottiene un equilibrio ottimale tra DRY e accoppiamento di codice indesiderato?