Estoy buscando orientación sobre el acoplamiento DRY vs Código. 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 codificar el código.
Por ejemplo, si tuviera un código para manejar automóviles de gasolina, SUV de gasolina, automóviles eléctricos y SUV eléctrico, digamos que he refactorizado código duplicado en la jerarquía de "gasolina" y la jerarquía de "eléctrico", ambos descendiendo del "vehículo" jerarquía. Hasta ahora tan bueno. Y luego, mi empresa presenta un automóvil híbrido y un Semi híbrido, que requerirían cambios centrales en mi jerarquía original. Tal vez requeriría una "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 el código común de refactorizació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 primaria de nivel superior podría desencadenar errores de regresión entre todos los descendientes.
¿Cómo se logra un equilibrio óptimo entre el acoplamiento de código DRY y no deseado?