J'ai donc récemment fait quelques remaniements majeurs de mon code. L'une des principales choses que j'ai essayé de faire était de diviser mes classes en objets de données et objets de travail. Cela a été inspiré, entre autres, par cette section de Clean Code :
Hybrides
Cette confusion conduit parfois à des structures de données hybrides malheureuses qui sont à moitié objet et à moitié structure de données. Ils ont des fonctions qui font des choses importantes, et ils ont aussi des variables publiques ou des accesseurs et mutateurs publics qui, à toutes fins utiles, rendent les variables privées publiques, tentant d'autres fonctions externes d'utiliser ces variables comme un programme procédural utiliserait un Structure de données.
De tels hybrides rendent difficile l'ajout de nouvelles fonctions mais rendent également difficile l'ajout de nouvelles structures de données. Ce sont les pires des deux mondes. Évitez de les créer. Ils indiquent une conception confuse dont les auteurs ne savent pas - ou pire, ignorent - s'ils ont besoin d'une protection contre les fonctions ou les types.
Récemment, je regardais le code d'un de mes objets de travail (qui implémente le modèle de visiteur ) et j'ai vu ceci:
@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());
}
Je me suis tout de suite dit "envie de fonctionnalité! Cette logique doit être dans la Data
classe - spécifiquement dans la handleTrade
méthode. handleTrade
Et updateRun
doit toujours se passer ensemble". Mais alors j'ai pensé que "la classe de données n'est qu'une public
structure de données, si je commence à le faire, alors ce sera un objet hybride!"
Quoi de mieux et pourquoi? Comment décidez-vous quoi faire?