Então, recentemente fiz algumas refatorações importantes no meu código. Uma das principais coisas que tentei fazer foi dividir minhas classes em objetos de dados e objetos de trabalho. Isso foi inspirado, entre outras coisas, por esta seção do Código Limpo :
Híbridos
Essa confusão às vezes leva a estruturas de dados híbridas infelizes que são meio objeto e meia estrutura de dados. Eles têm funções que fazem coisas significativas e também têm variáveis públicas ou acessadores e mutadores públicos que, para todos os efeitos, tornam públicas as variáveis privadas, tentando outras funções externas a usar essas variáveis da maneira que um programa procedural usaria. estrutura de dados.
Tais híbridos dificultam a adição de novas funções, mas também dificultam a adição de novas estruturas de dados. Eles são os piores dos dois mundos. Evite criá-los. Eles são indicativos de um design confuso cujos autores não têm certeza - ou pior, ignoram - se precisam de proteção contra funções ou tipos.
Recentemente, eu estava olhando o código para um dos meus objetos de trabalho (que implementa o Padrão de Visitante ) e vi isso:
@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());
}
Eu disse imediatamente a mim mesmo "característica invejosa! Essa lógica deve estar na Data
classe - especificamente no handleTrade
método. handleTrade
E sempreupdateRun
deve acontecer juntos". Mas então pensei: "a classe de dados é apenas uma estrutura de dados; se eu começar a fazer isso, será um objeto híbrido!"public
O que é melhor e por quê? Como você decide o que fazer?