Wiele lat temu rozmawiałem z profesorem ekonomii o wzorcach projektowych, o tym, jak ustanawiają wspólny język dla programistów i jak ładnie rozwiązują dobrze znane problemy itp. Itp.
Potem odpowiedział mi, że jest to dokładnie odwrotne podejście, którego użyłby wobec swoich studentów ekonomii. Zazwyczaj przedstawiał problem i prosił go, aby najpierw znalazł rozwiązanie, aby mogli najpierw pomyśleć o tym i spróbować znaleźć sposoby rozwiązania problemu, a dopiero potem przedstawił „klasyczne” rozwiązanie.
Zastanawiałem się więc, czy podejście „wzorzec projektowy” naprawdę sprawia, że programiści są mądrzejsi lub głupsi, ponieważ wiele razy otrzymują po prostu „właściwe rozwiązanie tego problemu” zamiast być może za pomocą kreatywności i wyobraźni, aby rozwiązać jakiś problem w nowy i innowacyjny sposób.
Co myślisz?
Odpowiedzi:
Twój profesor ekonomii ma absolutną rację.
Wzory Software Design to przede wszystkim sposób na doświadczonych programistów, aby komunikować się ze sobą . Są one skrótem od ustalonych rozwiązań znanych problemów.
Ale powinny być używane tylko przez osoby, które rozumieją, jak rozwiązać problem bez wzoru lub same opracowały podobny wzór. W przeciwnym razie będą mieli ten sam problem co koder kopiuj / wklej; będą mieli kod, ale nie zrozumieją, jak to działa, i dlatego nie będą mogli go rozwiązać.
Ponadto wiele wzorców projektowych to wzorce korporacyjne , wzorce przeznaczone do stosowania w dużych korporacyjnych systemach oprogramowania. Jeśli poznasz cuda kontenera Inversion of Control, będziesz chciał używać go w każdym pisanym programie, nawet jeśli większość programów tak naprawdę go nie potrzebuje (istnieją lepsze sposoby na wstrzykiwanie zależności w mniejszych programach, dzięki czemu nie wymaga kontenera IoC).
Naucz się wzorów. Zrozum wzorce i ich właściwe użycie. Wiedzieć, jak rozwiązać ten sam problem bez wzorca (wszystkie wzorce oprogramowania są abstrakcjami w stosunku do podstawowych algorytmów). Będziesz wtedy mógł bezpiecznie korzystać z wzorców oprogramowania, gdy ma to sens.
źródło
Sposób, w jaki ludzie projektują wzorce projektowe, polega na tym, że jest to zestaw rozwiązań, które można zastosować, jeśli pojawią się podobne problemy. Nie chcą, abyście myśleli o nich jako o jedynych możliwych rozwiązaniach, podanych przez Boga Mojżeszowi wykutych w kamiennych tablicach na górze.
Niestety, niektórzy uważają je za coś bardziej świętego niż pismo przykładowe, z których można się nauczyć. To zabija kreatywność i ustanawia kult ładunków.
Twój profesor ekonomii wspomniał o przedstawieniu uczniom problemu i zmuszeniu go do rozwiązania go w pierwszej kolejności, co jest dobrą techniką edukacyjną, ale miał rozwiązanie, aby im to pokazać. Posiadanie wielu rozwiązań wielu różnych problemów w twojej głowie jest dobrą rzeczą, a takie właśnie są Wzory projektowe. Myślę, że pod pewnymi względami zawodzi (Singleton zachęcający do złych podejść, krótkowzroczny nacisk na imperatywne OO itp.), Ale można go dobrze wykorzystać z inteligencją i gustem. Błędem jest jednak myśleć, że każde możliwe przykładowe rozwiązanie w oprogramowaniu musi być oficjalnym wzorcem projektowym.
Jeśli spojrzysz na problem i zadajesz sobie pytanie „Jaki jest wzorzec projektowy?”, To robisz to źle i mniej prawdopodobne jest, że zobaczysz rozwiązanie, które wpatruje się w ciebie.
Jeśli spojrzysz na problem i zadajesz sobie pytanie: „Jak mogę to rozwiązać?”, To jeśli istnieje rozwiązanie nieszablonowe, zobaczysz je, a jeśli istnieje pasujący wzór, również to zobaczysz.
źródło
Myślę też, że twój profesor ekonomii ma rację i to jest sposób na nauczenie się czegokolwiek w pierwszej kolejności; Spójrzmy jednak na to tak: czy zachowałbyś Koło w tajemnicy i pozwoliłby wszystkim je wynaleźć na nowo, ze względu na kreatywność ? Oczekuję, że powiesz „Nie”, ponieważ nie wszyscy ludzie są stworzeni / zdolni do wynalezienia swoich kół - a jeśli tak, zrobią to w pewnym momencie, nie ma znaczenia, czy są świadomi istnienia koła lub nie.
Wróćmy do programistów; Z dnia na dzień jestem programistą, więc MVC jest jedną z tych rzeczy, z którymi codziennie wchodzę w interakcje. Kilka razy próbowałem zbudować własne struktury, wiele się nauczyłem, ale wszystkie zakończyły się niepowodzeniem. Starałem się jak najlepiej, ale co by się stało, gdyby nie było MVC? Cóż, prosty, mój kod źródłowy jest do kitu - pod względem niezawodności, łatwości konserwacji i rozszerzalności.
Myślę, że dla większości z nas to samo. Jeśli nikt nie mówi ci o DI - jako dobrej praktyce, to ile aplikacji korporacyjnych powinno się zmagać lub nie działać, dopóki ich programiści nie nauczą się tej lekcji?
Drugi punkt to standardy branżowe . Jeśli nie nauczysz MVC programistów internetowych, czy jesteś gotowy stawić czoła wszystkim niestandardowym strukturom, które musisz poświęcić trochę czasu, aby najpierw nauczyć się, jak to robić, a potem zdajesz sobie sprawę, że niektóre z tych struktur mogą masz dobry pomysł, ale większość z nich będzie miała poważne wady projektowe, które mogą mieć poważne konsekwencje dla twojego projektu oprogramowania - nawet dobrze znane frameworki wciąż zmagają się z wadami projektowymi od czasu do czasu.
Ale co by się stało, gdybyśmy mieli te wszystkie fajne pomysły i połączyli je wszystkie, a ci inteligentni programiści wzięli dobre rzeczy z tych wszystkich eksperymentów i stworzyli naprawdę fajną strukturę, która najlepiej pasuje do tego konkretnego problemu? Właśnie utworzyłeś wzorce projektowe . Jeśli jesteś żywym stworzeniem, nie ma innej możliwości; Nawet zwierzęta stosują najlepsze praktyki i wzorce projektowe w swoim codziennym życiu.
źródło
Nie wymyślaj na nowo młotka, ale nie traktuj każdego problemu jak gwoździa
Wzorce programowania są świetną oszczędnością czasu, ponieważ zapewniają gotowe rozwiązania, dobrze udokumentowane i przetestowane ze średnimi przypadkami, o których łatwo zapomnieć. Ale musisz się nauczyć (i pomyśleć), kiedy z nich korzystać.
Parafrazując pytanie: czy nauka jazdy sprawiłaby, że poruszam się szybciej, czy po prostu chodzę wolniej?
Nauka korzystania ze wzorca programowania nie oznacza, że nie powinieneś ćwiczyć znajdowania własnych rozwiązań. Nadal będzie wystarczająco dużo problemów, aby wykorzystać swoją kreatywność. Znajomość wzorców programowania pozwoli ci tylko szybko rozwiązać znane problemy i skoncentrować się na tych, które są mniej trywialne.
Wracając do drugiej części pytania - czy twój profesor ma rację?
Tak, ma rację . Podstawowym celem studiów jest nauczenie studentów myślenia . Muszą spróbować znaleźć własne rozwiązania problemu, a następnie skonfrontować je z istniejącymi rozwiązaniami. Tylko w ten sposób mogą je naprawdę zrozumieć. Jeśli najpierw nauczysz się wzorców, ryzykujesz, że nauczą się tylko mechanicznie, aby je zastosować, a nie zrozumieć, co jest za nimi.
To jest powód, dla którego najpierw uczysz studentów programowania, a wzorce są wprowadzane w kolejnych semestrach.
źródło
Absolutnie odradzam nauczanie programowania, ucząc wzorców projektowych. Nie można ich dobrze zastosować bez zrozumienia zasad leżących u ich podstaw, dlatego nauczanie tych zasad jest o wiele ważniejsze.
Wydaje mi się, że wzorce projektowe i tak nie są tak cenne dla pracujących programistów. Jeśli w pełni rozumiesz zasady związane z danym wzorcem projektowym, to w sytuacji, gdy jest to dobre rozwiązanie, naturalnie i tak skonstruujesz go (lub coś podobnego) oczywiście, nawet jeśli nie wiedziałeś że był to wzór z imieniem. Niezależnie od tego, jaki czas poświęcisz na naukę wzorców, lepiej poświęcić na naukę myślenia o kodzie w ogóle. Jeśli twoje umiejętności „rozwiązywania problemów w ogólności” nie są do zera, to nie możesz napisać dobrego kodu, bez względu na to, jak dobrze potrafisz zastosować pewien zestaw wzorców. A jeśli twoje umiejętności „ogólnego rozwiązywania problemów” są dobre, możesz rozwiązać problemy, nawet jeśli nie znasz żadnego wzorca.
Myślę też, że w idealnym świecie nie byłoby mieć jakieś wzorce projektowe, ponieważ idee wspólne wystarczy nazwać wzór by wszystko się dobrze realizowane w bibliotekach i chcemy być rzeczywiście ponowne wykorzystanie kodu zamiast stale przepisanie go. Wyobraź sobie, że istnieje „wzorzec projektowania wyrażeń regularnych”, który wymagałby wdrożenia małego silnika wyrażenia regularnego za każdym razem, gdy chciałeś go użyć. Wzorce projektowe to tylko biblioteki, których nie można napisać, ponieważ język nie zapewnia odpowiednich funkcji abstrakcji.
To właściwie kolejny powód, by nie przejmować się nimi tak bardzo; nie są one wcale tak uniwersalne, jak się czasem twierdzi, ale w rzeczywistości są bardzo silnie powiązane ze szczególnymi sposobami strukturyzacji programów, na które zezwala / zachęca dany język. Książka wzorców projektowych napisana dla Pythona byłaby zupełnie inna niż książka napisana dla Javy, a nawet bardziej odmienna od książki napisanej dla języka, który nie jest konieczny, takiego jak Haskell. Lepiej zrozumieć na głębszym poziomie, a będziesz w stanie samodzielnie odkryć wzorce projektowe w dowolnym języku, który znasz.
źródło
Handel i edukacja mają różne cele. Gdybym uczył uczniów wzorców projektowych, przyjąłbym to samo podejście. Ale w środowisku produkcyjnym czas i wydajność są wszystkim.
Co więcej, (makro) ekonomia poza klasą to inna sprawa. Czy widzisz rządy mówiące: „Łał! Teraz jesteśmy bardzo znudzeni robieniem podatków i tak samo, więc spróbujmy teraz czegoś bardzo szalonego”. Nie, nie wiesz, ponieważ takie dzikie eksperymenty mogą zniszczyć gospodarkę nie do naprawienia. Zamiast tego mają tendencję do trzymania się sprawdzonych metod: podwyższania stóp procentowych, ogłaszania świąt podatkowych itp. Innymi słowy, opierają się na wzorach projektowych.
źródło
Odpowiedź brzmi oczywiście: tak.
Wzory projektowe same w sobie są wspaniałym narzędziem do nauki, o ile poświęca się czas na zastanowienie się, jak działają i dlaczego wnoszą wartość, którą wnoszą.
Mogą również być świetnymi środkami zwiększającymi produktywność, przyspieszając proces projektowania, ponieważ zapewniają znane rozwiązania stale pojawiających się problemów.
Jeśli jednak za bardzo zwarciowo projektują lub ludzie stają się dogmatyczni i nadmiernie precyzyjni w kwestii ich zastosowania, wówczas mają odwrotny skutek.
źródło
Wzory projektowe są oczywiście mniej kreatywne. To jest cały pomysł. Kreatywność to rzadki zasób. Nie należy marnować go na problemy, które nie wymagają kreatywności. Jest to o wiele łatwiejsze, szybsze i bardziej prawdopodobne, że rozwiążesz problem w taki sam sposób, jak setki programistów przed sobą. Nudny, nieciekawy kod, który wykonuje swoją pracę, jest w rzeczywistości dobry.
źródło