Тому я нещодавно зробив деякі основні рефактори для свого коду. Однією з головних речей, які я намагався зробити, було розподіл моїх класів на об'єкти даних та робочі об'єкти. На це, серед іншого, надихнув цей розділ чистого коду :
Гібриди
Ця плутанина іноді призводить до нещасних гібридних структур даних, які є наполовину об'єктною та наполовину структурою даних. У них є функції, які роблять значні речі, і вони також мають або загальнодоступні змінні, або загальнодоступні приєднувачі та мутатори, які за будь-яких намірів і цілей роблять приватні змінні загальнодоступними, спокушаючи інші зовнішні функції використовувати ці змінні так, як використовує процедурна програма структура даних.
Такі гібриди ускладнюють додавання нових функцій, але також ускладнюють додавання нових структур даних. Вони найгірші з обох світів. Уникайте їх створення. Вони вказують на заплутану конструкцію, автори якої не впевнені - чи, ще гірше, не знають, чи потребують вони захисту від функцій чи типів.
Нещодавно я переглядав код на один із своїх робочих об'єктів (це трапляється реалізувати шаблон відвідувачів ) і побачив це:
@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
Що краще і чому? Як ви вирішите, що робити?