Więc „Czy wzorom projektowym brakuje funkcji językowych”? [Zamknięte]

12

Widziałem tutaj, na programistach, odpowiedź na to pytanie: Jak zmienia się myślenie o wzorcach projektowych i praktykach OOP w dynamicznych i słabo typowanych językach? Tam znalazłem link do artykułu z wypowiedzianym tytułem: Czy wzorce projektowe nie mają funkcji językowych . Ale tam, gdzie znalazłem fragmenty, które wydawały mi się bardzo chwytliwe i które można prawdopodobnie zweryfikować na podstawie doświadczenia, biorąc pod uwagę zachętę, na przykład:

PaulGraham powiedział: „Peter Norvig stwierdził, że 16 z 23 wzorów we wzorach projektowych było„ niewidocznych lub prostszych ”w Lisp”.

lub inne zdanie, które potwierdza to, co ostatnio widziałem, gdy ludzie próbowali symulować zajęcia w JavaScript:

Oczywiście nikt nigdy nie mówi o wzorzec „funkcji” lub wzorca „klasy”, ani o wielu innych rzeczach, które uważamy za oczywiste, ponieważ większość języków udostępnia je jako funkcje wbudowane. OTOH, programiści w czysto PrototypeOrientedLanguage? może być przydatne symulacja klas za pomocą prototypów ...

Biorę również pod uwagę, że wzorce projektowe są narzędziem komunikacji . Ponieważ nawet z moim ograniczonym doświadczeniem w tworzeniu aplikacji, widzę na przykład anty-wzorzec ( nieskuteczny i / lub przeciwny do zamierzonego ), na przykład zmuszający mały zespół PHP do nauki wzorców GoF dla małych i średnich aplikacji intranetowych. Wiem, że skala, zakres i cel mogą decydować o tym, co jest skuteczne i / lub produktywne, ale nadal nie udało mi się znaleźć technicznej informacji na ten temat.

Widziałem małe komercyjne aplikacje, które łączyły funkcjonalność z OOP i nadal są łatwe w utrzymaniu, i nie wiem, czy wiele osób potrzebowałoby np. W pythonie do napisania singletonu, ale dla mnie prosty moduł robi to samo.

Czy są więc studia, wyczerpujące artykuły lub inna forma prezentacji, która bierze pod uwagę wzorce projektowe vs. obejścia vs. prostsze sposoby wykonania tego zadania lub zamienniki według funkcji językowych?

Eduard Florinescu
źródło
16
Błędem byłoby zaakceptować wszystko, co Paul Graham mówi na temat języków programowania jako „obiektywne i oparte na faktach”.
Mason Wheeler,
5
Nie zgadzam się z Paulem Grahamem, ale @MasonWheeler ma rację, ewangeliści są świetni z wielu powodów, ale nie ze względu na ich obiektywizm.
Jimmy Hoffa,
3
@JimmyHoffa: Ogólnie nie są to „ewangeliści”. Nie zgadzam się z długą historią Grahama dotyczącą publikowania absurdalnych materiałów, które często zaprzeczają samemu sobie lub jego źródłom, i próbuję przekręcić całość, by wyglądała na spójną. Bez względu na to, za czym się popierasz, jest to okropny sposób, aby się tym zająć i trochę mnie przeraża fakt, że ludzie go słuchają.
Mason Wheeler,
5
Byłoby miło zobaczyć kilka badań, ale jeśli kiedykolwiek nowoczesnych języków funkcjonalnych - wiesz już, jak przestarzały GOF wzorce projektowe są, i nie ma potrzeby, aby to udowodnić numer więcej . (Choć były ważne w 1990 roku, bez wątpienia).
69
3
@DanielB, każdy konkretny paradygmat zawiedzie, ponieważ rzeczywistość jest znacznie bardziej złożona niż jakikolwiek inny paradygmat. Dlatego każdy problem zasługuje na własny, specyficzny dla domeny model i paradygmat.
SK-logic

Odpowiedzi:

10

Nie znam żadnych dogłębnych dyskusji ani badań, które uwzględniałyby wszystkie te rzeczy.

To powiedziawszy, cały argument „wzorce projektowe tylko łatają brakujące funkcje w językach OO” jest, moim zdaniem, nieco cienki. Tak, niektóre wzorce projektowe są dokładnie takie, wypełniają pewne powszechne luki, nawet nie istnieją w innym języku X. Są to zazwyczaj twoje prostsze wzorce niskiego poziomu, takie jak niektóre / wiele oryginalnych w książce GoF.

Ale wzorce projektowe wykraczają daleko poza proste, a nazywanie ich brakującymi cechami językowymi rozciąga wyobraźnię. Rzuć okiem na katalog wzorców aplikacji korporacyjnych Fowlera i zastanów się, jak by to było, gdyby były one częścią podstawowej definicji języka. Myślę, że skończyłbyś z językiem specyficznym dla domeny ( DSL ) dla aplikacji korporacyjnych (i to bardzo złożonym).

Tak właśnie jest - wzorce projektowe są sposobem na znalezienie rozwiązań wielokrotnego użytku dla konkretnych problemów (które są często stosowane w ogólnym, uniwersalnym języku). Tu również pojawia się komunikacja. Jeśli powiesz mi, że „korzystamy z Active Records”, już wiem sporo o twojej aplikacji, nie poświęcając minut na omawianie różnych podejść. Tak, wzorce projektowe robią dziury w specyfikacji języka. Czy to wszystko, co robią? Nie - nie z dystansu.

Edytować:

W pewnym sensie mówię, że wzorce pozwalają praktykującym OO myśleć na wyższym poziomie i prawie konstruować rodzaj DSL dla swojego środowiska, pozostając przy składni języka. I tak, widziałem, co się dzieje, gdy zastosujesz je wszędzie (patrz: AbstractSingletonProxyFactoryBean , tak, istnieje), lub myślę, że to jakaś srebrna kula. Chodzi o to, że choć naprawdę długo się z nimi czują, mają oni faktycznie zmniejszyć złożoność, czyniąc rzeczy przewidywalnymi / zrozumiałymi na wysokim poziomie. To bardzo różni się od bycia łatką dla błędów twojego języka.

Edycja 2 - dodano kontrprzykład AbstractSingletonProxyFactoryBean, aby wyśmiewać wzorce. Aby być całkowicie uczciwym, patrząc na światło AOP, nawet ten kontrprzykład można obronić.

Daniel B.
źródło
(+1) i zaakceptuj, ponieważ zawęziłeś moje wyszukiwanie wzorców DSL i aplikacji. Bardzo miło i czy możesz rozwinąć lub zamieścić link do czytelnika, może w nawiasie przynajmniej jeden z akronimów DSL Podejrzewam, że oznacza to język specyficzny dla domeny.
Eduard Florinescu,
@EduardFlorinescu dzięki, zaktualizowałem linki do DSL.
Daniel B
Znalazłem również ten artykuł potwierdzający część twojej odpowiedzi w tej sprawie z Groovy ibm.com/developerworks/java/library/j-eaed7/index.html
Eduard Florinescu
1
@EduardFlorinescu to bardzo interesujące, chociaż nie chodziło mi tylko o wzorzec tłumacza; miałem na myśli, że wiele wzorców może być specyficznych dla domeny i stać się prawie idiomatycznych dla programistów w tej domenie. W tym sensie stają się rodzajem DSL i nie wymagają wiele wysiłku, aby zrozumieć i używać. Np. Kiedy czytam przez wzorzec poleceń (przykład niezwiązany z domeną), wiem, który kod płytki wzorcowej mogę bezpiecznie zignorować i nie wymaga to wiele wysiłku. Ale dzięki za interesujący link.
Daniel B