Nossa base de código é antiga e novos programadores, como eu, aprendem rapidamente a fazê-lo da maneira que é feita em prol da uniformidade. Pensando que precisamos começar em algum lugar, decidi refatorar uma classe de detentores de dados como tal:
- Removemos os métodos setter e criamos todos os campos
final
(entendo "final
é bom" axiomaticamente). Os setters foram usados apenas no construtor, como se vê, então isso não teve efeitos colaterais. - Introduziu uma classe Builder
A classe Builder era necessária porque o construtor (que é o que levou à refatoração em primeiro lugar) abrange cerca de três linhas de código. Tem muitos parâmetros.
Por sorte, um colega de equipe meu estava trabalhando em outro módulo e precisou dos levantadores, porque os valores que ele exigiu ficaram disponíveis em diferentes pontos do fluxo. Assim, o código ficou assim:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Argumentei que ele deveria usar o construtor em vez disso, porque livrar-se dos levantadores permite que os campos permaneçam imutáveis (eles já me ouviram falar sobre imutabilidade antes) e também porque os construtores permitem que a criação de objetos seja transacional. Esbocei o seguinte pseudocódigo:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Se essa exceção for acionada, bar
haverá dados corrompidos, o que teria sido evitado com um construtor:
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;
}
Meus colegas de equipe replicaram que a exceção em questão nunca será acionada, o que é justo o suficiente para essa área específica de código, mas acredito que esteja faltando a floresta para a árvore.
O compromisso foi reverter para a solução antiga, ou seja, usar um construtor sem parâmetros e definir tudo com os configuradores, conforme necessário. A lógica era que essa solução segue o princípio do KISS, que a minha viola.
Sou novo nesta empresa (há menos de 6 meses) e tenho plena consciência de que perdi esta. As perguntas que tenho são:
- Existe outro argumento para o uso de construtores em vez da "maneira antiga"?
- A mudança que proponho vale mesmo a pena?
mas realmente,
- Você tem alguma dica para apresentar melhor esses argumentos ao defender algo novo?
setA
?