Wybór odpowiedniego wzoru

32

Zawsze zdawałem sobie sprawę ze znaczenia stosowania wzorców projektowych. Jestem ciekawy, jak inni programiści wybierają ten najbardziej odpowiedni. Czy korzystasz z szeregu cech (takich jak schemat blokowy), aby pomóc Ci podjąć decyzję?

Na przykład:

Jeśli obiekty są powiązane, ale nie chcemy określać konkretnej klasy, rozważ opcję Streszczenie

Kiedy tworzenie instancji jest pozostawione klasom pochodnym, rozważ fabrykę

Potrzebujesz sekwencyjnego dostępu do elementów obiektu agregującego, spróbuj Iterator

czy coś podobnego?

Carl Sagan
źródło
8
Jak myślisz, jakie jest znaczenie? programmers.stackexchange.com/questions/70877/…
pdr
Myślę, że ważna jest umiejętność rozpoznania najbardziej odpowiedniego i całościowego wzorca, aby móc ostatecznie przekazać to innym programistom. Jeśli to ma sens?
Carl Sagan
Zgadzam się z @pdr. Myślę o tym, co muszę zrobić, a zapamiętanie nazwy wzoru pomaga mi nazwać klasę, aby inni wiedzieli, co robi.
Amy Blankenship
4
W rzeczy samej. Można to po prostu sprowadzić do „Jak wybrać odpowiedni projekt?”. Po pierwsze, nie ma odpowiedniego projektu, po prostu wiele niewłaściwych. Poza tym ma doświadczenie w stosach (wybieranie niewłaściwych).
Telastyn

Odpowiedzi:

109

Kluczowym nieporozumieniem w dzisiejszym świecie kodowania jest to, że wzorce są elementami składowymi. Bierzesz AbstractFactorytu i Flyweighttam, a może Singletontam i łączysz je razem z XML i presto, masz działającą aplikację.

Oni nie są.

Hmm, to nie było wystarczająco duże.

Wzory nie są elementami składowymi

Tak lepiej

Wzorzec jest czymś, czego używasz, gdy stwierdzisz, że masz problem - potrzebujesz pewnej elastyczności, którą zapewnia wzorzec lub natknąłeś się, gdy tworzysz mały język w pliku konfiguracyjnym i mówisz „czekaj” chwileczkę, przestań, to jest mój własny tłumacz, który piszę - to znany i rozwiązany problem, użyj wzorca tłumacza ”.

Pamiętaj jednak, że odkrywasz to w kodzie, a nie zaczynasz. Na początku twórcy Javy nie powiedzieli „Och, umieścimy Flyweight w liczbie całkowitej”, ale zdali sobie sprawę z problemu z wydajnością, który można rozwiązać za pomocą flyweight .

W związku z tym nie ma „schematu blokowego”, za pomocą którego można znaleźć odpowiedni wzór. Wzorzec jest rozwiązaniem określonego rodzaju problemu, który napotykał wielokrotnie, a jego kluczowe części destylowano w Wzorzec.

Zaczynanie od Wzorca przypomina rozwiązywanie problemu i szukanie problemu. Jest to zła rzecz: prowadzi do nadmiernej inżynierii i ostatecznie nieelastyczności w projektowaniu.

Kiedy piszesz kod, kiedy zdajesz sobie sprawę, że piszesz fabrykę, możesz powiedzieć „aaaaa, to jest fabryka, którą zamierzam napisać” i wykorzystać swoją wiedzę na temat znajomości wzorca fabrycznego, aby szybko napisać kolejną część kodu bez próby ponownego wykrycia wzorca fabrycznego. Ale nie zaczynasz od „Mam tutaj klasę, napiszę dla niej fabrykę, żeby była elastyczna” - bo tak nie będzie.

Oto fragment wywiadu z Erichem Gammą (z Gamma, Helm, Johnson i Vissides ): Jak używać wzorców projektowych :

Próba użycia wszystkich wzorów jest złą rzeczą, ponieważ skończysz na projektach syntetycznych - projektach spekulacyjnych, które mają elastyczność, której nikt nie potrzebuje. Obecnie oprogramowanie jest zbyt skomplikowane. Nie możemy sobie pozwolić na spekulacje, co jeszcze powinien zrobić. Musimy naprawdę skoncentrować się na tym, czego potrzebuje. Dlatego lubię refaktoryzować do wzorów. Ludzie powinni dowiedzieć się, że kiedy mają szczególny rodzaj problemu lub zapach kodu, jak nazywają to w dzisiejszych czasach, mogą przejść do przybornika wzorów, aby znaleźć rozwiązanie.


Najlepszą pomocą dla „czego używać, kiedy” jest prawdopodobnie strona Wikipedii dotycząca wzorca projektowania oprogramowania - sekcja „Klasyfikacja i lista” opisuje kategorię, w której znajduje się każdy wzorzec i co robi. Nie ma schematu blokowego; opis jest prawdopodobnie najlepszym, który znajdziesz jako krótki fragment „co używać, kiedy”.

Pamiętaj, że znajdziesz różne wzorce w różnych obszarach programowania. Projektowanie stron internetowych ma własny zestaw wzorców, a JEE (nie projektowanie stron internetowych) ma inny zestaw wzorców. Wzorce programowania finansowego są zupełnie inne niż w przypadku samodzielnego projektowania interfejsu użytkownika aplikacji.

Tak więc każda próba wyszczególnienia ich wszystkich jest z natury niekompletna. Znajdziesz jeden, wymyślisz, jak go używać, a potem stanie się on w końcu drugą naturą i nie musisz myśleć o tym, jak i kiedy go użyć ponownie (dopóki ktoś nie poprosi cię o wyjaśnienie).

Robert Harvey
źródło
11
+1 za „rozwiązanie problemu”. Znajomość wzorów pozwoli ci pominąć ich naturalne odkrycie, gdy okaże się, że musisz rozwiązać problem, który zdarzają się rozwiązać. Poznanie ich prawdopodobnie pomoże poprawić twoje umiejętności kodowania i projektowania, podobnie jak czytanie kodu innych osób lub nauka innego języka programowania. Ale zdecydowanie nie powinieneś aktywnie próbować „dopasowywać wzorców” do swojego kodu.
gregmac
1
Zawsze polecam programistom, którzy zaczynają szukać wzorców, aby najpierw zapoznać się z zasadami projektowania. Każdy wzór jest ilustracją niektórych zasad projektowania (zbiór zasad „SOLID” jest tylko jednym przykładem).
ryscl
2
Być może dodasz dekoratora i fasadę, którą miałbyś aplikację ;-) Innym sposobem, wzorce projektowe mają dać nam nazwę, wspólny język podczas omawiania tego, co budujemy. To skrót od ciężko zdobytej wiedzy programistycznej.
EBarr
2
Czytanie między wierszami tutaj, kroki do wyboru wzorca projektowego: 1. Zawsze myśl krytycznie o każdym kodzie, w którym pracujesz. 2. Przekształć konkretny kod w podstawowy problem 3. Czy ten problem ma znane rozwiązanie (wzorzec projektowy )? 4. Tak, jak zastosować to rozwiązanie do mojej specyfiki? 5. Dostosuj ogólne rozwiązanie problemu abstrakcyjnego, aby stworzyć rozwiązanie konkretnego problemu.
Chris
@Chris, który tak naprawdę podsumowuje. Nie ma też nic złego w pisaniu go bez wzorców, a następnie refaktoryzacji kodu do odpowiedniego wzorca, jeśli projekt go potrzebuje.
18

Pytam siebie:

  1. Jaki problem próbuję rozwiązać?
  2. Który wzorzec projektowania oprogramowania (jeśli w ogóle) najlepiej rozwiązuje ten sam problem lub zapewnia logiczną ścieżkę do rozwiązania mojego problemu?
  3. Czy potrzebuję dodatkowej abstrakcji (i złożoności), jaką zapewnia wzorzec, czy też jest nadmiernie inżynieryjny w odniesieniu do mojego konkretnego problemu? Czy problem można rozwiązać w prostszy, bardziej wydajny sposób bez wzoru?

Proces wyboru wzorca oprogramowania nie różni się od procesu wyboru struktury danych, z tym wyjątkiem, że wybierając strukturę danych, oceniasz charakterystykę wydajności i pamięci twojego problemu i wybierasz strukturę danych, która najbardziej pasuje do tych cech.

Robert Harvey
źródło
Oczywiście, to jest coś o doświadczeniu i ekspercie, zamiast planu lub schematu, i zgadzam się z tobą. Ale muszą być pewne pełne zasoby, takie jak zaawansowana ściągawka, w której została podzielona na kategorie, przynajmniej w przypadku najważniejszych i najczęstszych wzorów, takich jak fabryka itp. Poszukuję czegoś takiego jak najbardziej znane zalecane sytuacje w które lepiej użyć wzoru. znasz taki zasób w Internecie ?!
Pmpr
3
@Trix: sourcemaking.com/design_patterns
Robert Harvey