Un argumento a favor del código repetitivo es que si lo cambia en un lugar, solo afecta a un flujo del código. Esto tiene que equilibrarse con el hecho de que, en la mayoría de los casos, realmente desea que un cambio afecte a cada fragmento de código que lo utiliza. Pero he visto ejemplos raros que respaldan el argumento.
Digamos que tienes un código que dice
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
Esto se usa en aproximadamente 2 lugares en su código.
Un día aparece alguien y dice "ok, solo en este camino, queremos que Grommit la barra antes de engañarlo".
Y piensas "bueno, esto es simple".
public ForTheBar(Foo foo, bool shouldIGrommit)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
return bar.BeFooed();
}
Luego, su usuario agrega algunas nuevas funcionalidades y cree que encaja bien con FooTheBar. Y obedientemente les preguntas si deberías Grommitar esa barra antes de que la engañes y te dicen "no, no esta vez".
Entonces simplemente llama al método anterior.
Pero luego su usuario dice "ok, espere, en el tercer caso, queremos que gane Doodle the Bar antes de llamar a BeFooed".
No hay problema, piensas, puedo hacer eso.
public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
if (shouldIDoodle)
{
bar.BeDoodled();
}
return bar.BeFooed();
}
De repente, su código se está volviendo menos repetitivo. Tal vez debería haber aceptado las dos líneas repetidas de código. A estas alturas, tendría tres piezas de código, cada una de 2 a 3 líneas de longitud y ya no parecería muy repetida.
Dicho todo esto, lo contrarrestaría con "este no es un caso común, y cuando sucede, puede refactorizar".
Otro argumento que escuché recientemente es que el código repetitivo a veces puede ayudarlo a navegar por el código. El ejemplo que estábamos discutiendo fue donde eliminamos toneladas de código de mapeo repetitivo y lo reemplazamos con AutoMapper. Ahora, se argumentó que, dado que todo está basado en convenciones, no puede decir "¿Dónde está establecida esta propiedad?" Al IDE y esperar que lo sepa.
He visto a personas discutir cosas similares sobre los contenedores IoC.
No quiere decir que estoy de acuerdo con ellos, pero no obstante es un argumento justo.