Wzory projektowe - korzystasz z nich?


44

Będąc studentem informatyki, jeden z naszych nauczycieli przedstawił mi ostatnio przegląd wzorców projektowych. Zrozumiałem, do czego służą, ale niektóre aspekty wciąż mnie denerwują.

Czy naprawdę są używane przez większość programistów?

Mówiąc o doświadczeniu, miałem pewne problemy podczas programowania, rzeczy, których nie mogłem rozwiązać przez jakiś czas, ale Google i kilka godzin badań rozwiązało mój problem. Jeśli gdzieś w sieci znajdę sposób na rozwiązanie mojego problemu, czy jest to wzorzec projektowy? Czy używam tego?

A także, czy (programiści) szukacie wzorców (przy okazji, gdzie mam tak wyglądać?), Kiedy zaczynacie opracowywanie? Jeśli tak, to z pewnością muszę zacząć stosować ten nawyk.

AKTUALIZACJA: Myślę, że kiedy pytam, czy programiści ich używają, pytam, czy kiedy masz problem do rozwiązania, pomyśl „Och, powinienem użyć tego wzorca”.


7
Nie jest to dokładnie takie samo pytanie, ale moja odpowiedź byłaby taka sama. programmers.stackexchange.com/questions/70877/…
pdr

4
Większość tych przereklamowanych, nadmiernie przesadzonych „wzorców projektowych” dotyczy tylko programowania OOP. Istnieje wiele dobrych powodów, by trzymać się z dala od OOP tak długo, jak to możliwe.
SK-logic

5
Coraz częściej używam Big Ball of Mud. Żartuję.
sashoalm

Jedyną odpowiedzią jest „tak” z warunkowym stwierdzeniem „W stosownych przypadkach”
Rig

Odpowiedzi:


114

Kiedy byłem początkującym programistą, uwielbiałem wzory. Nie użyłem tylko wzorów projektowych. Zadałem je. Gdziekolwiek i kiedykolwiek mogłem. Byłem bezlitosny. Aha! Wzór obserwatora! Weź to! Użyj słuchacza! Pełnomocnik! AbstractFactory! Po co używać jednej warstwy abstrakcji, skoro pięć? Rozmawiałem z wieloma doświadczonymi programistami i odkryłem, że prawie każdy, kto czyta GoF Book, przechodzi przez ten etap.

Początkujący programiści nie używają wzorców projektowych. Nadużywają wzorców projektowych.

Niedawno stwierdziłem, że przestrzeganie zasad takich jak zasada pojedynczej odpowiedzialności i pisanie testów w pierwszej kolejności pomaga w pojawieniu się wzorców w bardziej pragmatyczny sposób. Kiedy rozpoznam wzorce, będę mógł je dalej rozwijać. Rozpoznaję je, ale nie próbuję już wymuszać ich na kodzie. Jeśli pojawi się wzorzec gościa, to prawdopodobnie dlatego, że zreorganizowałem duplikację, a nie dlatego, że wcześniej pomyślałem o podobieństwie renderowania drzewa do sumowania jego wartości.

Doświadczeni programiści nie używają wzorców projektowych. Wzory projektowe wykorzystują je.


2
@schlingel - Dlaczego dzwonisz do OP Sir?
Oded

10
@Oded Zastrzegam sobie prawo do bycia nazwanym „Sir” w tych okolicznościach i cieszę się z tego.
Lunivore

3
Proszę pana. Bez obrazy!
Oded

1
W Rosji Radzieckiej .. :)
Sorantis

5
Dobra odpowiedź, ale w ostatniej linii próbowałeś być głęboki, ale to nonsens. A może „Doświadczeni programiści nie wybierają wzorców projektowych, pozwalają im na to”.
Garrett Hall

43

Czy ktoś ich rozpoznaje, czy nie, większość programistów zrobić wzorce stosowania.

Jednak w codziennej pracy nie rozpoczyna się programowania z myślą o wzorcu - rozpoznaje się, że wzorzec pojawił się w kodzie, a następnie nazywa go.

Niektóre z typowych wzorców są wbudowane w niektóre języki - na przykład wzorzec iteratora wbudowany w C # ze foreachsłowem kluczowym.

Czasami znasz już wzorzec, którego będziesz używać jako wspólne rozwiązanie danego problemu (powiedzmy wzorzec repozytorium - już wiesz, że chcesz reprezentować swoje dane jako kolekcję w pamięci).


13
Właśnie to chciałem powiedzieć, że wzorce są językiem, który pomaga programistom komunikować pomysły projektowe i wdrożeniowe, a nie zestaw klocków Lego do programowania, które można połączyć w celu wdrożenia systemu.
Mark Booth

27
@DeadMG Dlaczego tak jest?
Kris Harper

11
@DeadMG: Musiałem zostać zaślepiony oślepiająco głupim pomysłem - nie rozumiem, dlaczego uważasz, że to jest głupie ;-)
Treb

2
@ root45 - Widzisz przyjacielu, foreachkonstrukcja sprawia, że ​​programowanie jest zbyt łatwe. Jak można czuć się lepszym od innych, jeśli złożone zadanie, takie jak iteracja kolekcji, jest łatwe? Mam jeszcze jeden kod w zestawie dla wszystkich moich aplikacji CRUD. Najwyraźniej sentyment @DeadMG jest czysto pragmatyczny geniuszem.
ChaosPandion

8
@DeadMG - LINQ nie było w pobliżu, gdy był .NET 1.0 / 1.1. yieldwtedy też nie istniał. Czy uważasz, że złamanie starego kodu przez usunięcie słowa kluczowego jest lepszą opcją?
Oded

22

Jak sugeruje odpowiedź połączona z pdr : wzorce projektowe to nazwy nadawane rzeczom, które ludzie i tak robią , mające na celu ułatwienie ludziom omawiania tych rzeczy.

Zasadniczo warto się ich uczyć na początku, ponieważ dają one wgląd w rozwiązania, które ludzie znaleźli, aby pracować, dzięki czemu możesz korzystać z wieloletniego doświadczenia oraz prób i błędów.

Dyskusja na temat motywujących problemów zawartych we wzorach może dać ci wgląd w dobre sposoby na atakowanie twojego problemu, ale jeśli twoja wiedza na temat wzorców nie pozwala ci rozpoznać, że istnieje dobrze znane istniejące rozwiązanie, nadal musisz skupić się na rozwiązaniu problemu problem pierwszy.

Jeśli okaże się, że używasz jednego lub więcej istniejących wzorców, to świetnie, masz gotowe nazwy, które ułatwią innym zrozumienie twojego kodu.


+1 za znaczące podsumowanie tego, co chciałem powiedzieć: Skoncentruj się na problemie, a następnie, i tylko wtedy, jeśli problem wygląda jak jeden wzór rozwiązany, zastosuj wzór.
Joshua Drake

1
+1 za stwierdzenie prawdziwego faktu, że wzory są nazwami rzeczy, które ludzie i tak robili .
miraculixx

12

Ogólnie rzecz biorąc, nie. Są chwile, kiedy wzorce wyłaniają się z mojego kodu, ale generalnie nie szukam ich i na pewno nie mówię: „Och, Wzorzec Mostu rozwiązałby mój problem!”.

To jest ta rzecz. Większość wzorów jest nadużywanych i niewłaściwie wykorzystywanych, a ludzie nigdy nie zastanawiają się, czy są dobrym projektem. Wzory nie są atomami. Kod nie zawiera permutacji wzorów X. Nie wspominając o tym, że nie wszystkie wzorce są w rzeczywistości dobrymi pomysłami lub że niektóre języki mają rozwiązania na poziomie językowym, które są znacznie lepsze od niektórych wzorców.


+1: Zgadzam się, że wzory są czasami niewłaściwie używane. Czasami widzę kod, w którym programista zastosował wzorzec tylko dlatego, że wiedział o nim i myślał, że jest fajny, ale to czyniło kod niepotrzebnie złożonym i trudnym do odczytania. Jak łamanie orzechów spychaczem. Jeśli chodzi o rozwiązania na poziomie języka, czy rozwiązanie na poziomie języka nie jest tylko wzorcem obsługiwanym bezpośrednio przez język? A jaka jest różnica?
Giorgio

1
@Giorgio: Z innej strony, niektóre wzorce służą do obejścia faktu, że język nie ma sposobu, aby wyrazić pewną rzecz starannie.
Daenyth

8

tak, większość programistów, z którymi się kiedykolwiek spotkałem, używa najbardziej powszechnego wzorca, Big Ball of Mud . Zazwyczaj zaczynają od dobrze zaprojektowanej architektury, ale zwykle kończą tutaj, szczególnie jeśli zaczynają myśleć „musimy stosować wzorce projektowe” wszędzie i bezlitośnie refaktoryzują.


2
Link uczynił mój dzień
dukeofgaming

1
Ojej. Ta strona wymaga formatowania tekstu.
Nailer

7

korzystasz z nich?

Tak, doświadczeni programiści na pewno tak. Na razie możesz uniknąć używania większości wzorców projektowych (z wyłączeniem prostych singletonów); ale im więcej programujesz i im bardziej złożone systemy budujesz, tym bardziej odczuwasz potrzebę stosowania wzorców projektowych. Jeśli nadal będziesz go unikać, zaczniesz odczuwać ból, gdy będziesz musiał rozbudować swój system i zmienić go zgodnie z nowymi wymaganiami.

Jeśli gdzieś w sieci znajdę sposób na rozwiązanie mojego problemu, czy jest to wzorzec projektowy?

Niekoniecznie. Wzorzec projektowy odnosi się do konkretnego sposobu projektowania klas, ich zachowań i interakcji w celu osiągnięcia określonego celu (lub uniknięcia określonego problemu). To, co może się zdarzyć, może nie być problemem projektowym, ale określoną sekwencją kroków do zaprogramowania określonego interfejsu API. Na przykład: istnieje pewna sekwencja nawiązywania połączenia przez gniazdo. Zrób to źle, a gniazdo nie będzie się komunikować. Ta sekwencja kroków nie stanowi wzorca.

czy (programiści) szukacie wzorców

Tak. Wzory projektowe zawierają aksjomat „lepiej zapobiegać niż leczyć”. Jeśli wcześniej zauważysz konkretny nadchodzący problem projektowy, możesz zapobiec masowym przeprojektowywaniu, aby później uwzględnić zmiany. Warto więc wcześniej poznać wzorce projektowe i poszukać miejsc, w których trzeba ich użyć podczas tworzenia aplikacji.

gdzie mam wyglądać?

Ponieważ jesteś studentem, prawdopodobnie nie widziałeś typowych problemów, które inspirują wzorce projektowe. Zdecydowanie polecam przyjrzeć się wzorom projektowym Head First . Najpierw przedstawiają problem projektowy, a następnie pokazują, w jaki sposób dany wzór może go rozwiązać / uniknąć.


5

Wzorów projektowych nie uczono, kiedy byłem w szkole. Przez większą część mojej kariery programistycznej pracowałem ze starszym, nieobiektywnym kodem. W ostatnich latach próbowałem się ich nauczyć, ponieważ brzmią one jak dobry pomysł. Muszę jednak wyznać, że za każdym razem, gdy wybieram książkę lub próbuję przeczytać samouczek na ten temat, moje oczy się błyszczą i tak naprawdę nie nauczyłem się niczego praktycznego na ich temat.

Nie mogę uwierzyć, że publicznie to przyznałem. Myślę, że prawdopodobnie właśnie straciłem jakieś geekowskie uznanie, które mogłem ustanowić przez lata.


3

Nie szukaj modności

Każde standardowe rozwiązanie programistyczne dla określonego problemu można uznać za wzorzec projektowy, nie ma znaczenia, jak popularne są, ani czy używają ich inni programiści.

Być może korzystasz już z wzorca projektowego, który nie został jeszcze wynaleziony / określony.

Nie próbuj ich używać, spróbuj myśleć na ich warunkach

Problem z wzorami projektowymi polega na tym, że czasami programiści chcą dopasować do nich swoje problemy, gdy jest na odwrót.

Pamiętaj, że konwencja wzorców projektowych ma typowy problem do rozwiązania, możesz nawet łączyć wzorce projektowe w celu rozwiązania innych większych problemów. Jest to typowe w architekturze zorientowanej na usługi, wystarczy zobaczyć niektóre wzorce SOA .

Szukaj ich na wolności

Istnieje wiele projektów typu open source, w których można znaleźć zastosowane wzorce projektowe. Jednym z przykładów, który przychodzi mi na myśl, jest Joomla: znajdziesz singletonów , obserwatorów . Biblioteki GUI będą miały wzorzec dekoratora , zaimplementowany wzorzec poleceń , a może nawet wagę .

Istnieją inne wzorce, takie jak wzorce danych, na przykład użył sam projekt Doctrine, wzorzec aktywnego zapisu (1.x), wzorzec menedżera encji (2.x), jednostka pracy , repozytorium , obiekt zapytania , odwzorowanie metadanych , dane mapowanie i inne bardziej ogólne, takie jak wzorzec strategii i wzorzec dekoratora .

Jest tak wiele interesujących rozwiązań do wyboru. Zobacz wzorce architektury korporacyjnej Martina Fowlera , są też wzorce modeli danych .

Naucz się ich, gdy nadejdzie czas

Naucz się ich, poznaj ich, obsesję na ich punkcie, a kiedy nadejdzie czas, będziesz wiedział, jak rozwiązać problem programistyczny x, do tego czasu będziesz już lepszym programistą.

Zostań architektem

Powiedziałbym, że umiejętność myślenia w kategoriach rozwiązywania problemów skutecznie zmienia cię w architekta oprogramowania . Nawet jeśli nie chcesz być architektem oprogramowania, Twoje rozwiązania będą miały domyślnie wyższą jakość techniczną, będą czystsze i będą lepiej skalowane - pod względem projektowym -.


1

Przez około 7 lat programowałem w C ++, a wzorców nauczyłem się około 2 lata temu. Większość wzorów prawdopodobnie ma pewne aplikacje, ale w moim użyciu niektóre są lepsze od innych. Musisz pomyśleć, dlaczego ich używasz.

Wzorzec iteratora sprawił, że mój kod stał się bardziej zagmatwany i dodał niepotrzebnej złożoności. Mogę uzyskać taką samą łatwość konserwacji przy użyciu typedefs dla typów wektorów STL. I wszelkie zmiany, które wprowadzam do iterowanej klasy, muszę również wprowadzić w klasie iteracyjnej.

Metoda fabryczna okazała się jednak niezwykle użyteczna, ponieważ zapewnia polimorfizm. Zapomniałem, kto to powiedział, ale stwierdzenie „wielokrotnego użytku oznacza, że ​​stary kod może używać nowego kodu”, jest zdecydowanie zgodne z wzorcem fabrycznym.

Używam wzorca metody szablonu od lat, nawet nie wiedząc, że to „wzorzec projektowy”.

Wzorzec obserwatora był pomocny w niektórych przypadkach, czasem nie. Czasami musisz przewidzieć złożoność, aby ustalić, czy narzutowa złożoność wzoru Obserwatora jest tego warta. Mamy program, który korzysta z około 10 subskrybentów i może być ich znacznie więcej, więc wzorzec obserwator / subskrybent był pomocny. Inny program ma jednak dwa ekrany GUI. Zaimplementowałem wzorzec obserwatora dla tego programu i był on w dużej mierze niepotrzebny, po prostu dlatego, że zwiększył złożoność i nie przewiduję dodania kolejnych wyświetlaczy.

Myślę, że ci, którzy twierdzą, że zawsze używają wzorców, zakładają, że twój program będzie nieskończenie złożony, ale podobnie jak w przypadku wszystkiego, istnieje punkt krytyczny pod względem złożoności.


1

Dodawanie do Lunivore. Chciałbym zacytować to z pierwszej książki

        ## **Three steps to great software** ##     
  • Upewnij się, że oprogramowanie robi to, czego chce klient
  • Zastosuj dobre zasady obiektowe
  • Dążyć do łatwego w utrzymaniu projektu wielokrotnego użytku

Odbywa się to na trzecim etapie, po tym jak system działa tak, jak powinien. Czas zastosować wzorce, aby przygotować oprogramowanie na nadchodzące lata.


0

Czy naprawdę są używane przez większość programistów?

Domyślam się, że tak. W ADO.Net istnieje klasa DataAdapter, która stanowi prosty przykład, jednak w zależności od obszaru, w którym chcesz się specjalizować, wzorce mogą się różnić.

Mówiąc o doświadczeniu, miałem pewne problemy podczas programowania, rzeczy, których nie mogłem rozwiązać przez jakiś czas, ale Google i kilka godzin badań rozwiązało mój problem. Jeśli gdzieś w sieci znajdę sposób na rozwiązanie mojego problemu, czy jest to wzorzec projektowy? Czy używam tego?

Nie, to nie jest moim zdaniem wzór. Wzorzec projektowy ma pewien układ klas i metod, które definiują recepturę wzorca.

Wolę myśleć o tym, co tam zrobiłeś, jako o zwykłej praktyce. Uważaj jednak na kopiowanie i wklejanie.

A także, czy (programiści) szukacie wzorców (gdzie mam wyglądać przy okazji?) Po rozpoczęciu tworzenia? Jeśli tak, to z pewnością muszę zacząć stosować ten nawyk.

Czasami, gdy widzę ten sam kod w kółko, mogę znaleźć sposób na przeformułowanie kodu do wzorca lub jeśli pamiętam rozwiązanie podobnego problemu dotyczącego wzorca, wyjmę go i użyję. Wzory Head First Design mają więcej niż kilka wzorów, a Refaktoryzacja byłaby sugestią dla praktyk kodowania, które mogą prowadzić do znalezienia różnych wzorów. Jeśli chcesz mieć inny możliwy punkt wyjścia, spójrz na Wzorce i praktyki Microsoft .


0

Wzorce uczenia się to nie tylko uczenie się czegoś. Dowiesz się, co możesz zrobić z językami programowania. Nauczyłem się wiele o programowaniu obiektowym , ucząc się, jak działa wzór ( w tym przypadku wzór złożony ).

Jak wspomniał Oded, większość programistów używa ich czasami, nawet ich nie rozpoznając. Piękno wzorów polega na tym, że można rozwiązać określone problemy za pomocą wstępnie zdefiniowanego wzoru, dzięki czemu nie trzeba dużo myśleć o rzeczach architektonicznych.


0

Nauczysz się wzorców, gdy zaczniesz pracować z istniejącymi projektami. Jest tak wiele wzorców do nauki, a opanowanie ich wszystkich nie jest warte czasu, ponieważ zależy to od projektu, nad którym pracujesz. Za każdym razem, gdy znajdziesz się w jednym, dowiedz się o nim, aby zobaczyć, jak jest używany.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.