Wzorzec Polecenia w JavaScripcie.

Dziś zajmę się kolejnym wzorcem projektowym. Tym razem będzie to wzorzec polecenia. Jak w przypadku poprzednich wzorców, ze względu na prototypową naturę JavaScriptu, implementacja ta będzie trochę odbiegała od oryginału.

Udało mi się jednak uzyskać tę samą funkcjonalność a to pozwoli zobaczyć korzyści płynące ze takie podejścia do niektórych problemów.

Wzorce projektowe w JavaScript

Wzorzec polecenia służy do parametryzowania wywołań metod obiektu. Co to oznacza? Mniej więcej to, że wywołanie metody, można przedstawić za pomocą obiektu lub tablicy. We wzorcu polecenia nie wywołuję konkretnych metod lecz jedną specjalną metodę obsługującą całą resztę funkcjonalności. Wszystkie informacje odnośnie tego co ma się stać przekazywane są w argumentach danej metody.

Takie rozwiązanie daje sporo ciekawych korzyści. Jeżeli to co opisałem na górze wydaje się nie jasne, przykład powinien rozwiać wszelkie wątpliwości. Wyobraźmy sobie obiekt AccountHandler, który służy do obsługi konta bankowego. Funkcja definiująca taki obiekt mogłaby wyglądać w taki sposób:

Nic nie stoi na przeszkodzie aby korzystać z tego obiektu w takiej właśnie formie. Wystarczy stworzyć kilka jego instancji, każdą obsługującą inne konto bankowe i wywoływać metody bezpośrednio na nich. Gorzej jak obiektów takich będzie większa ilość a struktura AccountHandler w jakiś sposób się zmieni. Wtedy będzie trzeba zmieniać wywołania metod obiektów pochodnych.

Użycie wzorca polecenia pozwala na uniknięcie takich sytuacji. Za wywoływanie metod odpowiedzialny jest jeden punkt wewnątrz głównego obiektu. Wzorzec pomaga więc w rozdzielaniu obowiązków w kodzie i pozwala na uniknięcie zbyt mocnych powiązań między elementami programu. Ma to szczególne znaczenie w dużych aplikacjach, w których każdy chce unikać zmian wpływających na dużą ilość kodu.

Kolejny plus używania wzorca polecenia, jest taki, że można łatwo prowadzić rejestr wykonywanych operacji. Dzięki temu, że metody są sparametryzowane i wywoływana w jednym miejscu, nie ma problemu z zapisem każdego wywołania. Pozwala to na wprowadzenie mechanizmu cofnięcia stanu aplikacji do takiego sprzed kilku poleceń.

W jaki sposób zaimplementować ten wzorzec do mojego przykładu? Najlepiej do obiektu AccountHandler dodać kolejną metodę, odpowiedzialną za wywoływanie operacji na koncie. Oto jak mogłoby to wyglądać:

Nowa metoda nazywa się run. W jej deklaracji nie podaję żadnych, ale wiem, że będzie ona przyjmować listę argumentów. Odwoływać do niech będę się poprzez właściwość arguments. Jest to zmienna, przypominająca tablicę, przechowująca wszystkie elementy przekazane do podczas wywołania. Pierwszym argumentem zawsze będzie nazwa metody, która chcę wykonać, reszta to argumenty, które przekażę tej metodzie.

Teraz muszę rozdzielić te dwa elementy. Przypisanie nazwy metody do osobnej zmiennej jest proste, ale do pozyskanie listy potrzebnych argumentów muszę użyć pętli for. Niestety obiekt arguments nie posiada w sobie metod tablicy takich jak split czy splice, które mogłyby się tu przydać.

Gdy nazwa metody i lista argumentów są już gotowe, wywołuje ją używając apply. Dzięki apply, mogę bez problemu przekazać listę argumentów do wywoływanej przez run metody.

A oto jak wygląda wykorzystanie tego obiektu:

Wszystko jest logowane w konsoli jak należy. Nic nie stoi na przeszkodzie aby znacznie rozbudować obiekt AccountCommandHandler. Niezależnie od tego ile metod będzie do niego dodawanych, wywołanie ich będzie cały czas tak samo łatwe.

Sama metoda run, też może otrzymać dodatkowe obowiązki, choćby wspomniane wcześniej rejestrowanie każdego wywołania. Oprócz zapisywania informacji o tym jaka metoda i z jakimi argumentami została wykonania, można uzyskać też informacje o tym, który obiekt ją wykonał.

Wszystko to może być bardzo przydatne podczas pisania bardziej rozbudowanych aplikacji.

Na dziś to wszystko. Wzorzec polecenia nie jest może najprostszy w zrozumieniu, ale mam nadzieję, że udało mi się w miarę zrozumiale przedstawić moją implementację. Jeżeli chcesz być na bieżąco z wpisami na blogu zachęcam do polubienia mojej strony na facebooku. Zawsze zamieszczam tam informacje o wszystkich nowościach. Jest to też dobre miejsce na kontakt ze mną. Na wszystkie pytania zawsze odpowiem :).

2 thoughts on “Wzorzec Polecenia w JavaScripcie.”

  1. this.run = function() {
    var method = arguments[0];
    var finalArgs = [];
    for(var i = 1;i<arguments.length;i++){
    finalArgs.push(arguments[i])
    }
    this[method].apply(this, finalArgs );
    };

    this.run = function() {
    var args = [].slice.call(arguments);
    this[args.shift()].apply(this, args);
    };

  2. Czesc,

    „Gorzej jak obiektów takich będzie większa ilość a struktura AccountHandler w jakiś sposób się zmieni. Wtedy będzie trzeba zmieniać wywołania metod obiektów pochodnych.”

    Moglbys podac jakis przyklad?

Dodaj komentarz

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