Sto cercando una guida sull'accoppiamento DRY vs Code. Non mi piace duplicare il mio codice e non mi piace nemmeno l'accoppiamento del codice tra moduli non correlati. Quindi refactoring codice duplicato se trovo codice identicamente duplicato un anno dopo l'introduzione della duplicazione. Tuttavia, ho sperimentato sempre più situazioni in cui il mondo reale è molto più imprevedibile e, dopo il refactoring del codice, sorgono situazioni che richiedono di nuovo il bucato del codice.
Ad esempio, se avessi il codice per gestire le auto a benzina, i SUV a benzina, le auto elettriche e i SUV elettrici, diciamo che ho modificato il codice duplicato nella gerarchia "benzina" e nella gerarchia "elettrica", entrambe discendenti dalla gerarchia "veicolo". Fin qui tutto bene. E poi, la mia azienda introduce un'auto ibrida e una Semi ibrida, che richiederebbe cambiamenti fondamentali nella mia stessa gerarchia originale. Forse richiederebbe una "composizione" tra la benzina e le gerarchie elettriche.
Chiaramente la duplicazione del codice non è buona perché aumenta il tempo impiegato per implementare una modifica comune a tutti i prodotti di cui sopra. Ma il refactoring del codice comune rende altrettanto difficile introdurre variazioni specifiche del prodotto e porta a un sacco di "salto di classe" quando si deve trovare la riga di codice per correggere un bug - un cambiamento in una classe genitore di livello superiore potrebbe innescare innescare bug di regressione tra tutti i discendenti.
Come si fa a trovare un equilibrio ottimale tra DRY e accoppiamento indesiderato del codice?