Niedawno dokonałem poważnych zmian w moim kodzie. Jedną z głównych rzeczy, które próbowałem zrobić, było podzielenie moich klas na obiekty danych i obiekty robocze. Zostało to zainspirowane między innymi przez tę sekcję Clean Code :
Hybrydy
To zamieszanie czasami prowadzi do niefortunnych hybrydowych struktur danych, które są w połowie obiektowymi i w połowie strukturami danych. Mają funkcje, które robią znaczące rzeczy, a także mają zmienne publiczne lub publiczne akcesory i mutatory, które pod każdym względem upubliczniają zmienne prywatne, kusząc inne funkcje zewnętrzne do używania tych zmiennych w sposób, w jaki program proceduralny użyłby struktura danych.
Takie hybrydy utrudniają dodawanie nowych funkcji, ale także utrudniają dodawanie nowych struktur danych. Są najgorsze z obu światów. Unikaj ich tworzenia. Wskazują na zagmatwany projekt, którego autorzy nie są pewni - lub gorzej, nie wiedzą - czy potrzebują ochrony przed funkcjami lub typami.
Ostatnio patrzyłem na kod jednego z moich obiektów roboczych (który zdarza się zaimplementować wzorzec gościa ) i zobaczyłem to:
@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());
}
Natychmiast powiedziałem sobie: „zazdrość o cechy! Ta logika powinna być w Data
klasie - szczególnie w handleTrade
metodzie. handleTrade
I zawszeupdateRun
powinna się zdarzyć razem”. Ale potem pomyślałem: „klasa danych jest tylko strukturą danych, jeśli zacznę to robić, to stanie się Obiektem Hybrydowym!”public
Co jest lepsze i dlaczego? Jak decydujesz, co zrobić?