Así que recientemente realicé algunas refactorizaciones importantes en mi código. Una de las cosas principales que intenté hacer fue dividir mis clases en objetos de datos y objetos de trabajo. Esto se inspiró, entre otras cosas, en esta sección de Clean Code :
Híbridos
Esta confusión a veces conduce a desafortunadas estructuras de datos híbridos que son mitad objeto y mitad estructura de datos. Tienen funciones que hacen cosas importantes, y también tienen variables públicas o accesores públicos y mutadores que, a todos los efectos, hacen públicas las variables privadas, tentando a otras funciones externas a usar esas variables de la forma en que un programa procesal usaría un estructura de datos.
Dichos híbridos dificultan la adición de nuevas funciones, pero también dificultan la adición de nuevas estructuras de datos. Son lo peor de ambos mundos. Evita crearlos. Son indicativos de un diseño confuso cuyos autores no están seguros o, lo que es peor, ignoran, si necesitan protección contra funciones o tipos.
Recientemente estaba mirando el código de uno de mis objetos de trabajo (que sucede para implementar el Patrón de visitante ) y vi esto:
@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());
}
Inmediatamente me dije a mí mismo "¡envidia de características! Esta lógica debería estar en la Data
clase, específicamente en el handleTrade
método, handleTrade
y siempreupdateRun
debería suceder juntos". Pero luego pensé "la clase de datos es solo una estructura de datos, si empiezo a hacer eso, ¡entonces se convertirá en un Objeto Híbrido!"public
¿Qué es mejor y por qué? ¿Cómo decides qué hacer?