Zalety wzorca projektowego Command
Wzorców projektowych jest cała masa. Jedne są skomplikowane, inne wręcz banalnie proste. Dzisiaj przedstawię niebezpośrednie zalety używania jednego z nich, tego, którego mimo swojej prostoty, możliwości są wręcz nieograniczone. Skupię się, nie tyle na jego praktycznym wykorzystaniu, co na ogólnych zaletach jakie dostarcza wzorzec projektowy Command, po polsku Polecenie.
Awans
Jego przykładowa implementacja w języku C# może wyglądać następująco:
public interface Command { void Execute(); }
Myślisz, że to żart? Oczywiście, że nie. Chociaż na pierwszy rzut oka, możesz odnieść takie wrażenie. Ten kod powyżej, jest podstawowym składnikiem wzorca projektowego Command. Tak, interfejs wraz z jedną metodą Execute(), nie zwracającą nic. Taki prosty zabieg pozwala na awansowanie metody do poziomu klasy. Dzięki czemu może być traktowana dwojako. Jako metoda i jako klasa jednocześnie, co otwiera dla niej zupełnie nowe możliwości i daje ogrom zalet.
Uproszczenie
Największym plusem tego rozwiązania jest uproszczenie kodu na wielu frontach. Przykładowo możesz zamknąć pewien fragment logiki w hermetycznym pudełku odseparowanym od świata zewnętrznego. Dzięki czemu ułatwisz sobie pisanie testów jednostkowych. A co za tym idzie, jest ogromne prawdopodobieństwo, że taki kod będzie dużo prostszy w napisaniu i utrzymaniu. Wraz z tym krokiem, otworem stoją kolejne drzwi, za którymi już czekają refaktory i optymalizacje. Ponadto taka struktura sprzyja zachowaniu zasad SOLID, zwłaszcza opisywanemu już mojemu podejściu do Single Responsibility Principle.
Inne wzorce
Mimo tych zalet, Command, sam z siebie jest dość mało użyteczny. Swoją moc pokazuje dopiero podczas współpracy z innymi wzorcami projektowymi, jako ich składowa. Przykładem może być Active Object, State Machine, czy Chain of Responsibility. Jak i ostatnio bardzo popularny CQRS.
Mimo braku praktycznego przykładu, mam nadzieję, że zgadzasz się ze mną, iż użycie tego wzorca zwiększa znacząco jakość kodu. Nawet w sytuacji, gdy nie wykorzystujemy w pełni jego potencjału. Czy często masz okazję używać Komanda w swoich aplikacjach? Czy widzisz jeszcze jakieś jego zalety? A może wady? Zapraszam do dyskusji.
2 Komentarze
Tomasz · 2017-11-22 o 13:57
Jak użyłem tego wzorca w aplikacji desktopowej (C# WinForms) to zrobienia głównego menu (ribbon – wstążka). Każdy przycisk to oddzielna klasa, która ma metodę Execute + kilka właściwości opisujących przycisk (ikonę, widoczność, kolejność, grupa itd.).
Na starcie aplikacji przy pomocy IoC wyciągam wszystkie takie klasy (implementują odpowiedni intefejs). Taką kolekcję przekazuję do odpowiedniej metody, która na tej podstawie robi mi ładne menu główne :)
Dzięki temu nie ma mnóstwa kodu wpisanego na sztywno jak wygląda menu. Wszystko jest ładnie w klasa, wszystko w zgodznie z SOLIDem.
Jerzy Wickowski · 2017-11-24 o 05:55
@Tomasz: Cześć, dzięki za komentarz.
Bardzo przyjemny przykład. Sam nie pamiętam, kiedy ostatnio projektowałem menu. Takie czasy i człowiek coraz więcej w webówce siedzi. Jednak kiedy mi przyjdzie taka potrzebna to z pewnością Twój pomysł mi wróci do głowy.