Quindi di recente ho apportato alcuni importanti refactoring al mio codice. Una delle cose principali che ho provato a fare era dividere le mie classi in oggetti dati e oggetti di lavoro. Questo è stato ispirato, tra le altre cose, da questa sezione di Pulisci codice :
Hybrids
This confusion sometimes leads to unfortunate hybrid data structures that are half object and half data structure. They have functions that do significant things, and they also have either public variables or public accessors and mutators that, for all intents and purposes, make the private variables public, tempting other external functions to use those variables the way a procedural program would use a data structure.
Such hybrids make it hard to add new functions but also make it hard to add new data structures. They are the worst of both worlds. Avoid creating them. They are indicative of a muddled design whose authors are unsure of - or worse, ignorant of - whether they need protection from functions or types.
Recentemente stavo guardando il codice a uno dei miei oggetti di lavoro (che accade implementando il Pattern visitatori ) e visto questo:
@Override
public void visit(MarketTrade trade) {
this.data.handleTrade(trade);
updateRun(trade);
}
private void updateRun(MarketTrade newTrade) {
if(this.data.getLastAggressor() != newTrade.getAggressor()) {
this.data.setRunLength(0);
this.data.setLastAggressor(newTrade.getAggressor());
}
this.data.setRunLength(this.data.getRunLength() + newTrade.getLots());
}
Ho subito detto a me stesso "invidia per feature! questa logica dovrebbe essere nella classe Data
- in particolare nel metodo handleTrade
. handleTrade
e updateRun
dovrebbe sempre avvenire insieme" . Ma poi ho pensato "la classe dati è solo una struttura dati public
, se comincio a farlo, allora verrà un oggetto ibrido!"
Cosa c'è di meglio e perché? Come decidi tu cosa fare?