La nostra base di codici è vecchi e nuovi programmatori, come me, imparano rapidamente a farlo nel modo in cui è fatto per motivi di uniformità. Pensando che dobbiamo iniziare da qualche parte, mi sono preso la responsabilità di refactoring di una classe di titolari di dati in quanto tale:
- Rimossi i metodi setter e resi tutti i campi
final
(prendo "final
è buono" assiomaticamente). I setter sono stati utilizzati solo nel costruttore, a quanto pare, quindi questo non ha avuto effetti collaterali. - Introdotta una classe Builder
La classe Builder era necessaria perché il costruttore (che è ciò che ha richiesto il refactoring in primo luogo) si estende su circa 3 righe di codice. Ha molti parametri.
Per fortuna, un mio compagno di squadra stava lavorando su un altro modulo e aveva bisogno dei setter, perché i valori richiesti erano disponibili in diversi punti del flusso. Quindi il codice era simile al seguente:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Ho sostenuto che avrebbe dovuto usare invece il builder, perché sbarazzarsi dei setter permette ai campi di rimanere immutabili (mi hanno già sentito parlare dell'immutabilità), e anche perché i costruttori permettono alla creazione di oggetti di essere transazionale. Ho delineato il seguente pseudocodice:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Se quell'eccezione si attiva, bar
avrà dati corrotti, che sarebbero stati evitati con un builder:
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;
}
I miei compagni di squadra hanno ribattuto che l'eccezione in questione non si attiverà mai, il che è abbastanza giusto per quella particolare area di codice, ma credo che manchi la foresta per l'albero.
Il compromesso consisteva nel ritornare alla vecchia soluzione, vale a dire usare un costruttore senza parametri e impostare tutto con setter come necessario. La logica era che questa soluzione segue il principio KISS, che il mio viola.
Sono nuovo di questa azienda (meno di 6 mesi) e sono pienamente consapevole di aver perso questa. Le domande che ho sono:
- C'è un altro argomento per usare Builders invece del "vecchio modo"?
- Ne vale davvero la pena il cambiamento che propongo?
ma veramente,
- Hai qualche suggerimento per presentare meglio tali argomenti quando si sostiene di provare qualcosa di nuovo?
setA
?