Zacząłem czytać wzornik projektowy autorstwa GoF. Niektóre wzory wydają się bardzo podobne, z niewielkimi różnicami pojęciowymi.
Czy uważasz, że z wielu wzorców niektóre są niepotrzebne w dynamicznym języku, takim jak Python (np. Ponieważ są one zastąpione przez funkcję dynamiczną)?
design-patterns
python
Gerenuk
źródło
źródło
Odpowiedzi:
Peter Norvig pokazuje, że 16 z 23 wzorców projektowych znalezionych w książce GOF jest niewidocznych lub prostszych w dynamicznych językach (skupia się na Lisp i Dylan).
Odkąd wspomniałeś o Pythonie, Alex Martelli ma przyjemną prezentację na ten temat. Powiązany również z Pythonem, jest ładny post na blogu pokazujący sześć wzorców projektowych w idiomatycznym Pythonie .
Prowadzę również repozytorium github z implementacjami (przez innych ludzi) najpopularniejszych wzorców projektowych w Pythonie .
źródło
Nie są wymagane żadne wzory projektowe. W dowolnym języku
Często napotykam dużo kodu napisanego przez ludzi, którzy czytają wzorce projektowe, a potem sądzą, że powinni z nich korzystać wszędzie. W rezultacie rzeczywisty kod zostaje zakopany pod mnóstwem interfejsów, opakowań i warstw i jest dość trudny do odczytania. To złe podejście do wzorców projektowych.
Wzory projektowe istnieją, dzięki czemu masz repertuar przydatnych idiomów pod ręką, gdy natrafisz na problem. Ale nigdy nie powinieneś stosować żadnego wzoru przed zidentyfikowaniem problemu. Niech to będzie proste Głupota zawsze powinna być nadrzędną zasadą rządzącą.
Pomaga również myśleć o wzorcach projektowych jako o koncepcji do myślenia o problemie, a nie o konkretnym kodzie wzorcowym do napisania. I w dużej mierze z podstawową metodą obejścia Javy bez wolnych funkcji i standardowych obiektów funkcji, których używasz w większości innych języków, które je mają (takich jak Python, C #, C ++ itp.).
Mogę powiedzieć, że mam wzorzec odwiedzających, ale w każdym języku z funkcjami pierwszej klasy będzie to funkcja pełniąca funkcję. Zamiast klasy fabrycznej zwykle mam tylko funkcję fabryczną. Mógłbym powiedzieć, że mam interfejs, ale to tylko kilka metod oznaczonych komentarzami, ponieważ nie byłoby żadnej innej implementacji (oczywiście w Pythonie interfejs zawsze jest tylko komentarzem, ponieważ jest napisany kaczką). Nadal mówię o kodzie jako o użyciu wzorca, ponieważ jest to przydatny sposób, aby o nim pomyśleć, ale tak naprawdę nie wpisuj wszystkich rzeczy, dopóki naprawdę go nie potrzebuję.
Naucz się wszystkich wzorców jako pojęć . I zapomnij o konkretnych implementacjach. Implementacja różni się i powinna się różnić w świecie rzeczywistym, nawet w Javie.
źródło
Abstrakcyjny wzorzec fabryczny nie jest konieczny w języku pisanym kaczką, takim jak Python, ponieważ jest praktycznie wbudowany w ten język.
źródło
Jedyne, co przychodzi na myśl, to wzór Singleton.
Ponieważ Python nie zmusza Cię do używania klas do wszystkiego , możesz zamiast tego użyć globalnej struktury danych. Ta globalna struktura danych mogłaby być zarządzana przez instancję, ale nie musisz kontrolować instancji tej klasy, po prostu stwórz instancję podczas importu i pozostaw ją w tym miejscu.
Przeważnie Singletony w pythonie są zastępowane modułem. Moduły w pythonie są ze swej natury Singletonami; interpreter Pythona tworzy je tylko raz.
Wszystkie inne wzorce w Design Patters, których użyłem w Pythonie w tym samym czasie, a przykłady ich znajdziesz w standardowej bibliotece Pythona i w samym Pythonie.
źródło
len
działa; Guido dokonał tutaj wyraźnego wyboru . Chodzi mi o to, aby pokazać, że Python nie jest czystym językiem OOP; jest to język pragmatyczny. Lubię to w ten sposób.Wzory projektowe są dla programisty, a nie dla języka. Programiści zwykle używają wzorców, które pomagają im zrozumieć obecny problem. Żaden wzorzec projektowy nie jest absolutnie konieczny, ale może być przydatny, aby uprościć to, co próbujesz zrobić.
Python, a w szczególności pisanie kaczek, kończy wiele popularnych wzorców i praktyk, a wiele ograniczeń narzuconych przez niektóre wzorce (prywatność, niezmienność itp.) Obowiązuje tylko w takim stopniu, w jakim programista zgadza się ich nie łamać . Ale nadal, one nie działają tak długo, jak programista odgrywa czas. Drzwi są nadal drzwiami, nawet jeśli są otoczone wyobrażonymi ścianami.
Python jest uważany za język „wielu paradygmatów”; możesz użyć dowolnych wzorów. To celowe. Zapewnia na przykład złożone hierarchie klas, nawet jeśli są one całkowicie niepotrzebne i nieco sztuczne. Ale dla niektórych osób ta abstrakcja jest pomocna. Nie dlatego, że wymaga tego problem, ale dlatego, że programista tego wymaga. Więc proszę bardzo.
źródło
Oryginalna książka „Wzory projektowe” udokumentowała i wymieniła niektóre popularne idiomy przydatne w imperatywnych, zorientowanych obiektowo językach, takich jak C ++ i Smalltalk. Ale Smalltalk jest językiem dynamicznie pisanym, więc nie może być kwestią dynamiki.
Jednak odpowiedź na twoje pytanie brzmi „tak”: niektóre z tych wzorców projektowych nie będą miały znaczenia dla współczesnych języków dynamicznie typowanych. Mówiąc bardziej ogólnie, nie będzie różne wzorce projektowe w różnych językach, zwłaszcza w różnych rodzajów języków.
Powtórzmy: „wzorzec projektowy” to po prostu nazwa idiomu programistycznego: wspólne rozwiązanie często spotykanego problemu. Różne języki wymagają różnych idiomów, ponieważ problem dla jednego języka może być trywialny dla innego. W tym sensie wzorce projektowe wskazują na słabości języków, których dotyczą.
Możesz więc szukać innych funkcji, które zwiększą możliwości współczesnych języków dynamicznych (lub starożytnych, takich jak Lisp), co sprawi, że niektóre z tych klasycznych wzorów nie będą miały znaczenia.
źródło
Wzory projektowe to sposoby rozwiązywania określonych problemów. Jeśli problem nie zostanie spełniony, wzorzec rozwiązania go nie ma zastosowania.
Ludzie starają się dostosowywać wzorce projektowe wszędzie, tak jakby najlepszą praktyką było posiadanie wzorców projektowych w projekcie. To jest na odwrót. Wystąpił problem, który można rozwiązać za pomocą wzoru fabrycznego? Chłodny. Dostosuj to. Nie sprawdzaj swojego kodu i nie próbuj znaleźć odpowiedniego miejsca na wdrożenie singletona (lub fabryki, fasady lub cokolwiek ...).
Być może Python ma własne wzorce projektowe niedostępne dla ludzi Java i .NET (z powodu natury tych języków)?
źródło
Powiedziałbym, że wzorce zawsze zależą od języka. To, że większość wzorców Pythona wygląda tak, jak te zdefiniowane w GoF, to z powodu OOP Pythona, że powiedzenie, że OOP nie jest podobne do OOP (żadne dwa języki nie definiują obiektów i manipulowania nimi w 100%).
Nie ma więc wątpliwości, że niektóre wzorce nie będą miały zastosowania „tak jak są”, niektóre mogą nie mieć sensu, a niektóre wzorce mogą mieć znaczenie tylko dla Pythona.
Aby wrócić dokładnie na twoje pytanie: Wzory są konieczne tylko wtedy, gdy ich potrzebujesz . Nie musisz ich używać, jeśli nie są potrzebne (jak powiedział już Jan Hudec).
Ponadto istnieje znacznie więcej wzorów niż te wymienione w GoF. Zobacz w wikipedii inne wzory
źródło