Rozmawiałem z jednym z naszych starszych programistów, który działa w branży od 20 lat. Jest dość dobrze znany w Ontario z bloga, który pisze.
Dziwne jest to, co mi powiedział: powiedział, że istnieje kawałek kodu, który jest koszmarem do pracy, ponieważ został napisany z podręcznika i nie uwzględnia prawdziwego świata. Dodanie nowego pola do warstwy interfejsu użytkownika / bazy danych / danych zajmuje 2-3 godziny, podczas gdy w jego kodzie zajmuje to 30 minut.
Inną rzeczą jest to, że unika wzorców projektowych, ponieważ większość programistów ich nie rozumie i nie są dobrzy z punktu widzenia konserwacji.
Jest też pomysł, że większość programistów internetowych w Kanadzie woli, aby ich model danych dziedziczył z klas warstwy danych, zamiast utrzymywać go w izolacji. Zapytałem go: „Czy nie jest standardem branżowym, aby model był oddzielany od warstwy danych?” Mówił czasem, ale większość ludzi woli tego nie robić, bo to za dużo pracy.
Wygląda na to, że jego powodem nie kodowania przy użyciu najlepszych praktyk jest koszmar konserwacji, niewielu naszych pracowników to rozumie (oprócz mnie), a praca z nim jest powolna, jeśli chcesz wypchnąć nowe funkcje lub pola w ciągu kilku dni ” czas.
Dziwnie jest słyszeć taką opinię, biorąc pod uwagę, że Stack Overflow w większości zachęca ludzi do przestrzegania standardów branżowych. Czy problem polega na tym, że ciągle jesteśmy zmuszeni do rezygnacji z nowych pól i funkcji w ciągu kilku dni, że nie można wywnioskować solidnego wzoru, który jest wystarczająco elastyczny? To wydaje się być sednem tego, co rozumiem z tego.
Co sądzisz o tych stwierdzeniach?
źródło
Odpowiedzi:
To są słowa kogoś, kto odnalazł sukces i ignoruje ludzi, którzy próbują mu powiedzieć, co robić żargonem wzorcowym, którego nie rozumie.
Wzory projektowe i najlepsze praktyki to nie to samo. Niektórzy myślą, że są i kierują ludźmi, którzy wiedzą, co robią. Nawet jeśli nie znają właściwej nazwy tego, co robią.
Wzory projektowe istniały zanim miały nazwy. Nadaliśmy im nazwy, aby ułatwić sobie rozmawianie o nich. Wzór o nazwie nie czyni go dobrą rzeczą. To sprawia, że jest to rozpoznawalna rzecz.
Ten facet prawdopodobnie używa wzorów, o których nikt z was nie słyszał. W porządku, dopóki nie musisz z nim porozmawiać o tym, jak coś się robi. Albo będzie musiał nauczyć się z tobą rozmawiać, albo ty będziesz musiał nauczyć się z nim rozmawiać. Nie ma nic wspólnego z tym, kto ma „rację”.
źródło
Wiele wzorców projektowych, które opisujesz ty i twój przyjaciel, jest naprawdę tylko obejściem braków w językach programowania . Użyj bardziej wyrazistego języka programowania, a większość zapotrzebowania na te wzorce projektowe zniknie.
Ponieważ dobre wzorce projektowe są wymagane, aby spełnić wiele możliwych scenariuszy użytkowania, są one zwykle nadprodukowane. Przepracowany kod wiąże się z pewnymi kosztami: musisz go przeczytać, zrozumieć, co robi i zrozumieć, jak działa w kontekście całego systemu oprogramowania. W związku z tym, podobnie jak w przypadku każdej innej techniki tworzenia oprogramowania, musisz ocenić tę technikę w stosunku do kosztów jej zastosowania i zdecydować, czy korzyści przewyższą koszt.
Wszystkie inne rzeczy są równe, mniej kodu jest zawsze lepsze. Przeszedłem przez architekturę warstwową, w której dosłownie trzeba wykonać od trzech do sześciu przeskoków w wielu projektach, aby znaleźć interesujący kod , to znaczy kod, który faktycznie osiąga coś innego niż dodanie narzutu.
Dobrze znane wzorce oprogramowania powinny dać ci wspólne słownictwo, dzięki któremu możesz komunikować strategie projektowe. Niestety, wielu programistów nie rozumie słownictwa wzorcowego na tyle dobrze, aby właściwie zastosować go do swoich problemów programistycznych. Niedoświadczeni programiści widzą te wzorce w domenie ekspertów; chcą być postrzegani jako eksperci, dlatego starają się uczyć i stosować wzorce zbyt wcześnie, zanim będą gotowi. Zamiast tego powinni raczej skupić się na nauce podstaw programowania, a następnie spróbować rozwiązać problem, który każdy z nich rozwiązuje samodzielnie. Jeśli to zrobią, będą w znacznie lepszej pozycji, aby poprawnie zrozumieć i zastosować wzorce.
źródło
Stackoverflow.SE i Programmers.SE najczęściej zachęcają ludzi do stosowania najlepszych praktyk, takich jak SOLID, a nie standardów branżowych . I wierzcie lub nie, de facto standardem branżowym jest często architektura „wielkiej kuli błota” - poważnie.
Ale aby odpowiedzieć bezpośrednio na twoje pytanie: problem ze wzorami projektowymi jest podobny jak w przypadku dziedziczenia - wielu przeciętnych twórców nadużywa ich, co wiąże się z pewnym ryzykiem tworzenia nadinżynieryjnego, trudnego do utrzymania kodu. Ale odpowiedzią na to z pewnością nie jest całkowite uniknięcie lub zakazanie używania wzorców projektowych (lub dziedziczenia), odpowiedzią jest nauczenie się korzystania z tych narzędzi w sytuacjach, w których mają one sens, i tylko tam. I to jest całkowicie niezależne od działania „zwinnego” lub nie.
źródło
Wzory projektowe to tylko nazwy używane do przekazywania pomysłów. Często robiłem rzeczy, które później miały nazwę. Zatem nie ma „sposobu wzorca projektowego” w przeciwieństwie do „sposobu wzorca projektowego”.
Wzory projektowe są wytycznymi. Jak wszystko, każdy z nich ma zalety i wady. Kluczem nie jest nauczenie się wzoru i zastosowanie go tam, gdzie pasuje, ale raczej zrozumienie idei wzoru, jego zalet i wad oraz wykorzystanie go, aby uzyskać inspirację do rozwiązania twojego problemu.
Każda najlepsza praktyka i wytyczne mogą zostać zignorowane, jeśli istnieje wystarczająco dobry powód. Prawidłowe powody to czas opracowania i oczekiwania dotyczące aplikacji. Na przykład zdaję sobie sprawę, że wartości kodu są złe (głupi przykład), ale dla potwierdzenia koncepcji korzyści mogą przewyższać koszty (w tym przypadku głównie czas programowania). Jeśli jednak zostanie podjęta taka decyzja, może ona przynieść skutki odwrotne, a w pewnym momencie może być wymagana refaktoryzacja.
źródło
Aby dodać kolejną metaforę do zupy, wzorami projektowymi są Clippy, pomocnik pakietu Microsoft Office. „Wygląda na to, że robisz to samo z całą masą rzeczy. Czy mogę ci w tym pomóc, oferując Iterator lub Odwiedzającego?”
Dobry zapis tych wzorców wskaże, kiedy warto zrobić coś tak samo, jak to robiono wiele razy wcześniej, jakie błędy popełnisz przy pierwszej próbie i jakie są wspólne sposoby na uniknięcie tych błędów . Więc czytasz wzór projektowy (lub przeglądasz go z pamięci), a następnie zaczynasz swoją pracę. To, czego nie możesz zrobić, to uzyskać tylko za pomocą Clippy i kreatorów.
Niedoświadczeni ludzie mogą popełnić błąd i napisać kod, który nie uwzględnia rzeczywistości, wtedy, gdy myślą, że ich lista wzorców projektowych jest pełną listą wszystkich możliwych podejść do rozwiązywania problemów w oprogramowaniu i próbują zaprojektować kod, łącząc ze sobą projekt wzory aż do zakończenia. Inną kiepską taktyką obserwowaną na wolności jest róg buta do sytuacji, w której tak naprawdę nie jest on odpowiedni, na podstawie tego, że wzór „jest najlepszą praktyką”. Nie, może to być najlepsza praktyka dla klasy problemu, który faktycznie rozwiązuje , ale z pewnością nie jest to najlepsza praktyka w przypadku problemów, których nie rozwiązuje, lub problemów, które rozwiązuje tylko poprzez wprowadzenie niepotrzebnej złożoności, gdy istnieje prostsze rozwiązanie .
Oczywiście możliwe jest również, że ktoś uniknie wzoru na podstawie tego, że YAGNI, a następnie zda sobie sprawę, że go potrzebuje i dąży do normalnego rozwiązania. Jest to zwykle (ale nie zawsze) gorsze niż realizacja wymagań od samego początku i dlatego nawet w zwinnym rozwoju jest frustrujące, gdy całkowicie przewidywalne wymagania nie są wcześnie wykrywane. Nie mogłem być jedynym programistą C ++, który był bardzo rozbawiony tym, że Java początkowo odrzuciła generyczne kontenery jako niepotrzebnie złożone, a następnie przywróciła je później.
Więc jest to prawie na pewno pomyłka, aby uniknąć pisania iterator na zasadzie dlatego, że wolą unikać wzorców projektowych.
Naprawdę nie można się z tym kłócić: dzięki tej metodzie jego konstrukcja jest znacznie lepsza od drugiej. Czy to dlatego, że unikał wzorców projektowych, jest jednak wątpliwe, myślę, że jest to bardziej prawdopodobne, ponieważ przy projektowaniu wziął pod uwagę właściwe „rzeczywiste” problemy, a dzięki doświadczeniu jest lepszy w swojej pracy niż ktoś uzbrojony tylko w podręcznik i wysokie ideały.
Zrozumiał więc, że każdy wzorzec, który wymaga dotknięcia wielu różnych punktów w kodzie, aby dodać pole, jest złym wzorcem dla zadania, „ułatwia dodawanie pól” i nie używał tych wzorów. Architektury warstwowe rzeczywiście mogą ucierpieć pod tym względem i niewłaściwe jest stosowanie wzorców projektowych bez doceniania ich wad.
W przeciwieństwie do tego, ile czasu zajmuje napisanie nowego interfejsu użytkownika w jego projekcie i jak długo zajmuje to architektura warstwowa? Jeśli projekt wezwał go do ciągłego budowania i wdrażania nowych interfejsów użytkownika za pomocą stałego modelu danych, zamiast ciągłego dodawania pól, mam nadzieję, że to zrobił. Lub też. Ale pomimo wszystkich jego zalet, powiedzenie „działamy zwinnie” nie oznacza niestety, że nigdy nie będziesz musiał dokonywać kompromisu!
Wybór z menu wzorów projektowych z pewnością może przestać myśleć o najważniejszych problemach. Ale rozpoznanie, kiedy piszesz gościa, i udokumentowanie go lub nadanie mu nazwy „gość”, aby pomóc czytelnikom szybko go zdobyć, nie przeszkadza w niczym. Pisanie „to jest gość” zamiast prawidłowego dokumentowania jest straszną pomyłką z tego powodu, dla którego twój starszy programista - programiści nie zrozumieją. Nawet programiści, którzy wiedzą, czym jest Gość, potrzebują więcej informacji niż tylko „to jest Gość”.
źródło
Wygląda na to, że twój kolega cierpi na zespół NIH („Not Invented Here”).
Jest całkowicie prawdopodobne, że jego kod ułatwia dodawanie nowych pól: znacznie szybciej aktualizuję własny kod niż kod napisany przez innych facetów. Jednak ta krótkoterminowa szybkość nie mówi nic o łatwości konserwacji i przenośności kodu. Poddaję mu wątpliwość: istniejący kod może rzeczywiście być źle skonstruowany, jeśli źle postępuje zgodnie z podręcznikiem lub przestrzega dobrego przepisu w niewłaściwym kontekście.
Unikanie wzorców projektowych jest naprawdę zaskakujące. W ciągu ostatnich 30 lat kodowania i zarządzania programistami wzorce projektowe pomogły w opisaniu rzeczy, które zostały wykonane instynktownie, pomagając w szybszym zrozumieniu intencji, zalet, niedogodności, ryzyka, szans i powiązanych wzorców. Wzory projektowe okazały się prawdziwymi akceleratorami do opanowania złożoności!
Być może twój kolega jest naprawdę znacznie bardziej inteligentny niż większość z nas i może sobie pozwolić na koszty odkrywania nowych wzorów bez zauważalnego spadku wydajności?
Argumenty, że „programiści nie rozumieją wzorców projektowych” brzmią następująco: „Naprawdę nie potrafię wyjaśnić, co robię”. Lub „Nie chcę kłócić się o mój własny projekt”. Naprawdę uważam, że patternizacja mogłaby zwiększyć ogólne zrozumienie i pozwolić mniejszym starszym kolegom na dzielenie się cennymi opiniami. Ale może twój starszy kolega chce tego uniknąć.
Podejścia warstwowe okazały się lepsze od innych architektur w większości aplikacji korporacyjnych. Wiodące pakiety światowej klasy opierają się na tym pomyśle i przewyższają rzemieślnicze architektury o rzędy wielkości. Martin Fowler przedstawia to podejście w swojej doskonałej książce „Wzory architektury korporacyjnej”. O! Jeszcze raz przepraszam: Chodzi o sprawdzone wzory; bez szans w widoku NIH twojego kolegi ;-)
źródło
Kluczowym spostrzeżeniem wielu osób jest to, że projektowanie oprogramowania jest kontekstowe. Istnieje, aby osiągnąć cele biznesowe, a różne cele mogą wymagać różnych podejść. Innymi słowy, nie ma projektu, który zawsze byłby najlepszy, nawet jeśli zawsze jest najlepszy projekt.
Wzorce projektowe są standardowymi rozwiązaniami standardowych problemów. Jeśli jednak nie masz problemu, jego rozwiązanie jest stratą wysiłku.
Kluczową różnicą między wodospadem i zwinnego projektowania oprogramowania jest , gdy decyzje projektowe są wykonane. W wodospadzie zbieramy wszystkie wymagania, identyfikujemy potrzebne wzory projektowe, a dopiero potem zaczynamy kodować. W zwinnej architekturze kierujemy się zasadą YAGNI, aby odłożyć decyzje projektowe do ostatniej odpowiedzialnej chwili, kiedy wiemy tyle o wyborze, ile tylko możemy.
Oznacza to, że w wodospadzie wzory projektowe są zwykle stosowane, jeśli ich potrzeba jest spodziewana , w zwinny, gdy są rzeczywiście potrzebne . W rezultacie zwinne projekty rzadziej stosują wzorce projektowe, ponieważ nie wszystkie przewidywane potrzeby są rzeczywiste.
źródło
Design patterns are standard solutions to standard problems
. Jestem trochę rozczarowany, że nie widziałem tego w bardziej pozytywnych odpowiedziach. W związku z tym najpierw musisz ustalić, czy Twój problem dotyczy zwykłego problemu, i naprawdę często będą występować.Wzory projektowe nie są tak naprawdę nazywane wzorami projektowymi, ponieważ określają, co należy zrobić. Wzory projektowe to wzorce projektowe, ponieważ opisują to, co zostało zrobione wcześniej . Niektórzy programiści lub programiści zaprojektowali metodę, która dobrze wykonała dane zadanie i byli w stanie zastosować ją w podobnych sytuacjach z podobnymi wynikami. To wszystko. Wiele wzorców ma swoje mocne i słabe strony, a wykształcony programista musi ocenić potrzeby technologiczne i biznesowe w celu ustalenia odpowiedniego wzorca do zastosowania.
W tym świetle, o ile nie jesteś naprawdę zaangażowany w pisanie w 100% jednorazowego kodu, w którym żadne koncepcje ani implementacje nie są użyteczne z jednego przypadku do drugiego, prawie na pewno używasz przynajmniej niektórych wzorców projektowych. Mogą nie mieć krzykliwych, pospolitych nazw, takich jak „Repozytorium” lub „Jednostka pracy”, a nawet „MVC”, ale nie oznacza to, że „nie są wzorcem projektowym”.
źródło
Zwykle lubię o tym myśleć w sposób „powiedzmy” „nawigacji” za pomocą GPS. Ucząc się „najlepszych praktyk” i „wzorców projektowych” - uczysz się wybierać trasę nawigacji GPS. Ale kiedy znasz ten obszar, często dowiadujesz się, że jazda boczną drogą poprowadzi Cię przez obszary problematyczne, doprowadzi Cię tam szybciej i / lub lepiej. Podobnie jest w przypadku tych rzeczy - doświadczenie pozwala ci zdekonstruować swój zestaw narzędzi i zrobić skróty.
Uczenie się wzorców projektowych i uczenie się „najlepszych praktyk” oznacza, że zyskujesz zrozumienie idei stojącej za tym projektem, dzięki czemu możesz wybrać w danej sytuacji. Ponieważ sytuacje z życia codziennego są często bardziej złożone niż sytuacje teoretyczne - często będziesz mieć ograniczenia i problemy, których nie znajdziesz w podręcznikach. Klienci / Klienci chcą, aby ich produkt był szybki i zwykle tani; Musisz pracować ze starszym kodem; Musisz wchodzić w interakcje z narzędziami stron trzecich, które mogą równie dobrze być czarnymi skrzynkami i nieskuteczne; i wszelkiego rodzaju rzeczy. Twoja sytuacja jest specyficzna - najlepsze praktyki i wzorce są bardziej ogólne.
Jednym z głównych powodów, dla których wiele osób w witrynach takich jak SE udziela odpowiedzi na „najlepsze praktyki” i odpowiedzi na „wzorce projektowe”, jest to, że ponieważ odpowiadają na ogólne i abstrakcyjne rozwiązania, a tym samym pomaga zapewnić wspólny język rozwiązywania pewnego rodzaju problemy. I żebyś się uczył.
Tak więc - nie - wzorce projektowe nie są odrzucane w zwinnych środowiskach programistycznych; jednak rozwój rzadko jest na tyle ogólny i abstrakcyjny, aby idealnie pasował do wzorca i (doświadczony) programista wie o tym.
źródło
Jeśli chcesz „zoptymalizować” projekt, musisz powiedzieć, co próbujesz zoptymalizować.
Na przykład rower wyścigowy jest pojazdem zoptymalizowanym ... a Boeing 747 jest również pojazdem zoptymalizowanym ... ale są one zoptymalizowane pod kątem innego zestawu wymagań.
Na przykład idea wzorca „MVC” optymalizuje się do takich rzeczy jak:
Podczas gdy jego kod może być zoptymalizowany pod kątem czegoś innego, na przykład:
Opisy wzorów rozpoczynają się od opisu problemu, który wzór ma rozwiązać. Jeśli uważa, że „najlepszą praktyką” jest nieużywanie określonego wzorca, to (zakładając, że nie jest to głupi wzorzec, zakładając, że jest to wzór, który czasem się przydaje), przypuszczam, że nie ma / nie ma specyficznego problemu, który według tego wzorca do rozwiązania i / lub ma inny (większy lub bardziej pilny, konkurencyjny) problem, dla którego próbuje zoptymalizować.
źródło
Wzory projektowe są narzędziami. Podobnie jak narzędzia, istnieją dwa sposoby ich użycia: poprawny i nieprawidłowy. Na przykład, jeśli dam ci śrubokręt i gwóźdź i poproszę o połączenie dwóch kawałków drewna, powinieneś poprosić mnie o młotek. Do gwoździ używa się młotków, a do śrub wkrętaków.
Zbyt często wzorzec projektowy jest reklamowany jako One True Way, co często jest prawdą tylko wtedy, gdy pojawiają się określone problemy. Młodsi programiści często są jak dzieci, gdy znajdują coś nowego do zabawy; chcą zastosować ten wzór do wszystkiego . I nie ma w tym nic złego, o ile w końcu dowiedzą się, że wzór A dotyczy problemu B, a wzór C dotyczy problemu D. Tak jak nie używasz śrubokręta do wbijania gwoździ, nie używasz żadnego konkretnego wzór tylko dlatego, że istnieje; używasz wzoru, ponieważ jest to najlepsze (znane) narzędzie do pracy.
Druga strona wzorów to anty-wzory. Rzeczy, które wielokrotnie okazały się złe, zwykle pod względem czasu wykonania lub pamięci. Jednak zarówno wzorce, jak i anty-wzorce nie przynoszą pożytku twórcy, którzy nie rozumieją, dlaczego istnieją. Programiści lubią myśleć, że to, co robią, jest nowe i pomysłowe, ale przez większość czasu tak nie jest. Prawdopodobnie już o tym pomyślano. Ludzie przed nimi stworzyli wzorce z powodu doświadczenia.
Oczywiście młodsi programiści często wydają się wymyślać nowe sposoby robienia starych rzeczy, a czasem te są lepsze. Jednak zbyt często kończy się to efektem Dunninga-Krugera; programista wie wystarczająco dużo, aby stworzyć funkcjonalny program, ale nie rozumie własnych ograniczeń. Jedynym sposobem na obejście tego wydaje się doświadczenie, zarówno pozytywne, jak i negatywne. Ignorują wzorce, ponieważ uważają się za lepszych, ale nie wiedzą, że w rzeczywistości 10 000 programistów zastosowało już konkretny projekt, a następnie odrzuciło go, ponieważ był naprawdę zły.
Agile preferuje „wykonywanie zadań w sposób responsywny” w zakresie szybkiego dostosowywania się do zmieniających się potrzeb klientów. Nie faworyzuje wzorów ani nie gardzi nimi. Jeśli wzorzec jest najszybszą i najbardziej niezawodną metodą, programista powinien go użyć. Jeśli określony wzorzec kosztowałby więcej czasu niż po prostu „zrobienie tego”, użycie czegoś, co nie jest wzorcem, jest prawdopodobnie w porządku (zakładając oczywiście, że wydajność nie jest poważnie obniżona itp.). Jeśli nie można znaleźć znanego wzorca, projektowanie jego jest lepsze niż mówienie klientowi „nie”. Klienci, zwłaszcza klienci płacący, zwykle mają rację.
Każdy, kto twierdzi, że wzorce są Drogą, lub twierdzi, że wzorce są Zmorą Istnienia, myli się. Wzory są narzędziami, które mają być stosowane w określonych sytuacjach i mają różny stopień powodzenia w zależności od okoliczności. To jest Prawda, która nie zależy od tego, czy wybierzesz MVC, czy nie, jeśli użyjesz obiektów do przesyłania danych, czy nie, itp. Ważne jest wdrożenie kodu w rozsądnie krótkim czasie, który działa dość dobrze dla użytkowników, i jest dość wolny od błędów logicznych.
Zwykle wzory pozwalają na spójną formę projektowania i działają lepiej niż ignorowanie wszystkich wzorów na rzecz pisania w 100% oryginalnych pomysłów, ale nie można uniknąć wszystkich wzorów. Na przykład, jeśli y = x + 5, czy naprawdę zamierzasz pisać y = x + (5 * 3 + 15/3) / 4, aby uniknąć wzorca pisania x + 5? Nie, nie jesteś. Zamierzasz napisać y = x + 5 i przejść do następnego problemu.
Ludzie używają wzorów każdego dnia i to jest w porządku . Najważniejsze jest posiadanie logicznie funkcjonalnego kodu, rzadko ulega awarii i jest przyjazny dla użytkownika. Nic innego nie ma większego znaczenia.
źródło
Nie można ominąć wzorców projektowych, chyba że unikam projektowania dwóch dowolnych części systemu w ten sam sposób (czego nie polecam i wątpię, by robił to twój starszy programista). To, co prawdopodobnie miał na myśli, to „unikaj ślepego używania wzoru tylko dlatego, że jest on zgodny ze wzorem”. Myślenie o tym, co robisz, jest zdecydowanie „najlepszą praktyką” i jeden uniwersytet powinien istnieć, aby uczyć; niestety tak się nie dzieje.
źródło
Wzory projektowe nie są przeciwne praktykom zwinnym. To, co przeciwstawia się zwinnym praktykom, polega na stosowaniu wzorców projektowych ze względu na wzorce projektowe, co jest powszechną praktyką wśród świeżych absolwentów i studentów do myślenia w stylu „jak rozwiążemy ten problem przy użyciu wzorców fabrycznych”.
Zwinne oznacza wybranie najlepszego narzędzia do pracy, a NIE próbowanie dopasowania pracy do wybranego narzędzia.
I do tego właśnie sprowadzają się WSZYSTKIE rozsądne praktyki programistyczne (choć często musisz iść na kompromis, ponieważ wybór narzędzi, które możesz wybrać, jest zwykle ograniczony standardami korporacyjnymi, ograniczeniami licencji (np. GPL, a czasem inne narzędzia open source) nie może być używany, zwłaszcza przy tworzeniu oprogramowania do odsprzedaży) i tym podobne.
Twój kolega / przyjaciel prawdopodobnie sprzeciwił się Twojemu kodowi nie dlatego, że używa wzorców projektowych per se, ale dlatego, że jest to sztuczna konstrukcja zaprojektowana do pokazywania użycia określonego wzorca, gdy inny projekt byłby lepszy (choć często subiektywny, ja (i wielu ze mną bez wątpienia) widziało wiele przykładów, w których wymuszone użycie określonego wzorca projektowego doprowadziło do brzydkiego, trudnego w utrzymaniu i wysoce nieefektywnego kodu).
źródło