Strategia

Strategia należy do kategorii wzorców czynnościowych. Służy ona do zdefiniowa grupy  hermetycznych, wymiennych algorytmów. Warto o nim pomyśleć kiedy w kodzie, który czytasz widziszów bardzo dużo instrukcji warunkowych (if).

Zakładam, że przeczytałeś dwa zdania powyżej i nadal nie wiesz co to jest wzorzec startegia, po co go używać i jakie korzyści z niego płyną.

Pokażę strategię na bardzo prostym przykładzie.

Doliczanie podatku do rachunku z kodem rabatowym w sklepie internetowym

Niby prosta czynność. Do ceny końcowej należy dodać 23% VAT, a od ceny końcowej odjąć kwotę z kuponu rabatowego. Tak byśmy zrobili w Polsce. Załóżmy czysto teoretycznie. (Proszę się nie czepiać, przykład jest naciągany), że w Peru rabat dotyczy ceny netto, czyli najpierw od ceny końcowej odejmujemy kwotę z kuponu rabatowego a następnie doliczymy 21% VAT (Pewnie to bzdura ale załóżmy, że mają inny VAT). Natomiat na Węgrzech sytuacja wygląda podobnie jak w Polsce ale VAT wynosi 19% (bzdura).

Metoda, która obliczałaby podatek według tego scenariusza mogła by wyglądać na przykład tak:

Nie wygląda groźnie. Narazie! Wyobraź sobie sytuację, że nie obsługujesz 3 krajów a 100. Logika obliczania podatków może być różna, mogą dojść dodatkowe warunki. Na przykład jeżeli kwota jest mniejsza od 100 $ to jest stawka VAT 20% a poniżej 100 $ 5 %VAT (Hipotetyczna sytuacja). Instrukacja warunkowa staje się olbrzymia i nie czytelna. Wprowadzenie dodatkowych warunków jeszcze bardziej ją komplikuje. Co z tym zrobić? Jak lepiej to zaimplementować? Z pomocą przychodzi startegia.

W tym przykładzie nie pozbyliśmy się dużego if’a. Jednak na tym etapie można bardzo łatwo się go pozbyć. Wystarczy tworzyć obiekty refleksją lub konfigurując odpowiednio kontener IoC(czyli też refleksją :D)

Wrócę jeszcze do drugiego zdania tego wpis: „Służy ona do zdefiniowa grupy  hermetycznych, wymiennych algorytmów”. To co chcemy osiągnąć za pomocą każdego z algorytmów to obliczenie końcowej wartości koszyka w sklepie. W każdym kraju robi się to trochę inaczej ale cel jest wspólny. Algorytmy te tworzą rodzinę/grupę, robią to samo ale troche inaczej. Każdy algorytm to inna hermetyczna klasa. Algorytm można łatwo wymienić na inny. Wystarczy dostarczyć inną implementację interfejsu. Osiągneliśmy sukces.

Zalety Strategi

Otwartość na rozszerzenia zamknięty na modyfikacje (Open/closed principle)
Redukcja zależności w kodzie
Większa czytelność

Diagram UML
strategia1