Gdzie są wszystkie wzorce projektowania funkcjonalnego programowania? [Zamknięte]

75

Literatura programistyczna OO jest pełna wzorców projektowych. Większość książek o programowaniu obiektowym poświęca jeden lub dwa rozdziały projektowaniu wzorów, takich jak fabryki i dekoratorzy. Jakie są równoważne wzorce w językach funkcjonalnych i dlaczego nikt jeszcze nie napisał o nich książki? Czy jest coś specjalnego w językach funkcjonalnych, które eliminują potrzebę tworzenia wzorców projektowych?

davidk01
źródło
6
Zdecydowanie istnieją funkcjonalne wzorce projektowe - na przykład zapamiętywanie lub monady - zastanawiam się również, czy ktoś zebrał je w jednym miejscu ...
FinnNk
2
FinnNk Monad jest bardziej klasą typu niż wzorem projektu ^ _ ^
alternatywnie
Dla haskell Gabriel Gonzalez ma kilka postów na blogu, na przykład haskellforall.com/2012/08/the-category-design-pattern.html
bennofs
1
Zmniejszenie mapy to jeden. Jestem rozczarowany, że nie ma dobrej listy wzorów
Sridhar Sarnobat

Odpowiedzi:

47

OO i programowanie funkcjonalne to dwa bardzo różne paradygmaty programowania, a wzorce projektowe (DP) są istotną częścią projektowania i programowania OO. DP nie mają takiej roli w programowaniu funkcjonalnym.

Można nawet powiedzieć, że DP nie są potrzebne w programowaniu funkcjonalnym - nie ma swędzenia, na które DP jest lekarstwem.

Maglob
źródło
41
Nie jestem pewien, czy zgodziłbym się, że wzorce projektowe nie dotyczą FP. FP nadal przedstawia typowe problemy, które można rozwiązać w szczególności, wspólne sposoby. Różne problemy niż te rozwiązane w OO, ale mimo to problemy. Myślę, że to chyba coś, na co poświęcono dużo mniej uwagi niż w OO, ponieważ FP jest obecnie mniej powszechne w świecie komercyjnym.
d11wtq
22
Twierdzenie, że wzór programowania nie istnieje w programowaniu funkcjonalnym, jest dezinformacją. Najłatwiejszym kontrprzykładem jest monada. Nie musisz używać monady w programowaniu funkcjonalnym, ale jest to bardzo powszechny wzór, który ludzie stosują, aby ułatwić stosowanie czystego programowania funkcji. To w istocie jest definicja wzorca projektowego.
voidvector
3
Wzory projektowe dotyczą wszystkich działań projektowych, czy to programowania, czy projektowania domu. W rzeczywistości same pojęcia języków wzorcowych pochodzą z architektury: en.wikipedia.org/wiki/A_Pattern_Language .
BobDalgleish,
2
Hmm Obserwowalne strumienie, walidacja kolei i piekło, prawie każda monada jest wzorem, prawda?
Chet,
2
@voidvector Monady to nie tylko wzór. W FP monady są używane jako funktory między układami typów, a sama koncepcja pochodzi z teorii kategorii, gałęzi matematyki. Służą do opisania szczególnego rodzaju relacji między strukturami algebraicznymi w ogóle. Bardziej trafne byłoby stwierdzenie, że programowanie funkcjonalne jest projektową bazą danych, która ułatwia wykorzystanie matematyki w programowaniu.
John Cramerus
67

Jeremy Gibbons pisze książkę. Do czasu jego ukończenia możesz przeczytać jego blog, Patterns in Functional Programming . Zaleca czytanie swoich postów od najstarszego do najnowszego.

Przeglądaj także jego publikacje . Omawia Gang of Four Patterns we wzorach projektowych jako programy generyczne dla wyższych typów danych i opisuje wzorce programowania za pomocą rekurencyjnych równań w Programowaniu Origami (fałdy i rozwinięcia).

Corbin March
źródło
13

Prostym faktem jest to, że wiele Wzorów OO byłoby uznawanych za Idiomy w językach funkcjonalnych (szczególnie oryginalne wzorce GoF). Na przykład wzorzec Iterator (teraz wbudowany w języki takie jak C #) po prostu nie jest konieczny w Lisp lub ML, który ma operatory sekwencji.

Wiele wzorców, których używamy w systemach OO, ma na celu pomóc nam usunąć „nieistotne” elementy, abyśmy mogli skupić się na kodowaniu obiektów. Innymi słowy, wzory są rozwiązaniami dla nieciekawych części aplikacji. Powinniśmy wykorzystywać wzorce, aby zaspokoić typowe potrzeby, które zostały wcześniej rozwiązane (takie jak wzorce w architekturze Fowlers Patterns of Enterprise Application Architecture do radzenia sobie z takimi rzeczami, jak transmisja bazy danych lub wzorce xUnit w celu usprawnienia testów jednostkowych), abyśmy mogli skupić się na zwiększaniu wartości biznesowej dla aplikacji.

Jestem pewien, że poza specyfiką wzorców GoF, istnieją wzorce projektowe, które będą miały zastosowanie również do programowania funkcjonalnego. Chodzi o to, że OO jest dominującym paradygmatem. Pisanie wzornika skierowanego do funkcjonalnych programistów ... cóż, szczerze mówiąc, nie dostanie zielonego światła od wydawcy. Do tego się sprowadza. Na rynku wzorów funkcjonalnych nie ma wystarczającej liczby książek poświęconych temu tematowi.

Michael Brown
źródło
9

Dobra rozmowa (około 45 minut) na ten temat napisana przez Stuarta Sierra:

http://www.infoq.com/presentations/Clojure-Design-Patterns

Niekoniecznie wiążący i autorytatywny, ale rozpoznałem wiele jego przykładów z własnego doświadczenia z wykorzystaniem FP do analizy danych.

Przykłady napisane w Clojure, ale prawdopodobnie dotyczą dowolnego języka FP. Nazwy, które nadaje wzorom, które obejmuje, to:

  • Stan / zdarzenie
  • Konsekwencje
  • Akumulator
  • Zmniejsz / Połącz
  • Rozbudowa rekurencyjna
  • Rurociąg
  • Obwoluta
  • Znak
  • Obserwator
  • Strategia
Aaron Johnson
źródło
6

Jeśli naprawdę interesuje Cię nauka wzorców projektowych, nie szukaj dalej niż Haskell. Jeśli poświęcisz trochę czasu na naukę języka w trudny sposób, na jaki natkniesz się i zaznajomisz z podstawowymi wzorami - są one upieczone w tym języku.

Nie pomijaj monad. Istnieje wiele długich i skomplikowanych wyjaśnień i potrzeba trochę pracy, aby pomysły zostały wprowadzone, ale jeśli nadal będziesz je podłączać, w końcu pojawi się na tobie i będziesz zaskoczony, jak wiele wzorów projektowych może być zbudowane na tej jednej abstrakcji / interfejsie.

Po zabiciu Haskella będziesz mieć do dyspozycji wystarczającą ilość arsenału FP, aby być niebezpiecznym. Chodzi o to, trzymaj się tego, dopóki go nie dostaniesz. Brak skrótów.

Mario T. Lanza
źródło
-3

O ile metodologia projektowania dla FP polega na zaprojektowaniu typów dokładnie odzwierciedlających problematyczną przestrzeń, a implementacja powinna nastąpić automatycznie, odpowiednik FP książki na temat wzorców projektowych przypomina coś w rodzaju struktur funkcjonalnych danych Chrisa Okasakiego .

geekozaur
źródło
1
Książka Okasaki jest odpowiednikiem części struktury danych w wielu książkach o strukturze danych i algorytmach, które zwykle uwzględniają tylko zmienną strukturę danych.
AProgrammer
1
Nie sądzę, aby zrównanie struktur danych z wzorcami pasowało do rachunku. To nie jest tak, że programiści OO tylko wymachują rękami, dopóki nie pojawią się odpowiednie definicje klas.
davidk01
Tak, książka Okasaki jest na niższym poziomie niż wzory.
FinnNk