.. _dyspozytor: Dyspozytor (*Dispatch Pattern*) ------------------------------------- .. note:: W ogólnym ujęciu dyspozytor pozwala przypisywać akcje (funkcje, metody) zmiennym o różych wartościach bądź różnych typów. Co oznacza *"przypisywać akcje zmiennym o różnych wartościach"*? Na przykład w grze terenowej możliwych jest 8 kierunków ruchu gracza: .. raw:: html
W powyższym przykładzie wpisałem tylko 4 możliwości (północ, południe, wschód, zachód); dodanie pozostały 4 (NE, SW itd) wymagać będzie dodanie kolejnych czterech instrukcji ``elif``. Aby uniknąć problemów w przyszłości, warto już teraz zaimplementować opcję WS (*west-south*), która będzie robiła to samo, co SW. Liczba linii ``elif``, które trzeba by napisać szybko rośnie ... Dyspozytor to rozwiązanie, w którym akcje (w powyższym przykładzie: dodawanie 1 do x lub y) przechowujemy w słowniku. Kluczami do słownika są wartości zmiennej sterującej (w powyższym przykładzie: napisy "N", "SW" itp). Rozwiązanie to przedstawiono w poniższym przykładzie. .. raw:: html Wykorzystanie dyspozytora wymaga napisania obiektów - po jednym na każdą akcję. Ma on jednak kilka poważnych zalet: - dodawanie nowych akcji nie wymaga modyfikowania bloku ``if ... elif`` a jedynie napisania oddzielnej klasy i dodanie jej instacji do słownika; podobnie modyfikacja pojedynczej akcji wymaga zmodyfikowania klasy tej akcji - łatwo możemy rozszerzać akcje, rozbudowując kod odpowiednich ``__call__()``. .. rubric:: Kierowanie wg typu - przeciążanie w Pythonie W pogramowaniu obiektowym często pojawia się też konieczność różnego potraktowania obiektów o różnych typach. Najlepiej z punktu widzenia projektowania i programowania było by, gdyby wszystkie różne rodzaje argumentów przetwarzane były tą samą metodą albo co najmniej - metodami o tej samej nazwie. Ta druga możliwość dostępna jest w niektórych językach pogramowania jako przeciążanie (*overloading*) metod. .. code-block:: C++ :linenos: double min(double a, double b) { return (a