Daher habe ich kürzlich einige wichtige Änderungen an meinem Code vorgenommen. Eines der wichtigsten Dinge, die ich versuchte, war, meine Klassen in Datenobjekte und Arbeitsobjekte aufzuteilen. Dies wurde unter anderem durch diesen Abschnitt von Clean Code inspiriert :
Hybriden
Diese Verwirrung führt manchmal zu unglücklichen hybriden Datenstrukturen, die halb Objekt- und halb Datenstruktur sind. Sie haben Funktionen, die wichtige Dinge tun, und sie haben entweder öffentliche Variablen oder öffentliche Zugriffsmethoden und Mutatoren, die die privaten Variablen in jeder Hinsicht öffentlich machen und andere externe Funktionen dazu verleiten, diese Variablen so zu verwenden, wie ein prozedurales Programm a verwenden würde Datenstruktur.
Solche Hybride erschweren das Hinzufügen neuer Funktionen, aber auch das Hinzufügen neuer Datenstrukturen. Sie sind die schlimmsten beider Welten. Vermeiden Sie es, sie zu erstellen. Sie weisen auf ein durcheinandergebrachtes Design hin, dessen Autoren sich nicht sicher sind oder gar nicht wissen, ob sie Schutz vor Funktionen oder Typen benötigen.
Kürzlich habe ich mir den Code für eines meiner Worker-Objekte angesehen (das zufällig das Besuchermuster implementiert ) und Folgendes gesehen:
@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());
}
Ich sagte mir sofort: "Feature Neid! Diese Logik sollte in der Data
Klasse sein - speziell in der handleTrade
Methode. handleTrade
Und updateRun
sollte immer zusammen passieren." Aber dann dachte ich: "Die Datenklasse ist nur eine public
Datenstruktur. Wenn ich damit anfange, wird es ein Hybridobjekt!"
Was ist besser und warum? Wie entscheiden Sie, was zu tun ist?