Il nostro codebase è vecchio e nuovi programmatori, come me, imparano velocemente a farlo come è fatto per uniformità. Pensando che dobbiamo iniziare da qualche parte, mi sono assunto il compito di refactoring di una classe data holder 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, come risulta, 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 3 righe di codice. Ha molti di parametri.
Per fortuna, un mio compagno di squadra stava lavorando su un altro modulo e capitò di aver bisogno dei setter, perché i valori richiesti erano disponibili in diversi punti del flusso. Quindi il codice assomigliava a questo:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Ho sostenuto che avrebbe dovuto usare il builder, perché eliminare i setter consente ai campi di rimanere immutabili (mi hanno sentito lamentarmi dell'immutabilità prima) e anche perché i costruttori consentono la creazione di oggetti come transazionale. Ho abbozzato il seguente pseudocodice:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Se l'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 replicato che l'eccezione in questione non sparerà mai, il che è abbastanza giusto per quella particolare area di codice, ma credo che manchi la foresta per l'albero.
Il compromesso era quello di ripristinare la vecchia soluzione, ovvero utilizzare un costruttore senza parametri e impostare tutto con i setter secondo necessità. La logica era che questa soluzione segue il principio KISS, che viola il mio.
Sono nuovo in questa azienda (meno di 6 mesi) e pienamente consapevole di aver perso questo. Le domande che ho sono:
- C'è un altro argomento per usare i Builder al posto di "old way"?
- Il cambiamento che propongo vale davvero la pena?
ma davvero,
- Hai qualche consiglio per una migliore presentazione di tali argomenti quando proponi di provare qualcosa di nuovo?