Recentemente ho intrapreso un refactoring di un progetto di medie dimensioni in Java per tornare indietro e aggiungere test unitari. Quando mi sono reso conto di quanto fosse dolore deridere singoletti e statici, alla fine ho "ottenuto" quello che ho letto su di loro per tutto questo tempo. (Sono una di quelle persone che hanno bisogno di imparare dall'esperienza, oh, va bene.)
Quindi, ora che sto usando Spring per creare gli oggetti e collegarli, mi sto liberando di static
parole chiave a sinistra ea destra. (Se potessi potenzialmente volerlo prendere in giro, non è proprio statico nello stesso senso in cui Math.abs () è, giusto?) Il fatto è che avevo preso l'abitudine di usare static
per denotare che un metodo non 'fare affidamento su qualsiasi stato dell'oggetto. Ad 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, qui è dove arriva il tocco delicato. Mi è piaciuto il vecchio modo perché la lettera maiuscola mi ha detto che, proprio come Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) ha fatto la stessa cosa allo stesso modo ogni volta. Non esiste uno stato oggetto per modificare il modo in cui l'oggetto fa ciò che sto chiedendo di fare. Ecco alcune possibili risposte che sto considerando.
- Nessun altro si sente così, 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 penso in FORTRAN o in somesuch. (Che sarebbe impressionante dal momento che non ho mai scritto FORTRAN.)
- Forse sto usando staticità come una sorta di proxy per l'immutabilità per gli scopi del ragionamento sul codice. Detto questo, quali indizi dovrei che ho nel mio codice per qualcuno che viene avanti per mantenerlo per sapere cosa è statico e cosa non lo è?
- Forse questo dovrebbe venire gratis se scelgo metafore oggetto buone? per esempio.
thingyWrapper
non suona come ha lo stato indipendente dal% co_de fasciato che può essere mutabile. Allo stesso modo, unThingy
suona come dovrebbe essere immutabile, ma potrebbe avere diverse strategie che vengono scelte nella creazione.