Wzorzec Polecenia (Command) praktycznie każdy zna, więc nie owijając w bawełnę poniżej przykład z lampą i pilotem który tejże lampy funkcje ma włączać i wyłączać. Do kodu!

Jak widać, lampa ma 2 rodzaje funkcji, a pilot posiada 2 przyciski. Każdy z przycisków umożliwia wykonanie 1 polecenia. W takim wypadku podepnijmy polecenie włączania i wyłączania światła pod pilota:

Rzecz prosta, a cieszy, bo daje spore możliwości. Podmiana funkcji z włączania światła na włączanie disco i wyłączanie to po prostu wykonanie SetCommand dla odpowiednich buttonów z podaniem odpowiedniego polecenia.

Poniżej wersja funkcyjna w moim wykonaniu:

Zmianie uległa klasa Pilot. W tej chwili przyjmuje Action jako interfejs polecenia. Ponieważ jest to tylko przykład więc jest on uproszczony do granic. W razie komplikacji takim interfejsem może być Func<bool, bool> np. Znacznemu uproszczeniu uległy klasy odpowiadające za konkretne polecenia. W tej chwili są to publiczne statyczne funkcje które zwracają akcję. Dzięki temu są jedno-linijkowe, bardzo konkretne i proste do opanowania. Ten sposób zapisu umożliwia również stworzenie konkretnych klas statycznych i podzielenie odpowiedzialności. Można utworzyć klasę LightCommand która będzie zawierała funkcje dotyczące funkcji Light oraz DiscoCommand, w którym umieścimy funkcje dla trybu Disco.

Jak należy się spodziewać użycie nie zmieniło się zbyt wiele.

Jak Wam się podoba takie uproszczenie wzorca? Proszę o komentarze i podpowiedzi jak można to jeszcze ulepszyć!

 

11 Replies to “Wzorzec Command – funkcyjnie.

  1. Pingback: dotnetomaniak.pl
    1. W komentarzu wskazałem, że łatwo tego użyć… Po to to pokazałem – uważasz, że powinienem dodać kilka linijek do metody Main() by użyć tego kodu? Coś by to rozjaśniło bardziej?

  2. Czemu klasa nazywa się Pilot, a nie RemoteControl (jeśli to miał być w zamyśle pilot) albo jakiś CommandExecutor chociażby. I jedno może zboczenie czemu raz internal raz public szczególnie jeśli chodzi o to, że klasy Pilot i Lampa, które jednak w jakiś koegzystyją

        1. Nazwa klasy (raczej nieistotna – to przykład) pewnie wywodzi się z tego, że się zagapiłem i nazwałem ją Pilot – po polsku.
          Internal na public zamienił mi R#. Prawdopodobnie z powodu tego, że ma ustawione, że static powinno być public, a skoro użyłem w static lampy – niepotrzebnie zresztą – to i ona powinna być public. Zaraz to poprawię.

  3. Jezusicku, takiego czepialstwa o pierdoły już dawno nie widziałem, jak wasze “uwagi” mają się do głównego tematu artykułu?

    1. Miły sercu każdy komentarz, a im bardziej czepialskie oznacza, że tym bardziej główne założenia artykułu zostały spełnione. A to cieszy 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *