Estoy buscando orientación sobre el acoplamiento DRY vs Code. No me gusta duplicar mi código y tampoco me gusta el acoplamiento de código entre módulos no relacionados. Así que refactorizo el código duplicado si encuentro un código idénticamente duplicado un año después de que se introdujo la duplicación. Sin embargo, he experimentado cada vez más situaciones en las que el mundo real es mucho más impredecible, y después de refactorizar el código, surgen situaciones que requieren volver a descifrar el código.
Por ejemplo, si tuviera un código para manejar autos de gasolina, SUV de gasolina, autos eléctricos y SUV eléctricos, digamos que refactoré el código duplicado en la jerarquía de "gasolina" y en la jerarquía de "electricidad", ambos descendiendo de la jerarquía de "vehículos". Hasta aquí todo bien. Y luego, mi compañía presenta un automóvil híbrido y un Semi híbrido, que requeriría cambios centrales en mi jerarquía original. Tal vez requeriría "composición" entre la gasolina y las jerarquías eléctricas.
Claramente, la duplicación de código es mala porque aumenta el tiempo necesario para implementar un cambio común a todos los productos anteriores. Pero la refactorización del código común hace que sea igualmente difícil introducir variaciones específicas del producto, y conduce a muchos "saltos de clase" cuando uno tiene que encontrar la línea de código para corregir un error: un cambio en una clase principal de nivel superior podría desencadenar errores de regresión desencadenante entre todos los descendientes.
¿Cómo se logra un equilibrio óptimo entre DRY y el acoplamiento de código no deseado?