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”.
źródło
Odpowiedzi:
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.
źródło
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
foreach
sł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).
źródło
foreach
konstrukcja 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.yield
wtedy też nie istniał. Czy uważasz, że złamanie starego kodu przez usunięcie słowa kluczowego jest lepszą opcją?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.
źródło
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.
źródło
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ą.
źródło
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.
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.
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.
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ąć.
źródło
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.
źródło
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 -.
źródło
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.
źródło
Dodawanie do Lunivore. Chciałbym zacytować to z pierwszej książki
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.
źródło
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ć.
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.
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 .
źródło
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.
źródło
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.
źródło