Di recente ho intrapreso un refactoring di un progetto di medie dimensioni in Java per tornare indietro e aggiungere test unitari. Quando mi sono reso conto che dolore è stato deridere i singoli e la statica, ho finalmente "capito" quello che ho letto su di loro tutto questo tempo. (Sono una di quelle persone che hanno bisogno di imparare dall'esperienza. Vabbè.)
Quindi, ora che sto usando Spring per creare gli oggetti e collegarli, mi sto sbarazzando delle static
parole chiave a destra e sinistra. (Se potessi potenzialmente volerlo deridere, non è proprio statico nello stesso senso in cui Math.abs () è, giusto?) Il fatto è che mi ero abituato static
a usare per indicare che un metodo non faceva affidamento su qualsiasi stato dell'oggetto. Per esempio:
//Before
import com.thirdparty.ThirdPartyLibrary.Thingy;
public class ThirdPartyLibraryWrapper {
public static Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
ThirdPartyLibraryWrapper.newThingy(input);
//After
public class ThirdPartyFactory {
public Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
thirdPartyFactoryInstance.newThingy(input);
Quindi, ecco dove diventa permaloso. Mi piaceva alla vecchia maniera perché la lettera maiuscola mi diceva che, proprio come Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) faceva la stessa cosa ogni volta allo stesso modo. Non esiste uno stato oggetto per cambiare il modo in cui l'oggetto fa quello che gli sto chiedendo di fare. Ecco alcune possibili risposte che sto prendendo in considerazione.
- Nessun altro si sente così, quindi c'è qualcosa che non va in me. Forse non ho proprio interiorizzato il modo OO di fare le cose! Forse sto scrivendo in Java ma sto pensando a FORTRAN o qualcosa del genere. (Il che sarebbe impressionante dato che non ho mai scritto FORTRAN.)
- Forse sto usando la staticità come una sorta di proxy per l'immutabilità ai fini del ragionamento sul codice. Detto questo, quali indizi dovrei avere nel mio codice per qualcuno che viene per mantenerlo per sapere cosa è stato e cosa no?
- Forse questo dovrebbe venire gratis se scelgo metafore di oggetti buoni? ad esempio
thingyWrapper
, non suona come se avesse uno stato indipendente dall'involucroThingy
che può essere esso stesso mutabile. Allo stesso modo,thingyFactory
sembra che dovrebbe essere immutabile, ma potrebbe avere diverse strategie che sono state scelte al momento della creazione.