Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Użycie ENUM w Javie dla czystszego kodu

Roan Brasil Monteiro Developpeur Java / Astek Canada
Sprawdź, jak sprawić, aby Twój kod w Javie był bardziej czytelny, używając typu wyliczeniowego ENUM zamiast if/else.
Użycie ENUM w Javie dla czystszego kodu

Czasami, gdy dopiero zaczynasz pracować nad danym projektem, naprawdę trudno jest przeczytać i zrozumieć jego kod. Dzieje się to głównie wtedy, gdy ma on wiele instrukcji if/else. Podam Wam dlatego dobry sposób na stworzenie bardziej czytelnego kodu w Javie. Myśląc o SOLID, a w naszym przypadku o S (Single responsibility principle — zasada jednej odpowiedzialności), wykorzystam pomysł z Githuba mojego kolegi @Henri_Tremblay z klasą TransactionType od Montreal Java User Group. Możemy założyć, że mamy 4 typy operacji w TransactionType: BUY, SELL, DEPOSIT, WITHDRAWAL.

Dla każdej z tych operacji mam regułę obliczania wartości podatku. Jak to zrealizować? Zwykle tworzy się wtedy instrukcję if/else. Każdy to lubi, ale kod jest wtedy trudny do zrozumienia.


Co możemy zrobić, aby ulepszyć nasz kod? Czy zaakceptowalibyście to pull request? Ja na pewno nie, ponieważ wiemy, że instrukcja if może powodować problemy w kodzie, a istnieje przecież bardziej elegancki sposób.

Zobaczmy, jak łatwo ulepszyć kod, otrzymując te same wyniki — użyjemy tutaj typu wyliczeniowego ENUM.


Refaktoryzacja


Jak używać ENUM

Typ TrasanctionType będzie dobrym przykładem, ponieważ zawiera tylko kilka wartości i podobny kod mógłby się znaleźć w rzeczywistym projekcie. Pierwszym krokiem jest utworzenie klasy enum. W przykładzie tym utworzyłem klasę wyliczeniową TransactionType z metodą abstrakcyjną o nazwie doTransactionOperation.

Mamy również klasę Account z niektórymi operacjami.


Klasa account


Klasa TransactionType


W kolejnym kroku musimy zaimplementować metodę doTransactionOperation. Tworzymy regułę biznesową, która oblicza podatek dla każdego typu transakcji. Widzimy, że dla BUY podatek wynosi 0,15, dla SELL 0,1, dla DEPOSIT 0,05, a dla WITHDRAWAL - 0,20.


Klasa TransactionType


Klasa TransactionType


Jak widać, osiągnięte wyniki są takie same, a kod jest na tyle czysty, że łatwiej go zmienić niż w przypadku wielu if/else. Pomoże to zmniejszyć liczbę zagnieżdżeń, delegując odpowiedzialność do każdego enuma.

Oto wyniki.

Załóżmy, że na początku Account mamy 1000.


Użycie operacji BUY



Wyniki operacji BUY



Użycie operacji SELL



Wyniki SELL



Użycie operacji DEPOSIT



Wyniki DEPOSIT



Użycie operacji WITHDRAWAL



Wyniki WITHDRAWAL


Źródło

Henri Tremblay Github Refactoring project — TransactionType class

Oryginał tekstu w języku angielskim możesz przeczytać tutaj.

Rozpocznij dyskusję

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej