'
Witamy w pierwszym poście z serii „Design Patterns Exposed”. W tej serii zamierzamy odkryć każdy wzorzec projektowy od podstaw.
Sama znajomość języka programowania i jego konstrukcji nie uczyni cię lepszym programistą lub deweloperem. Wymaga znajomości wzorców projektowych, aby stworzyć oprogramowanie, które będzie działać dziś, a także w przyszłości.
Wielu programistów już napotkało te problemy projektowe, z którymi masz teraz do czynienia lub napotkasz w przyszłości. Określili standardowy sposób radzenia sobie z tym problemem. Używając wzorców projektowych, zyskujesz przewagę dzięki zastosowaniu sprawdzonych technik.
Każdy wzorzec projektowy służy do rozwiązywania konkretnego rodzaju sytuacji. Mogą wystąpić sytuacje, w których można użyć więcej niż jednego wzorca projektowego.
Większość programistów po prostu próbuje rozwiązać napotkany problem, nie przejmując się wzorcami projektowymi, nadmiarowym kodem, a nawet ścisłym sprzężeniem. Ale dobrzy programiści zaczynają inaczej. Myślą o dzisiejszych wymaganiach, przyszłych wymaganiach, utrzymaniu kodu i możliwości ponownego wykorzystania kodu.
samouczek narzędzia talend etl pdf
Dobrzy programiści nie spieszą się z rozpoczęciem kodowania, gdy już poznają wymagania. Siedzą i zastanawiają się nad problemem, czy ich projekt zadziała. Jeśli tak, to czy zadziała po 6 miesiącach, kiedy zmienią się wymagania.
Dobrzy programiści biorą długopis i papier i zaczynają projektować swoje zajęcia i relacje między zajęciami. Starają się uzyskać luźne powiązania i wysoką spójność w swoim projekcie, robiąc to wszystko, mając na uwadze Zasady Zorientowane Obiektowo. Nie wchodzą od razu do kodu niskiego poziomu. Aby zaprojektować elastyczne i wielokrotnego użytku oprogramowanie, należy postępować zgodnie z tym podejściem, w przeciwnym razie zawsze będziesz modyfikować kod, który napisałeś wcześniej.
W branży oprogramowania jest tylko jedna rzecz, a mianowicie Zmiana. Wymagania z pewnością będą się zmieniać. Jak więc zaprojektować oprogramowanie, które Twój kod może łatwo dostosować do przyszłych wymagań? W tym celu musisz zacząć wcześnie i zaprojektować to w taki sposób, aby przyszłe wymagania nie złamały poprzedniego kodu.
Jak mogę to zrobić?
Cóż, można to zrobić, przestrzegając zasad projektowania i wzorców projektowych opartych na tych zasadach.
Teraz zajmijmy się kodowaniem i zacznijmy drogę do zostania lepszym programistą. W tym poście odkryjemy jeden z najważniejszych schematów - Wzór strategii .
Kiedy mówię najważniejsze, odzwierciedla to wspólny problem, który rozwiązuje Strategy Pattern.
Co to jest wzorzec strategii?
Oto definicja prosto z książki „Gang of Four”: „Wzorzec strategii służy do tworzenia wymiennej rodziny algorytmów, z których wymagany proces jest wybierany w czasie wykonywania”.
Na wszelki wypadeknie jesteś w stanie zrozumieć, nie martw się, wyjaśnimy to wprostszesposóbdla CiebieRozumiesz.
Najpierw zrozumiemy problem, a potem zobaczymy, jak Strategy Pattern może go rozwiązać.
Na powyższym diagramie UML mamy klasę abstrakcyjną Animal i dwie konkretne klasy, Dog i Bird, rozszerzające się z superklasy Animal.
Zdefiniujmy więc abstrakcyjną klasę Animal i dwie konkretne klasy, Dog i Bird.
Co myślisz o powyższym projekcie? W naszym projekcie jest jeden duży błąd.
Wszystkie zwierzęta nie potrafią latać, tak jak w powyższym przypadku pies nie może latać. Ale nadal zachowuje się jak „mucha”.
Popełniliśmy błąd, pisząc abstrakcyjną metodę fly () w klasie Animal. Ten projekt zmusi każdą podklasę Dog, Bird, Penguin, Crocodile, Goose itp. Do zaimplementowania metody fly ().
Powinniśmy byli zrozumieć, że latanie to umiejętność, której nie wszystkie zwierzęta będą miały. Dostarczając metodę fly () w klasie Animal abstract ustawiliśmy zdolność latania we wszystkich podklasach, która nie jest poprawna dla wszystkich podklas zwierząt.
Możesz pomyśleć, jaki jest problem we wdrażaniu metody fly w podklasach. Chociaż można zaimplementować metodę fly () w nielatających podklasach Animal, aby po prostu wydrukować „Nie mogę latać”. Ale problem polega na tym, że nadal dajesz zachowanie muchy nielatającym zwierzętom. To nie jest poprawne.
Jakie to uczucie wywołać funkcję dog.fly () lub crocodile.fly ().
Więc teraz zrozumieliśmy, że nasz projekt nie jest poprawny i powinniśmy usunąć metodę fly () z podklasy Animal.
Jaki jest inny sposób projektowania naszych klas w taki sposób, że nasz projekt nie wymusza na wszystkich podklasach Animal zachowań muchowych.
Jednym z rozwiązań, które od razu przychodzą na myśl, jest to, że możemy stworzyć interfejs latający z metodą latania i tylko zwierzęta, które potrafią latać, będą implementować ten interfejs latający. W ten sposób nie będziemy zmuszać wszystkich podklas Animal do definiowania zachowania much. Zakodujmy więc to podejście projektowe.
Teraz nasza klasa Animal będzie wyglądać jak poniższy kod po usunięciu metody fly z klasy Animal.
Teraz zdefiniujmy interfejs Flying
Teraz klasa psa zostanie zmienionatak jakkod poniżej i nie musi zachowywać się jak latanie.
Zobaczmy niektóre z naszych podklas Animal, które zachowują się jak latanie.
Rozwiązaliśmy nasz poprzedni problem, ale wpadliśmy w nowy problem, którym jest „Duplikacja kodu”.
Powiedzmy, że będziemy mieć 100 różnych podklas Latających Zwierząt. Musimy zduplikować kod dla zachowania fly, ponieważ latający interfejs nie może zapewnić żadnej implementacji zachowania fly, a później, jeśli będziemy chcieli zmienić implementację metody fly () w dowolnej podklasie, będziemy musieli otworzyć tę klasę i zmienić kod, co jest złe. Brakuje nam czegoś dużego, to znaczy, że nie możemy zmienić zachowania klasy podczas lotu.
Ale nie martw się, wzorzec strategii ma cię wyciągnąć z tego problemu.
Zróbmy więc refaktoryzację naszego kodu, aby używał wzorca strategii.
Interfejs latający pozostanie taki sam, jak jest. Teraz zamiast każdej podklasy latającej implementującej sam interfejs latający, zamierzamy zdefiniować oddzielne konkretne klasy, które będą implementowały różne zachowania w locie. Zobaczmy, jak to zrobić.
Jak to wszystko działa, zobaczmy TestClass
Używając wzorca strategii, możemy teraz zmieniać zachowanie dowolnego zwierzęcia w locie w czasie wykonywania, a to bez wymuszania jakichkolwiek podklas określających samo latanie.
Kiedy używać wzorca strategii?
Gdy chcesz mieć możliwość dynamicznej zmiany zachowania w czasie wykonywania.
Aby upewnić się, że dobrze rozumiesz wzorzec strategii, weźmy inny przykład.
W powyższej klasie Pracownik ustalamy wynagrodzenie pracownika w zależności od jego / jej wyznaczenia. Jeśli pracownik jest „Stażystą”, dodajemy 10% premii do wynagrodzenia podstawowego, aby obliczyć rzeczywistą pensję.
Jeśli pracownik jest „Web Developer”, dodajemy 20% premii do wynagrodzenia podstawowego w celu obliczenia rzeczywistego wynagrodzenia i podobny proces przebiega w przypadku innych typów pracowników. Chociaż nasz algorytm obliczania rzeczywistego wynagrodzenia jest bardzo prosty, aby był łatwiejszy do zrozumienia, ale przez większość czasu zawiera wiele porównań i obliczeń.
Więc co jest nie tak z kodem klasy pracowniczej?
Cóż, kod do obliczania wynagrodzenia (getPay ()) jest statyczny. Załóżmy, że chcę zmienić premię dla „stażysty” z 10% na 14%. Będę musiał otworzyć kod klasy pracownika i zmienić go.
Innym problemem jest to, że nie mogę zmienić algorytmu płacowego pracownika w czasie wykonywania. Jak więc to zrobić? Wzorzec strategii jest specjalnie używany do obsługi tego rodzaju problemów.
Przebudujmy kod, aby używał wzorca strategii.
Mam zamiar zdefiniować kilka algorytmów obliczania wynagrodzenia. Wtedy będę mógł użyć dowolnego z tych algorytmów do obliczenia wynagrodzenia w czasie wykonywania.
Zobaczmy teraz, jak zmieni się klasa pracownika.
Uwaga: Usunąłem logikę obliczania płac z klasy Employee i utworzyłem metodę set PayAlgorithm (), za pomocą której ustawię PayAlgorithm, którego chcę używać do obliczania wynagrodzenia.
Zapewni mi to elastyczność obliczania wynagrodzenia poprzez dynamiczne określanie dowolnego algorytmu płatności w czasie wykonywania. Zwróć również uwagę, że później, jeśli będę musiał zmienić logikę obliczania wynagrodzenia, mogę utworzyć nowy algorytm płatności i użyć go do obliczenia wynagrodzenia. Nie muszę zmieniać poprzedniego kodu, prawda?
Zobaczmy więc, jak działa.
Mam nadzieję, że dobrze zrozumiałeś wzorzec strategii. Najlepszym sposobem, aby się czegoś nauczyć, jest praktyka.
W przypadku jakichkolwiek pytań dotyczących wzorca strategii lub innego wzorca, zostaw swoje pytania poniżej.
Uważaj na następny post, w którym odkryjemy jeden z najpopularniejszych wzorców projektowych, wzór fabryczny.
Do tego czasu możesz pobrać kod, graj z nim i upewnij się, że utrwalisz w swojej głowie wzorzec strategii.
Masz do nas pytanie? Wspomnij o nich w sekcji komentarzy, a my skontaktujemy się z Tobą.
Powiązane posty: