Nuestra base de código es antigua y los nuevos programadores, como yo, aprenden rápidamente a hacerlo de la misma manera en aras de la uniformidad. Pensando que tenemos que comenzar en alguna parte, me encargué de refactorizar una clase de titular de datos como tal:
- Se eliminaron los métodos de establecimiento y se hicieron todos los campos
final
(tomo "final
es bueno" axiomáticamente). Los setters se usaron solo en el constructor, como resultado, por lo que esto no tuvo efectos secundarios. - Introdujo una clase de constructor
La clase Builder era necesaria porque el constructor (que es lo que provocó la refactorización en primer lugar) abarca aproximadamente 3 líneas de código. Tiene muchos parámetros.
Por suerte, un compañero de equipo mío estaba trabajando en otro módulo y necesitó los setters, porque los valores que requería estaban disponibles en diferentes puntos del flujo. Por lo tanto, el código se veía así:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Argumenté que debería usar el generador en su lugar, porque deshacerse de los establecedores permite que los campos permanezcan inmutables (ya me han escuchado hablar sobre la inmutabilidad antes), y también porque los constructores permiten que la creación de objetos sea transaccional. Dibujé el siguiente pseudocódigo:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Si se dispara esa excepción, bar
habrá datos corruptos, que se habrían evitado con un generador:
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
Mis compañeros de equipo respondieron que la excepción en cuestión nunca se disparará, lo cual es lo suficientemente justo para esa área de código en particular, pero creo que falta el bosque para el árbol.
El compromiso era volver a la solución anterior, es decir, usar un constructor sin parámetros y configurar todo con los establecedores según sea necesario. La razón era que esta solución sigue el principio KISS, que el mío viola.
Soy nuevo en esta empresa (menos de 6 meses) y estoy completamente consciente de que perdí esta. Las preguntas que tengo son:
- ¿Hay otro argumento para usar Builders en lugar de la "vieja forma"?
- ¿Vale la pena el cambio que propongo?
pero en serio,
- ¿Tiene algún consejo para presentar mejor tales argumentos cuando aboga por probar algo nuevo?
setA
?