Wzory projektowe inne niż OOP? [Zamknięte]

70

Słyszałem tylko, że termin „wzorzec projektowy” jest używany dla kodu obiektowego, a wzorce GoF obejmują tylko wzorce projektowe OOP, ale wzorce projektowe są eleganckimi rozwiązaniami dla często występujących problemów programistycznych, prawda? Nic tam nie mówi, że muszą być ograniczone do OOP, prawda?

Chciałbym zobaczyć kilka przykładów wzorców projektowych poza sferą programowania obiektowego. Czy masz jakieś? Czy takie w ogóle istnieją (żadna książka, podobnie jak książka GoF, musiała być koniecznie napisana, należy ją po prostu użyć; to wystarczy)?

Mogą być specyficzne dla niektórych języków programowania, ale preferowane są wzorce ogólne (na poziomie paradygmatu), inne niż paradygmaty zorientowane obiektowo.

Anto
źródło
8
Myślę, że największą niedogodnością, jaką zrobiły popularne wzorce projektowe, było stworzenie całej rzeszy ludzi, którzy wierzyli, że wzorce te dotyczą tylko języków obiektowych. Wzory kreacyjne są dyskusyjne, ale prawie wszystkie inne mogą i są zaimplementowane przez cały czas w żadnym języku obiektowym. Jestem pewien, że ten efekt uboczny nie był zamiarem autora, jest to jednak efekt uboczny.
Pemdas
14
Cóż, obiekty są wzorcem projektowym w językach innych niż OO :)
back2dos,
1
co gorsza, wzorniki stworzyły całą klasę ludzi, którzy wierzą, że każdy problem powinien zostać rozwiązany poprzez zastosowanie określonego wzorca (zwykle tego ostatniego, którego uczył nauczyciel, który sam wierzy).
jwenting

Odpowiedzi:

25

Zobacz serię wzorców projektowych jądra systemu Linux. Artykuły są związane z językiem nieobiektywnym (C) i uważam, że są dobrze napisane:

sakisk
źródło
Używają jednak podejścia obiektowego.
Kais
12

W rzeczywistości jest to paradoks - jednym z najpopularniejszych wzorców bez OO jest ... „Klasa”.

Ponieważ OO zostało wynalezione w językach innych niż OO, programiści musieli to zasymulować (i robią to nawet teraz) - tak narodził się wzorzec. LISP i C są tego przykładem.

Ale weź moją radę: nie popełniaj powszechnego błędu - nie używaj wzorów tylko dlatego, że jest fajny , potrzebujesz poważnych powodów, aby uzasadnić użycie wzoru (przynajmniej OO).

Weźmy na przykład wzorzec poleceń - chociaż jest miły i oddziela osobę dzwoniącą od odbiornika, nie należy jej używać, chyba że faktycznie jest to potrzebne - ponieważ operacje powinny być wyrażane za pomocą czasowników - co oznacza metody. Używanie poleceń w miejscu, w którym skończyłbyś z grupą całkowicie zdecentralizowanych OO-lambdas -> to samo dotyczyłoby wielu strategii.

Kamil Tomšík
źródło
11

„Wzorzec projektowy” jest tak naprawdę eufemizmem dla „obejścia”. Wzory projektowe zostały wymyślone w celu obejścia braków i wad w językach OO . Weźmy na przykład wzorzec iteratora, który ostatecznie doprowadził do wprowadzenia kolekcji w Javie. Groovy pozbył się wielu innych wzorów, przekształcając je w funkcje językowe: Nie potrzebujesz już wzoru dekoratora, ponieważ możesz dodawać metody do istniejących klas w Groovy.

Oznacza to, że wszędzie można znaleźć wzory. W rzeczywistości każdą „najlepszą praktykę” można uznać za prostą formę wzorca projektowego.

Aaron Digulla
źródło
9
Zgoda! Od Paula Grahama : „Na przykład w świecie OO słyszysz sporo o„ wzorach ”. [...] Kiedy widzę wzorce w moich programach, uważam to za problem. Kształt programu powinien odzwierciedlać tylko problem, który musi rozwiązać. Każda inna prawidłowość w kodzie jest dla mnie znakiem, że używam abstrakcji, które nie są wystarczająco potężne - często generuję ręcznie rozszerzenia niektórych makr które muszę napisać. ”
Andres F.
7
Nie zgadzam się z tym, że wzór konstrukcyjny jest obejściem. Te dwa są przeciwieństwami. Obejściem tego problemu jest krótkotrwała łatka stworzona w celu ominięcia określonej przeszkody. Wzory projektowe są długoterminowymi rozwiązaniami wielokrotnego użytku. Celem wzoru dekoratora jest funkcjonalne dodanie „bez” modyfikacji klasy. Możesz umieścić różne ozdoby na obiekcie bez wiedzy o nim.
Despertar
Powodem, dla którego wzory są uważane za „obejście”, jest to, że dekorowanie obiektu powinno być cechą języka. Zamiast tego musimy napisać wiele wierszy kodu, aby to zaimplementować. Jako przykład wzorzec iteratora stał się częścią wielu współczesnych języków. W przypadku starszych języków OO musisz przeskoczyć kilka obręczy, aby je zasymulować.
Aaron Digulla
@AaronDigulla Nie rozumiem, dlaczego uważasz, że wzór taki jak dekorator jest tak ciężką implementacją; mówisz o kilku liniach kodu. Klasa zawiera inną klasę i przekazuje do niej żądania z pewną dodatkową funkcjonalnością. Wykorzystuje dziedziczenie i kompozycję w taki sposób, że wywołanie dekorowanego obiektu jest równoważne z wywołaniem samego obiektu. Uważam tę przejrzystość za siłę. Umożliwia to wymianę dekoratorów w czasie wykonywania. Kiedy mówisz, że groovy nie potrzebuje dekoratora, ponieważ może dodawać metody do klasy, brzmi to tak, jakbyś nie rozumiał.
Despertar
2
Wzorzec Iterator nie został zastąpiony żadną nową funkcją językową we współczesnych językach. Po prostu ma domyślną implementację dla popularnych kolekcji. To, że ma domyślną implementację, nie oznacza, że ​​wzorzec nie jest używany. Jeśli napiszesz własną kolekcję, będziesz musiał ją wdrożyć samodzielnie.
Despertar,
10

LtU wspomina, że Jeremy Gibbons pisze książkę o wzorcach w programowaniu funkcjonalnym. Zajrzyj na bloga Wzory Gibbona w programie programowania funkcjonalnego, aby zapoznać się z kilkoma zwiastunami. Uwaga: zaleca czytanie swoich postów od najstarszego do najnowszego.

Jego praca „ Wzory projektowe jako programy generyczne dla wyższych typów danych” (pdf) funkcjonalnie modeluje Gang czterech wzorców: Composite, Iterator, Visitor i Builder. Opisuje wzorce programowania za pomocą rekurencyjnych równań w Programowaniu Origami (składa się i rozwija).

Corbin March
źródło
7

Zamiast nazywać wzorce projektowe inne niż oo, chciałbym podać kilka przykładów książek, które mają wiele wzorców projektowych (w nich niektóre nadal będą specyficzne dla OO):

Mam nadzieję że to pomoże

KeesDijk
źródło
Są to również te, które poleciłbym, a także wzorce integracji korporacyjnej firmy Hohpe & Woolf .
TMN
Wzory Fowlera są bardzo OO :)
David Conde
@David Conde :) Większość z nich to czysty OO, wszystkie są spisane w sposób OO, ale niektóre z nich dotyczą również innych niż OO: spójrz na „Wzorce prezentacji internetowej”, „Wzorce stanu sesji”, „Wzorce dystrybucji „
KeesDijk
1

Programowanie modułowe jest dość popularne w bibliotekach numerycznych i aplikacjach wymagających matematyki (oprogramowanie numeryczne jest bardzo trudne do modelowania za pomocą wzorców obiektowych, głównie dlatego, że jest bardzo niewiele do kapsułkowania).

quant_dev
źródło
Używane w JS i „pure C”: en.wikipedia.org/wiki/Module_pattern
umlcat
0

Lubię myśleć o Strucutres danych, takich jak kolejki, połączone listy, drzewa, wykresy itp. Jako wzorce. Definiują określone wzorce do przechowywania danych i ich przetwarzania. Mogą wydawać się prymitywne w porównaniu z bardziej zaawansowanymi wzorami Gang of Four, ale mimo to są wzorami. To znaczy, co by się stało, gdyby ktoś zaimplementował stos jako FIFO zamiast LIFO i odwrotnie dla kolejki i nazwałby je inaczej?

DPD
źródło