Tengo un código que es casi idéntico, pero usa tipos absolutamente diferentes, sin herencia entre ellos, en la variable principal. Específicamente, estoy escribiendo un analizador con Roslyn para C # y VB.NET, con los siguientes tipos:
Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax
Me pregunto si, debido a que el código está haciendo lo mismo, debería mantenerlo lo más SECO posible, dividiéndolo lo menos posible en métodos separados (pero idénticos aparte del tipo), o separarlo completamente porque los dos métodos son cambios no relacionados y futuros podrían obligar a una versión a cambiar, pero no a la otra (aunque esto es poco probable)?
Editar: Un año más tarde, llegué a este mismo problema, y el equipo de Roslyn me ayudó a resolverlo: escriba una clase base que tome genéricos y tenga un TAttributeSyntax
parámetro que haga la mayor parte del trabajo. Luego, escriba las clases derivadas con el mínimo de datos que necesita un tipo específico.
Respuestas:
No haces DRY porque alguien lo escribió en un libro en algún lugar que es bueno hacer, lo haces DRY porque en realidad tiene beneficios tangibles.
Específicamente de esa pregunta:
Entonces, básicamente, no pienses "oh hombre, este código es bastante similar, tal vez debería refactorizar para no repetirme". Piense "¿la refactorización para hacer que esta base de código reutilice elementos comunes hace que el código sea más fácil de mantener o menos mantenible ?" Luego, elija el que lo haga más fácil de mantener.
Dicho esto, dado el SRP y solo tratar de tener clases pequeñas y flexibles en general, podría tener sentido analizar su código por esa razón , separar partes de comportamiento que usan tipos genéricos (usted dijo que son idénticos aparte del tipo) en Clases pequeñas. Luego descubrirá que algunas de estas clases en realidad son totalmente idénticas (no solo casi idénticas), y luego puede crear un kit de herramientas en caso de que desee agregar
Microsoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntax
.fuente