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.