Jak ważne są wzorce projektowe w programowaniu?

19

Jestem studentem uniwersytetu i właśnie zacząłem uczyć się o wzorach projektowych i staram się zrozumieć ich cel. Próbowałem je badać, ale wszystkie zasoby, które znalazłem, wydają się mówić o nich w sposób akademicki, a nie profesjonalny.

Jaki jest ich cel i czy należy się ich uczyć?

Roy James Schumacher
źródło
7
Dobrze wiedzieć o rozmowach kwalifikacyjnych!
wim,
5
Wzorzec projektowy to tylko nazwany, często powtarzający się sposób rozwiązywania problemów. Zwykle wynikają z braków językowych.
Jon Purdy,
7
Zrozumienie celu wzorców projektowych wymaga zrozumienia problemów, które rozwiązują. Zrozumienie tych problemów wymaga doświadczenia w trudny sposób :)
MattDavey,

Odpowiedzi:

36

Wzory projektowe świetnie nadają się do szybkiego komunikowania swoich zamiarów - każdy wie, czym jest Fabryka.

Naprawdę, naprawdę, bardzo złą rzeczą jest rozpoczęcie dopasowywania kodu do wzorców lub rozdzielanie obowiązków według wzorców lub czegoś podobnego. Jedną rzeczą jest powiedzieć „Ten obiekt jest Fabryką”, a drugą powiedzieć „Ten obiekt powinien być wyłącznie Fabryką”.

DeadMG
źródło
1
Tak więc wszyscy jesteście zainteresowani wzorcami, ale tak naprawdę nie są dla twojego kodu. Tak, dobrze jest przekazać pomysł, ale są jeszcze lepsze, gdy widać wzór w rzeczywistym kodzie.
Newtopian,
3
Po co głosować w dół? To właściwie najlepsza odpowiedź IMHO. Kodowanie to zdrowy rozsądek, a czasem można szybko zastosować wzorce, które dobrze pasują do rozwiązania problemu. Ale kiedy ludzie zaczną ich nadużywać wszędzie, zamienia się w piekło.
Koder,
1
Każdy kod zawiera pewien wzorzec, nawet jeśli go nie znasz. Wzory projektowe, o których mówisz, po prostu przegrupuj i nazwij zestaw powszechnie używanych i użytecznych wzorów. Kiedy je znasz, możesz myśleć o nich w bardziej świadomy sposób. Jeśli nazwiesz jedną ze swoich klas „ControlDispenser”, prawdopodobnie nikt nie będzie wiedział, co powinien zrobić. Jeśli jednak znasz wzór fabryczny, nazwiesz go „ControlFactory”, a inni natychmiast to zrozumieją.
Olivier Jacot-Descombes,
4
Jeśli służy to innemu celowi, powinna to być kolejna klasa ... oddzielenie obaw.
Nate,
2
@Nate: Jednym celem może być kilka wzorów. Nie ma powodu, dla którego jedna klasa powinna obejmować tylko jeden wzór. Wzory nie są „atomowymi” obowiązkami. Jedna odpowiedzialność może wymagać kilku wzorców.
DeadMG,
26

Z artykułu w Wikipedii na temat Wzorów projektowych :

Przydatność mówienia o wzorach polega na wspólnej terminologii do omawiania sytuacji, które projektanci widzą w kółko.

Od bardzo dawna mamy poważny problem z inżynierią oprogramowania: zatrudniasz nowoprzybyłego do projektu i bez względu na to, jak dobrze znają język programowania, miesiące zajmują mu zapoznanie się z tym, jak to się dzieje w twoim projektu, zanim będą mogły być produktywne. W inżynierii sprzętowej rozwiązali ten problem bardzo dawno temu: mają wspólną terminologię zwaną „schematami”. Zatrudniasz inżyniera sprzętu, rano podajesz schematy swojego projektu sprzętowego, pozwól im się go przestudiować, a wieczorem, zanim nadejdzie czas, aby zadzwonić do niego w dzień, mogą podnieść pistolet lutowniczy i stać się produktywnym. Staraliśmy się znaleźć sposoby, aby być w tym lepszym; standaryzacja języków programowania była jednym ze sposobów; biblioteki standardowe (obecnie biblioteki klas) były innym sposobem; ale jednym z najważniejszych sposobów może być wzorce projektowe. Czy są one ważne? Obstawiasz!

Mike Nakis
źródło
3
Porównywanie rozwoju oprogramowania do elektrotechniki jest równie dokładne, jak porównywanie rakiety Saturn z rowerem. Obie metody transportu (przejście z punktu A do punktu B), ale omawiają to całkowicie odmienne i niezgodne sposoby.
jer
3
@jer Hmmm, twoja analogia jest słaba. Oba są dyscyplinami inżynierskimi. Nawet gdyby ich podobieństwa się skończyły, z definicji nadal miałyby ze sobą wiele wspólnego. Nie mamy nadziei, że uda nam się je zrównać, ale jedno ma wiele do nauczenia się od drugiego.
Mike Nakis,
6
@Mike: tam jest zasadnicza różnica: obwody elektryczne są ograniczane przez twardych ograniczeń fizycznych. Systemy oprogramowania są ograniczone rozmytymi granicami ludzkiego intelektu.
kevin cline
3
Przede wszystkim nie powiedziałem, że nie ma dużych różnic. Po drugie, twoje oświadczenie również jest nieprawidłowe. Oprogramowanie podlega twardym ograniczeniom, określonym przez składnię języka. Liczba permutacji, w których ludzki intelekt może łączyć elementy elektroniczne, jest również nieograniczona. Ale znowu nie próbuję zrównać tych dwóch, ani nawet powiedzieć, że istnieje bardzo dużo podobieństwa. Mówię tylko, że jedno ma wiele do nauczenia się od drugiego .
Mike Nakis,
3
Ponieważ w oprogramowaniu chodzi o projektowanie, podobną analogią elektrotechniczną byłoby omówienie „lustra prądu” i „ujemnego sprzężenia zwrotnego” w obwodzie wzmacniacza. Nie są to odrębne elementy na schemacie, ale raczej układ kilku składników, który spełnia określony cel. Wiedza na temat łączenia komponentów bez znajomości ich celów nie pozwoli nowej osobie na stworzenie nowego projektu. (tzn. jest to krok naprzód w zrozumieniu.)
rwong,
9

Istnieją naprawdę dwa różne, istotne powody istnienia wzorów.

Pierwszy został już dość dobrze wyjaśniony: użycie wzorców smaruje komunikację między programistami. Jeśli oboje rozumiemy, że kiedy mówię „Obserwator”, mówię o bardzo specyficznej strukturze kodu, to mogę bardzo szybko opisać, jak działa kawałek kodu, który używa tego wzorca. Alternatywą jest pełne opisanie rozwiązania, które jest czasochłonne i podatne na błędy. („Cóż, stworzyłem tę czystą klasę wirtualną, która opisuje i interfejs dla obiektów konsumenckich, a następnie stworzyłem klasę, która utrzymuje listę aktywnych konsumentów, która ...”)

Drugą zaletą wzorców jest to, że są one gotowymi formami rozwiązań typowych problemów. Jeśli znasz swoje wzorce i na przykład napotkasz problem, w którym musisz znaleźć dobry sposób na uzyskanie informacji od (prawdopodobnie wielu) obiektów producenta do wielu obiektów konsumpcyjnych, bez wprowadzania niepotrzebnego łączenia między klasami, rozpoznasz „to to praca dla obserwatora! ” i od razu będziesz wiedział, jak rozwiązać problem.

Korzyści te również naprawdę się wzmacniają. Pozwalają one szybko rozwiązać niektóre typowe klasy problemów, a po zakończeniu można bardzo szybko komunikować, w jaki sposób rozwiązano problem.

Porównaj to ze światem, w którym wzory „nie istnieją”. Wpadasz na jedną z tych klas problemów, które na ogół nie są trywialnymi problemami projektowymi, i spędzasz sporo czasu na wymyślaniu dobrego rozwiązania (które, nawiasem mówiąc, bardzo prawdopodobnie będzie wyglądać podobnie do odpowiedniego wzorca). Następnie pojawia się twój współpracownik i chce wiedzieć, jak go rozwiązać, i spędzasz godzinę na omawianiu tego, jak i dlaczego.

Wszystko to wiąże się z zastrzeżeniem, które powinno wydawać się dość oczywiste: nie próbuj wrzucać problemów we wzorce, które nie pasują. Jeśli wzorzec nie pasuje do problemu, rozwiązanie skończy się zawiłością i utracisz korzyści wynikające ze zmniejszenia nakładów wynikające z wzorców. Dodatkowo, ponieważ twoja praca nie będzie już pasować do zrozumienia przez współpracowników znaczenia wzoru, stracisz koszty korzyści komunikacyjnych. W rzeczywistości prawdopodobnie zwiększysz koszt komunikacji ponad koszt braku wzorców, ponieważ niewłaściwe użycie tego schematu da twojemu współpracownikowi fałszywe zrozumienie rozwiązania, co jest gorsze niż brak zrozumienia.

ipeet
źródło
2
To błędne przekonanie, że wzorce projektowe są gotowym rozwiązaniem. Są to „WZORY”, które nie zawsze przekładają się na kod.
Martin York,
Eee, wzorzec zawsze przekłada się na kod, to prawie dane - problem polega na tym, że nie zawsze pasują one do posiadanego kodu, posiadanej architektury lub ograniczeń, nad którymi pracujesz. tj. tylko dlatego, że wzór może pasować, co niekoniecznie oznacza, że ​​możesz go użyć. Można założyć, że o to ci chodziło (ale nie lubię zakładać).
Murph
5

Wzorce dotyczą ponownego wykorzystywania pomysłów i koncepcji oraz ustanowienia wspólnej / spójnej platformy do ich przekazywania.

Wszyscy jesteśmy zgodni (!), Że teoretycznie ponowne użycie kodu jest dobrą rzeczą - ale okazuje się trudniejsze niż chcielibyśmy to robić praktycznie (pod pewnymi względami to się zmienia, ale zawsze będzie wyzwaniem ). Ale w rzeczywistości wiele z tego, co chcemy ponownie wykorzystać, to sposób robienia rzeczy, użycie pewnego rodzaju szablonu do skonstruowania rozwiązania konkretnego problemu - są to Wzory. Tak więc dochodzimy do przypadku, w którym mówisz, że dobrym podejściem do rozwiązania problemu X jest użycie Wzoru Y i wiemy, że elementy wzoru Y to a, b i c, i ruszamy. Ponieważ wzory są szeroko rozumiane, nie musisz szczegółowo wyjaśniać, jakie są korzyści z komunikacji.

Zabawne w wzorcach jest to, że języki i frameworki ewoluują, aby zapewnić lepszą obsługę wspólnych wzorców, a efektem netto jest to, że otrzymujemy coraz więcej i lepsze ponowne wykorzystanie kodu (coraz więcej klocków Lego!), Ponieważ sposób, w jaki budujemy aplikacje (poprzez wdrażanie wzorców ) ułatwia ponowne użycie.

Murph
źródło
4

Wzory projektowe są po prostu znanymi cegłami, na których opiera się każde oprogramowanie. Są ważne z następujących powodów:

  1. Są niezależni od języka. Gdy już wiesz, jaki wzorzec projektowy jest odpowiedni dla danego problemu / architektury / zadania, możesz go wdrożyć w dowolnym języku wieloparadygmatycznym - niech to będzie C #, Java lub Python - rozwiązanie będzie w większości przypadków takie samo, po prostu masz dostosować składnię. Oznacza to, że możesz przenieść swoje doświadczenie z programowania w jednym języku na inne języki, o ile pozostajesz w tej samej domenie problemowej (a może nawet w różnych domenach).

  2. Pomimo faktu, że wzorce projektowe wiążą się z paradygmatem programowania , co oznacza, że ​​wzorce projektowe do programowania obiektowego (najsłynniejsze, znane również jako wzorce „Gang of Four” ). Wzory pozwalają zrozumieć, do czego najlepszy jest ten paradygmat, i pomóc wyjść poza samą składnię.Na przykład widziałem wiele implementacji w języku C # i Javie, gdzie ludzie po prostu zaprogramowali sposób, w jaki to zrobili w Basicu lub Fortranie - mają doskonały imperatyw do rozwiązywania problemów i używają OOP tylko do renderowania tego rozwiązania - bez dziedziczenia , brak polimorfizmu, wszystkie metody są publiczne itp. Wzory projektowe pomagają spojrzeć za te koncepcje i zobaczyć, jak działają w prawdziwym życiu. To samo dotyczy wzorca projektowego w innych paradygmatach, takich jak programowanie funkcjonalne.

  3. Wzory są na ogół przydatnym sposobem przedstawiania pomysłów i pochodzą z informatyki z architektury. Kiedy zrozumiesz ideę pewnego „wzorca”, możesz łatwo rozpoznać ten wzorzec w innym problemie i rozwiązać go za pomocą tego wzorca (prawdopodobnie nieco zmodyfikowanego, aby lepiej rozwiązać Twój problem). Istnieje mnóstwo różnych wzorców: w integracji oprogramowania dla przedsiębiorstw , w testowaniu kodu źródłowego itp. Po prostu szukaj wzorców w książkach z informatyki.

  4. Oprócz nabywania dobrych praktyk poprzez uczenie się wzorców , możesz łatwo nauczyć się, jak unikać głupich błędów w kodzie, badając anty-wzorce . Istnieje wiele książek zawierających typowe błędy w różnych domenach w postaci anty-wzorów, które są bardzo zabawne i jednocześnie edukacyjne. Nawiasem mówiąc, uwielbiam nazwy tych anty-wzorów!

Alexander Galkin
źródło
2

Wzorzec można uznać za sprawdzony sposób rozwiązania problemu zrozumiałego przez Ciebie i innych programistów. Np. Problem polega na utworzeniu posortowanej listy danych, a następnie możesz użyć połączonej listy lub umieścić dane w wektorze i posortować. Prawdopodobnie znasz obie te opcje, ponieważ możesz już znać wzorzec połączonej listy lub wzorzec ładowania i sortowania wektorów. Możesz znać zalety i wady każdego z nich i nie musisz widzieć implementacji, aby zrozumieć, co się dzieje.

Adam F.
źródło
1

Myślę, że zaczynasz programować, nie sugeruję, abyś wcześnie nauczył się projektowania. Nauka i zrozumienie wzorca projektowego musi opierać się na doświadczeniach związanych z tworzeniem oprogramowania. Powinieneś więcej ćwiczyć kodowanie i znaleźć, który styl kodu jest zły, a następnie nauczyć się wzorca projektowego, aby poprawić projekt.

Mark xie
źródło
1

Przydatność wzorca projektowego zależy od wybranego języka. Im mocniejszy język wybierzesz, tym mniej będziesz musiał zrozumieć i wdrożyć wzorce projektowe. Wzorzec projektowy może być sygnałem, że Twój język jest do bani, brakuje wbudowanej funkcji.

Joe Gregorio wygłosił świetną rozmowę o braku wzorców projektowych w Pythonie

Cesar Canassa
źródło
Dzięki za link o braku wzorców projektowych w Pythonie. Edycja: Ups !! Film został usunięty z tej lokalizacji !! :(
Saurabh Patil
0

Wzorce projektowe są rozwiązaniem typowych problemów napotkanych podczas tworzenia oprogramowania. Zawsze istnieje więcej niż jedno rozwiązanie niektórych problemów, a wzorce projektowe pomagają zdecydować, które rozwiązanie jest najlepsze, zapewniając zestaw dobrych rozwiązań tych typowych problemów.

Mansuro
źródło