Czy obecnie wzorce projektowe są naprawdę niezbędne?

107

Czytałem „Coders at Work” i stanąłem wobec faktu, że niektórzy profesjonaliści, z którymi przeprowadzono wywiady w książce, nie są tak entuzjastycznie nastawieni do wzorów.

Myślę, że istnieją 2 główne powody:

  1. Wzory projektowe zmuszają nas do myślenia w ich kategoriach. Innymi słowy, prawie niemożliwe jest wynalezienie czegoś nowego (może lepszego).

  2. Wzory projektowe nie są wieczne. Języki i technologie zmieniają się szybko; dlatego wzorce projektowe staną się w końcu nieistotne.

Może więc ważniejsze jest, aby nauczyć się poprawnie programować bez żadnych konkretnych wzorców i nie uczyć się ich.

Chodziło również o to, że zwykle, gdy ludzie napotykają problem i nie mają dużo czasu, próbują użyć wzoru. Oznacza to kopiowanie i wklejanie istniejącego kodu do projektu z niewielkimi zmianami, aby go uruchomić. Gdy nadchodzi czas zmiany lub dodania czegoś, programista nie wie, od czego zacząć, ponieważ nie jest to jego kod i nie jest on dogłębnie z nim zaznajomiony.

Siergiej
źródło
79
Jeśli zastosowanie wzorca oznacza skopiowanie i wklejenie istniejącego kodu, prawdopodobnie robisz to źle
Dyppl
9
za pomocą wzorców projektowych! = programowanie kultu ładunku
jhocking
11
Tytuł tego pytania można sformułować w następujący sposób: „Czy ponowne wymyślenie koła nie jest obecnie tak istotne?”
Eric King,
2
Wzory projektowe zmuszają nas do myślenia w ich kategoriach - jeśli im na to pozwalasz. Znajomość wzorów pozwala mi rozważyć możliwości danego problemu projektowego. Często jest to jak czytanie menu restauracji ... „nie, nie, interesujące, nie, hmm, a-ha!”. Co więcej, nowoczesne funkcje językowe często sprawiają, że określone schematy wzorców, skodyfikowane dekady temu, stają się archaiczne.
radarbob

Odpowiedzi:

261

Za moje pieniądze myślę, że wszyscy nie rozumieją wzorców projektowych. Rzadko siedzę i zastanawiam się, jakiego wzoru powinienem użyć w danej sytuacji. Poza tym korzystałem z większości tych wzorów na długo zanim wiedziałem, że mają nazwy.

Potęga wzorców projektowych jest w komunikacji. O wiele szybciej jest mi powiedzieć „użyć do tego Strategii” niż szczegółowo opisać to, co sugeruję. O wiele łatwiej jest nam omawiać zalety modeli domeny tłuszczowej w porównaniu ze skryptami transakcyjnymi, jeśli wszyscy wiemy, co oznaczają te dwa terminy. I tak dalej.

A co najważniejsze, jeśli nazwałem klasę FooBuilder, to wiesz, że używam wzorca Builder do generowania mojego Foo.

Nawet jeśli nie wiesz, o czym mówię, kiedy mówię „Wzorzec obserwatora jest do tego idealny”, będziesz w stanie łatwo przejść do wyszukiwarki Google.

W tym sensie siła wzorów nigdy nie zniknie.

pdr
źródło
55
+1 dla „Używałem większości tych wzorów na długo zanim wiedziałem, że mają nazwy”. Wszyscy byli już od dawna, tylko bez nazewnictwa wzorów. W 1991 roku pisałem singletony w C i pokazałem jeden bardziej doświadczonemu programistowi, który nigdy wcześniej go nie widział i uważał, że to całkiem sprytne.
Bob Murphy
8
Jednak wzory również znikają. W latach 50. popularnym wzorcem było „wywołanie podprogramu”. W C „obiekt” jest (nieco) popularnym wzorcem. Oba są obecnie praktycznie wymarłe, ponieważ zostały zaabsorbowane w nowoczesnych językach, a (w przypadku podprogramów) nawet w zestawach instrukcji współczesnych procesorów.
Jörg W Mittag,
9
@Bob Murphy: Argh Singleton :( :( @pdr: dokładnie, wzorce dotyczą komunikacji na temat programowania. Zastosowanie wzorca, ponieważ prawie pasuje, jest największym błędem, jaki można popełnić, a zatem odbicie projektu nie powinno odbywać się pod względem wzorców, powinni wejść do projektu tylko wtedy, gdy chodzi o wyjaśnienie, o czym myślałeś: „To prawie jak <wzór>, z wyjątkiem tego, że poprawiłem ...” Myślę, że sam GOF sam to potwierdza: wzory są przycięte / uproszczone wizje, należy je dostosować do konkretnej sytuacji
Matthieu M.
10
@Jorg: kiedy zniknął wzorzec „podprogramu”. Jak myślisz, co to jest wywołanie metody / funkcji?
Dunk
10
@Dunk: Oczywiście zależy to od używanych języków. Nie wiem, jakie języki ty używasz, ale we wszystkich językach ja używam dzisiaj, wzywa podprogramów są wbudowaną funkcją języka, nie wzorzec projektowania. Jednak na przykład w C wywołanie metody jest wzorcem projektowym, podczas gdy w Javie jest to wbudowana funkcja języka.
Jörg W Mittag
32

Wzorce projektowe to wzrost ekspresyjnej mocy wspólnego języka, którego używamy jako ludzie oprogramowania. Ten wspólny język nie jest niezbędny, ale sprawia, że ​​wiele popularnych rozwiązań problemów jest łatwiejszych i szybszych do wyrażenia. Na przykład dużo łatwiej jest rozmawiać o Singletonach niż o „klasach, w których mamy mieć tylko jedną instancję, ale których nie można uczynić statycznymi i globalnymi”.

Rozwiązania, które zapewniają wzorce projektowe, są przydatne, ale są to rozwiązania, o których zapewne już pomyślałeś, gdy napotkasz problemy, które rozwiązują. Aby zrozumieć wzorce projektowe, wymagany jest pewien poziom dojrzałości - jeśli nigdy nie musiałeś rozwiązać problemu, nie zobaczysz wartości ani zainteresowania rozwiązaniem.

jprete
źródło
15

Wzory służą dwóm podstawowym celom:

  • Rozwiązywanie napięć przewidywalnie : Wzorce zostały zaprojektowane w celu rozwiązania określonego zestawu napięć w znany sposób. Kent Beck, autor Smalltalk Best Practice Patterns , opisuje wzorce jako sposób na powtórzenie decyzji, którą podjąłby ekspert w podobnych okolicznościach. Dopóki napięcia pozostaną takie same (i często tak robią), wzory, które je rozwiążą, pozostaną użyteczne.

  • Mnożnik siły komunikacji : Wzory pozwalają nam niewiele powiedzieć. Wykorzystują niewielki zestaw potężnych, dobrze zrozumiałych koncepcji, które można zastosować w wielu różnych obszarach problemowych. Odpowiedź @ pdr jest martwa na temat komunikatywnej wartości wzorców.

Rein Henrichs
źródło
12

Myślę, że twierdzenie, że wzorce projektowe utrudniają innowacje, jest całkowicie fałszywe. Powinieneś wiedzieć, gdziekolwiek już istnieje, więc nie musisz wymyślać koła na nowo. Ponieważ są tymczasowe, wzorce jako całość dotyczą systemów OOP i nie są powiązane z żadną konkretną platformą lub językiem.

Teraz nie lubię, gdy ludzie mówią o wzorach, że niektórzy mają na ich punkcie obsesję. Kiedyś miałem klienta, który poprosił mnie o „dołączenie co najmniej dwóch kolejnych wzorów” (WTF ?!), ponieważ z powodu braku modnych słów w moim kodzie nie wyglądało to wystarczająco przedsiębiorczo.

Vitor Py
źródło
3
Z mojego doświadczenia wynika, że ​​dobrze napisany kod jest zgodny z wieloma wzorami projektowymi właśnie dlatego, że opisują dobre praktyki. Tak więc, aby zadowolić klienta, powinno być po prostu ustalenie, których już używasz i umieszczenie ich nazw w dokumentach. Łatwo!
Donal Fellows
1
@Donal Fellows Tak właśnie zrobiłem :) Skończyło się na znajdowaniu wzorców zauważania i nadawaniu im nazw, nadając projektowi szczęśliwe zakończenie. Moim największym problemem jest to, że był to bardzo, bardzo mały projekt (około tygodnia pracy) i bardzo prosty: odczytywał dane z dziwnego formatu danych, dokonał kilku transformacji, wykreślił dane i zatapiał je w bazie danych.
Vitor Py
@Vitor Całkowicie się z tobą zgadzam. Osobiście znam ludzi, którzy uważają, że szukanie wzoru, który pasuje do twojego problemu / scenariusza, to zły pomysł! Wolą wynaleźć koło na nowo. Obawiam się, że pewnego dnia mogą się obudzić i poprosić mnie, abym nie korzystał z klas Java IO i nie pisał moich własnych programów obsługi IO!
CKing
6

Być może koncepcja anty-wzorów jest niemądra. Nie uważam studiowania wzorców projektowych za kluczowy krok do zostania inżynierem oprogramowania. Projektowanie oprogramowania jest ważne, często zastrzeżone jako przywilej architekta oprogramowania w projekcie, ale realistycznie coś, co można wypracować w drodze konsensusu w przysłowiowym „dobrze zżelowanym” zespole.

Ale wzorce projektowe i anty-wzorce stanowią źródło tych dyskusji. Należy docenić lekcje rzeczy, które działały dobrze (lub nie) i jak wykorzystać (lub złagodzić) konsekwencje wyborów projektowych. Dobry zespół mógłby wymyślić własne słownictwo do takich dyskusji, ale tak naprawdę nie jest tak źle odwoływać się do standardów defacto wypracowanych przez autorów, którzy tam byli, to zrobili.

matematyka
źródło
3
„Anty-wzór” to po prostu od dawna eufemizm „złego”.
Michael Shaw
@hardmath „Anti-pattern” oznacza znacznie więcej niż tylko „zły”
GoatInTheMachine
1
@ GooInTheMachine: Zgadzam się, to był komentarz do mojego postu. Chociaż anty-wzory są przykładami tego, czego należy unikać, mają one charakterystyczne cechy, które sprawiają, że są atrakcyjnym wyborem. Czasami rozsądne jest świadome stosowanie anty-wzoru, znanie jego wad i pułapek.
hardmath
4

Istnieją dwa rodzaje wzorców projektowych:

  1. Uniwersalne wzorce , w których chodzi o to, jak organizować złożone programy, aby w ogóle je zrozumieć. Nie znikają, choć można odkryć ich więcej.
  2. Wzorce sytuacyjne , które są tak związane z poszczególnymi siłami wywołanymi przez ograniczenia (np. Język programowania), że gdy siły te się zmieniają, stają się nieistotne.

OK, prawdopodobnie wszystkie wzorce są w pewnym stopniu sytuacyjne, ale w przypadku niektórych sił pochodzą one ze świata rzeczywistego, a w przypadku innych siły pochodzą z narzędzi. Narzędzia zmieniają się znacznie szybciej niż w prawdziwym świecie.

Donal Fellows
źródło
Wszystkie wzorce są zdefiniowane przez sposób, w jaki rozwiązują pewien zestaw napięć. Dopóki napięcia są takie same (i często są, dlatego są wzorami ), wzorce pozostaną użyteczne.
Rein Henrichs
@ Rein: Ale siły, które powodują napięcia mogą być wewnętrzne lub zewnętrzne. Różne języki mają różne siły wewnętrzne (np. Wzorce dotyczące interfejsów są bardziej odpowiednie dla Javy niż dla C ++ ze względu na różne napięcia w ich systemach klasowych).
Donal Fellows
Zdecydowanie. Rzut oka na wzorce implementacji (książka wzorców Javy Kenta Becka) pokazuje dość równomierny rozkład między wzorcami ogólnego przeznaczenia i tymi, które są bardziej specyficzne dla cech Javy. Porównanie tej książki z wzorcami najlepszych praktyk Smalltalk również jest odkrywcze.
Rein Henrichs
3

Czytanie o wzorach projektowych jest jak uczenie się matematyki zamiast jej odkrywania na nowo. Żadne nie powstrzymuje cię przed poczynieniem wielkich postępów w określonej dziedzinie, gdy dobrze zrozumiesz, co się działo wcześniej. Myślisz, że Rieman nigdy nie czytał Euclida?

Gus
źródło
1

Korzyścią jest projektowanie wzorców, gdy skracają czas, jaki koledzy lub klienci spędzają na myśleniu „Jak to działa?”. Chociaż nie ma sensu egzekwowanie standardu ze względu na standaryzację, jeśli istnieje jeden powszechny i ​​dobrze zrozumiały sposób zrobienia czegoś, za każdym razem, gdy programista szuka tego wzorca oczekując go i robi, wykonałeś ich i swoje zadania łatwiej.

Tom W.
źródło
1

Uważam, że czwórka z nich sama klasyfikuje wzorce projektowe jako

wspólne rozwiązanie często występującego problemu *

Tak, wzorce są istotne, gdy występuje ten sam typ problemu. I to prowadzi nas do problemu z terminem „wzorzec projektowy”. Wzór to coś, co można rozpoznać wielokrotnie. Tak więc w rzeczywistości nie ma wzoru wzorów, jest wzór problemów.

Niektóre języki programowania mogą mieć natywne rozwiązania niektórych z tych problemów. W samej książce „Wzorce projektowe” wspomina się, że wzorzec gościa ma niewielką wartość, jeśli używasz CLOS, ponieważ wiele wysyłek jest natywnie obsługiwanych przez CLOS, właśnie ten problem, który próbuje rozwiązać wzór gościa.

Ponadto .NET Framework ma wbudowany mechanizm zdarzeń do publikowania zdarzeń wielu słuchaczom, dzięki czemu wzorzec Observer jest mniej istotny w tym kontekście.

Zmiana z aplikacji komputerowych na aplikacje internetowe ** zmienia również rodzaj problemów programistycznych, które musimy rozwiązać. Wiele wzorców z książki „Wzory projektowe” dotyczy aplikacji komputerowych, ale nie tyle aplikacji internetowych. Oczywiście w przypadku aplikacji jednostronicowych wzorce te mogą być znowu odpowiednie po stronie klienta.

Ale wzorce projektowe i książki takie jak „Wzory projektowe” lub „Wzory architektury aplikacji korporacyjnych” mają ogromną wartość, gdy jesteś początkującym programistą i po raz pierwszy napotykasz nowy rodzaj problemu; ponieważ po raz pierwszy zostałem poproszony o wdrożenie funkcji Cofnij. Gdyby nie książka „Wzory projektowe”, moja implementacja byłaby prawdopodobnie czymś w rodzaju przechowywania migawki danych po każdej operacji zmieniającej stan *** - podejście bardzo podatne na błędy i okropnie nieefektywne.

Tak więc, niektóre wzorce stają się z czasem mniej istotne, a kiedy stajesz się doświadczonym programistą, mniej o nich myślisz. Ale dla początkującego są one cenne, o ile pamiętasz, że są sposobem na rozwiązanie problemu - a nie dążeniem do korzystania z jak największej liczby.

* cytat może nie być w 100% dokładny, ponieważ pochodzi z pamięci

** z mojego doświadczenia wynika, że ​​bardzo często przedsiębiorstwa wybierają mechanizmy dostarczania stron internetowych do wewnętrznych aplikacji biznesowych.

*** po nauczeniu się programowania funkcjonalnego i struktur danych funkcjonalnych, to może być sposób, w jaki mógłbym to dziś rozwiązać.

Pete
źródło
-3

Niewolnicze przestrzeganie wzorców projektowych może być szkodliwe - wzorce są udokumentowanymi rozwiązaniami typowych problemów, ale nie są instrukcjami obsługi. Jednak fakt, że są one omawiane szczegółowo, aw niektórych przypadkach stosowane poza skutecznymi domenami problemowymi, nie oznacza, że ​​nie mają one żadnej wartości. Są to zbiór zasad - nazywają to ramą - z których należy korzystać przy projektowaniu architektury programu, pozwalając architektowi na wyobrażenie sobie, jak chciałby zobaczyć rozwiązanie. Dobry zespół programistów postrzega je jako podstawę funkcjonalności, a nie specyfikację funkcjonalną.

Jacob Harrington
źródło
2
wydaje się, że nie ma to żadnego uzasadnienia w stosunku do punktów poczynionych i wyjaśnionych we wcześniejszych odpowiedziach
gnat