Co się stanie, jeśli nie będę używać wzorców projektowych? [Zamknięte]

17

Z jakimi problemami mogę się spotkać, jeśli nie będę używać wzorców projektowych? Czy możesz mi powiedzieć o problemach z podejściem do projektu przy użyciu standardowych technik obiektowych?

ja, uczeń
źródło
24
Sporo wzorców projektowania oprogramowania jest dość oczywistych. Musisz znać je wszystkie bardzo dobrze, aby mieć pewność, że ich nie używasz - prawdopodobnie na tyle dobrze, że równie dobrze możesz ich użyć!
James McLeod,
18
Na marginesie @JamesMcLeod wiele „Wzorów projektowych” jest bardzo oczywistych i rzeczy, które każdy i tak by zrobił. Dlaczego więc nadajemy imiona? Do celów komunikacji. „Używam wzorca X” ma znacznie większą gęstość semantyczną niż wyjaśnianie twojego rozwiązania w nadziei, że drugi koniec pójdzie „Och tak! Zrobiłem to również, z wyjątkiem tego, że nazwałem moje zmienne ...”.
Phoshi
6
@AJMansfield Niektóre z najgorszych kodów, jakie widziałem, dotyczyły nadmiernego entuzjazmu dla wzorców projektowych.
Erik Reppen
5
@ErikReppen winę za nadużywanie wzorców projektowych należy przypisać osobie, która to robi. Z mojej perspektywy podstawowym problemem nie są same wzorce projektowe, ale nadmierna generalizacja (częściowo z powodu braku nadzoru architektonicznego) i nadmierna inżynieria (czasem przez komitety inżynierów).
rwong
5
„Wzory projektowe” to leksykon, a nie technika.
Kaz Dragon

Odpowiedzi:

76

Nie rozumiesz sedna sprawy.

Wzory projektowe z natury istnieją podczas projektowania oprogramowania, podobnie jak wzorce konstrukcyjne istnieją na świecie. Nawet jeśli nie znasz nazwy rzeczy, w końcu okaże się, że pewne struktury fizyczne są dobrze dostosowane do pewnych problemów. Przekonasz się, że trójkątny drewniany / metalowy pręt itp. Jest bardzo stabilną konstrukcją, ale tylko w płaszczyźnie. Przekonasz się, że kwadratowe klocki mają pewne zalety w stosunku do okrągłych ...

Podobnie niektóre struktury oprogramowania są w pewien sposób unikalne lub optymalne. W końcu je znajdziesz i będziesz używać ich bez względu na to, czy znasz ich nazwy . To jest sedno wzorców projektowych - to nazwy tych struktur, które doświadczeni programiści znają i używają. Daje to programistom możliwość komunikowania się o wiele bardziej jednolicie i zwięźle. Pozwala także programistom na bardziej świadome myślenie o wzorcach.

Więc dwa kluczowe punkty, które staram się przedstawić:

  1. Nie można nie skorzystać z wzorców projektowych.
  2. Nie znając nazw używanych rzeczy, będziesz miał trudności z pracą w zespole.
Telastyn
źródło
12
+1: Absolutnie racja. Zacząłem opracowywać OO, zanim wzory projektowe stały się znane lub popularne. Tak, wymyśliliśmy również takie rzeczy jak fabryki, singletony i coś, co po zmrużeniu oka w jasnym świetle wygląda jak strategia. Chodzi o to, że teraz znam wzorce projektowe, wiem, że fabryki były OK, ale można było to zrobić lepiej, Singletony były źle wykonane, a to, co mogło być wzorcem Strategii, byłoby znacznie lepsze, gdyby faktycznie było wzorcem Strategii.
Binary Worrier
3
... Uczenie się o wzorach projektowych i nauczenie się, jak je właściwie wykorzystywać, pozwala zaoszczędzić tyle czasu, że rzadziej próbujesz wynaleźć koło, powstrzymując cię od zejścia w kierunku złego projektu i budowania złych rozwiązań. Ssijcie to i uczcie się wzorów, używajcie ich, gdy pracują dla was, i nie używajcie ich, gdy nie będą.
Binary Worrier
1
I to dokładnie podsumowuje moje poglądy na wzory. Są wspaniałymi narzędziami do komunikowania się z innymi. Nigdy nie budujesz ich dokładnie, ponieważ każdy problem jest inny. Ale są one istotą, kierunkiem i przybliżonym zestawem wskazówek, których należy przestrzegać, i ułatwiają wytłumaczenie innym, co do cholery robisz.
Matt D
+1 za porównanie ze strukturami fizycznymi. Dodałbym, że pomaga zbudować dom, jeśli już wiesz, że „kratownica” jest dobrą konstrukcją do obsługi obciążenia dachu, zamiast eksperymentować i mieć nadzieję, że się nie zawali.
kdgregory
39

Ci, którzy nie pamiętają przeszłości, skazani są na jej powtórzenie.

Nie napotkasz żadnych specyficznych problemów poza tymi, które wywołuje Twój projekt. Z czasem skończysz z wzorami, nie będąc świadomym, po prostu spędziłeś czas na ich samodzielnym opracowaniu. Znajomość wzorów ułatwia ich zauważenie w projekcie i ma tę główną zaletę, że zostały udowodnione przez wiele osób.

Wszystko, co jest obecnie rozwijane, opiera się w dużej mierze na wcześniejszej wiedzy, nie ma sensu go ignorować. Wyobraź sobie budowę dzisiejszego wieżowca, nie znając problemów, z jakimi borykają się ludzie, którzy budowali katedry kilkaset lat temu.

diabelnie
źródło
10
„Każdy cytat ma taką samą i przeciwną bez cudzysłowu”. „Musimy rozerwać przeszłość, jeśli naprawdę chcemy zasłużyć na przyszłość”. (OK, ten był Hitlerem, więc prawdopodobnie najlepiej go zignorować ....)
Russell
20

Z jakimi problemami mogę się spotkać, jeśli nie będę używać wzorców projektowych?

Będziesz miał problem z niemożnością napisania oprogramowania.

Zmienne są wzorcem projektowym.

Metody są wzorcem projektowym.

Operatory - dodawanie, odejmowanie itp. - są wzorcem projektowym.

Instrukcje są wzorcem projektowym.

Wartości są wzorcem projektowym.

Referencje są wzorcem projektowym.

Wyrażenia są wzorcem projektowym.

Klasy są wzorcem projektowym.

...

Wszystko, co robisz w programowaniu przez cały czas, jest wzorem . Przez większość czasu wzór jest tak zakorzeniony w twoim myśleniu, że przestałeś myśleć o nim jako o „wzorcu projektowym”. Rzeczy, których musisz się nauczyć, takie jak „wzór singletonu” i tak dalej, to po prostu wzory, które nie zostały (jeszcze) upieczone w jakimkolwiek języku, którego używasz.

Czy możesz mi powiedzieć o problemach z podejściem do projektu przy użyciu standardowych technik obiektowych?

Nie. Nie mam pojęcia, co to pytanie oznacza. Wzorce projektowe „standardowymi technikami obiektowymi” - dlatego tworzą wzorce projektowe . Wzorzec projektowy jest standardową techniką rozwiązywania określonego problemu, szczególnie (choć niekoniecznie ) w języku obiektowym.

Eric Lippert
źródło
1
The things that you have to learn like "the singleton pattern" and so on are simply patterns that haven't (yet) been baked into whatever language you're using.- Taka jest (prawie) definicja wzorca projektowego - elastyczna / łatwa do ponownego użycia konstrukcja kodu używana do przezwyciężenia ograniczenia w samym języku, który jest łatwy do przekazania innym. Gdy jest częścią języka, nie jest już wzorem.
Izkata
1
@Izkata: Więc twoja pozycja jest taka, powiedzmy, że wzór obserwatora jest niemożliwy w C #, ponieważ C # ma wzorzec obserwatora wbudowany w język w postaci zdarzeń? To głupie. Bit specyficzny dla języka, który jest istotny dla wzorca, jest kanonicznym sposobem na wdrożenie wzorca w języku. Oczywiście wzorców projektowych można używać w językach, które je bezpośrednio obsługują; to cały sens bezpośredniego wspierania ich!
Eric Lippert,
Nigdy nie mówiłem, że to niemożliwe, starałem się sugerować niepotrzebne . Na przykład Java nie ma zdarzeń, więc używa wzorca projektowego do ich symulacji.
Izkata,
@Izkata: Jestem wtedy zmieszany. Powiedziałeś, że kiedy wzór jest częścią języka, nie jest już wzorem. Czy więc „wzorzec obserwatora” jest wzorem w Javie, ale nie wzorem w języku C #?
Eric Lippert,
1
Innymi słowy, wzorzec projektowy to wszystko, co robi programista, niż można to opisać po angielsku. Nie jestem pewien, czy całkowicie zgadzam się z definicją, ale myślę, że dokładnie odzwierciedla to, co mówisz, i przynajmniej nie ma żadnej subiektywnej oceny, która liczy się jako wzorzec. Jest to właściwość analizy tego, co robią programiści, i oczywiście nie jest możliwe, aby programista działał w sposób, którego nie można przeanalizować :-)
Steve Jessop
4

Zrozumienie punktu wzorca projektowego jest ważniejsze niż użycie go do litery. Niektóre wzorce są, IMO, głupie, przynajmniej w paradygmatach językowych, do których jestem przyzwyczajony. IMO, programista, który po prostu ślepo używa wzorców projektowych i nie rozumiejąc ich, jest gorszym programistą niż ten, który sam chciałby przemyśleć różne rzeczy. Ale ktoś, kto zapozna się z pomysłami, a następnie sam zdecyduje, czy warto, może być znacznie silniejszym programistą niż którykolwiek z nich.

To powiedziawszy, nie mam pojęcia! Jaki jest sens wagi muchowej i nie wstydzę się tego przyznać. (zobacz komentarze do innego wpisu na Wikipedii, który bardzo pomógł)

Polecam wpis wikipedii o wzorach projektowych. Jest bardzo zwięźle i wyraźnie napisane. Bardzo pomocny w zrozumieniu, dlaczego można zawracać sobie głowę danym wzorcem projektowym, czy nie. Osobiście uważam, że najprostsze są najbardziej przydatne i nie zastanawiałbym się dwa razy nad modyfikacją danej implementacji dowolnego wzorca, aby pasował do moich potrzeb.

To są pomysły, a nie plany. W niektórych językach nie są to wcale dobre pomysły. W innych są słusznie postrzegane jako kłótnie w przezwyciężaniu słabości projektowych języka, które można lepiej zrekompensować mniejszą złożonością. Niezależnie od tego nie zaszkodzi zbadać je i spróbować zrozumieć wyzwania, które mają pokonać, zanim zdecydujesz się na własne preferowane rozwiązania.

Jakie problemy napotkasz? Możesz stracić okazję i poświęcić więcej czasu na problemy, niż potrzebujesz, chyba że jesteś geniuszem programistycznym, który już wszystko zrozumiał. Ważne jest, aby zachować krytyczne spojrzenie na popularne pomysły programistyczne, ale nigdy nie boli rozumieć, co ludzie myślą, że rozwiązują, ponieważ zapewni to większą przejrzystość preferowanym rozwiązaniom / podejściom.

Erik Reppen
źródło
2
waga muchowa (nie koło zamachowe). Przeczytaj pierwszy akapit (i tylko pierwszy akapit) artykułu z Wikipedii, a następnie spójrz na Integer.valueOf (int) i zastanów się, ile razy pozwala to uniknąć tworzenia nowych liczb całkowitych dla wspólnych wartości.
2
@MichaelT And cholera. To sprawiło, że stało się to o wiele lepsze niż cokolwiek, co widziałem. Dzięki.
Erik Reppen
Problem, który widzę w większości instrukcji wzorców projektowych, polega na tym, że starają się przedstawić duży widok projektu (książka GoF polega na pisaniu edytora tekstu - nie jest to małe zadanie). Ale czasami mają zastosowanie do znacznie mniejszych (prawie „trywialnych”) rzeczy. 7 linii kodu może dokładnie opisać wagę latania w czymś, z czego wszyscy ciągle korzystają. Znacznie łatwiejsze do zrozumienia niż duże projekty lub wymyślone przykłady.
1
@MichaelT Dla mnie jest to również dobry przykład tego, w jaki sposób uzyskanie odrobiny jasności na czymś pomaga w pisaniu kodu w ogóle, nawet jeśli ten pomysł nie ma natychmiastowego zastosowania w moim podstawowym języku, JavaScript, gdzie do rozwiązania tego problemu używa się zwykle prototypowego dziedziczenia i zamknięć. problem. Ta chwila a-ha wciąż dała mi kilka pomysłów, które są istotne.
Erik Reppen
2

Główny problem, z którym się spotkasz, polega na tym, że wymyślisz koło na nowo . Nazywa się je wzorami, ponieważ pojawiają się często i w przewidywalny sposób.

pgpb.padilla
źródło
0

Nawet jeśli podążasz za wzorami projektowymi, możesz mieć zły projekt. Wzory projektowe są naturalne i wykorzystasz je w swoim projekcie. Będziesz musiał bardzo się postarać, aby nie użyć żadnego z wzorów. Nie ma powodu, aby potępiać wzorce projektowe, ważniejsze jest wybranie odpowiednich wzorów dla swoich potrzeb

ViSu
źródło
-1

Cały czas używasz wzorów, nie zdając sobie z tego sprawy. Wiele standardowych bibliotek w popularnych językach zostało zaprojektowanych z uwzględnieniem wzorców projektowych. Przykładem jest FileReaderbiblioteka Java, która została zaprojektowana przy użyciu wzorca projektowego dekoratora . Mówiąc teraz o swoim własnym kodzie, nie musisz używać wzorców projektowych (w większości przypadków). Wzorzec projektowy jest „rozwiązaniem wielokrotnego użytku dla często występującego problemu” , co oznacza, że ​​pomoże ci napisać czystszy, łatwiejszy w utrzymaniu kod, więc tak naprawdę to od ciebie zależy, ile chcesz skończyć z kodem spaghetti.

Savv
źródło