Так что я недавно сделал несколько серьезных рефакторингов в своем коде. Одной из основных вещей, которые я пытался сделать, было разделение моих классов на объекты данных и рабочие объекты. Это было вдохновлено, среди прочего, этим разделом Чистого кода :
Гибриды
Эта путаница иногда приводит к неудачным гибридным структурам данных, которые являются наполовину объектами и наполовину структурами данных. У них есть функции, которые делают важные вещи, и у них также есть либо открытые переменные, либо открытые методы доступа и мутаторы, которые, для всех намерений и целей, делают частные переменные общедоступными, побуждая другие внешние функции использовать эти переменные так, как процедурная программа будет использовать структура данных.
Такие гибриды затрудняют добавление новых функций, но также затрудняют добавление новых структур данных. Они худшие из обоих миров. Избегайте их создания. Они указывают на запутанный дизайн, авторы которого не уверены - или, что еще хуже, не знают - нуждаются ли они в защите от функций или типов.
Недавно я просматривал код одного из моих рабочих объектов (который реализует шаблон посетителя ) и увидел следующее:
@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());
}
Я сразу сказал себе: «Завидую особенностью! Эта логика должна быть в Data
классе, особенно в handleTrade
методе, handleTrade
и всегдаupdateRun
должна происходить вместе». Но потом я подумал, что «класс данных - это просто структура данных, если я начну это делать, то это будет гибридный объект!»public
Что лучше и почему? Как вы решаете, что делать?