Wo sind alle funktionalen Programmierdesignmuster? [geschlossen]

75

Die OO-Programmierliteratur steckt voller Designmuster. Die meisten Bücher über objektorientierte Programmierung widmen ein oder zwei Kapitel dem Entwerfen von Mustern wie Fabriken und Dekorateuren. Also, was sind die äquivalenten Muster in funktionalen Sprachen und warum hat noch niemand ein Buch darüber geschrieben? Gibt es etwas Besonderes an funktionalen Sprachen, das Designmuster überflüssig macht?

davidk01
quelle
6
Es gibt definitiv funktionale Designmuster - zum Beispiel Memo oder Monaden - ich frage mich auch, ob jemand sie an einem Ort gesammelt hat ...
FinnNk
2
FinnNk Monad ist eher eine Typenklasse als ein Designmuster ^ _ ^
Alternative
Für haskell hat Gabriel Gonzalez einige Blog-Posts, zum Beispiel haskellforall.com/2012/08/the-category-design-pattern.html
bennofs 16.04.14
1
Map Reduce ist eins. Ich bin enttäuscht, dass es keine gute Liste von Mustern gibt
Sridhar Sarnobat

Antworten:

47

OO und funktionale Programmierung sind zwei sehr unterschiedliche Programmierparadigmen, und Design Patterns (DP) sind ein wesentlicher Bestandteil von OO-Design und -Programmierung. DP spielen bei der funktionalen Programmierung keine solche Rolle.

Man könnte sogar sagen, dass DP in der funktionalen Programmierung nicht benötigt wird - es gibt keinen Juckreiz, gegen den DP heilt.

Maglob
quelle
41
Ich bin mir nicht sicher, ob ich damit einverstanden bin, dass Designmuster nicht für FP gelten. FP präsentiert immer noch gemeinsame Probleme, die auf bestimmte, gemeinsame Arten gelöst werden. Andere Probleme als in OO gelöst, aber trotzdem Probleme. Ich denke, es ist wahrscheinlich nur etwas, dem viel weniger Aufmerksamkeit geschenkt wurde als OO, da FP im Moment in der Geschäftswelt weniger verbreitet ist.
d11wtq
22
Zu behaupten, dass es in der funktionalen Programmierung kein Entwurfsmuster gibt, ist eine Fehlinformation. Das einfachste Gegenbeispiel ist die Monade. Sie müssen in der funktionalen Programmierung keine Monade verwenden, aber es ist ein sehr verbreitetes Muster, dem die Leute folgen, um die Anwendung der reinen Funktionsprogrammierung zu erleichtern. Das ist im Wesentlichen die Definition des Entwurfsmusters.
Voidvector
3
Entwurfsmuster gelten für alle Entwurfsaktivitäten, ob Programmierung oder Hausentwurf. Tatsächlich stammen die Konzepte der Mustersprachen aus der Architektur: en.wikipedia.org/wiki/A_Pattern_Language .
BobDalgleish
2
Hmm. Beobachtbare Ströme, Railway Validation und Hölle, so ziemlich jede Monade ist ein Entwurfsmuster, oder?
Chet
2
@voidvector Monaden sind nicht einfach ein Entwurfsmuster. In FP werden Monaden als Funktoren zwischen Typsystemen verwendet, und das Konzept selbst stammt aus der Kategorietheorie, einem Zweig der Mathematik. Sie werden verwendet, um eine bestimmte Art von Beziehungen zwischen algebraischen Strukturen allgemein zu beschreiben. Es wäre genauer zu sagen, dass funktionale Programmierung ein Designdattern ist, um die Verwendung von Mathematik in der Programmierung zu erleichtern.
John Cramerus
67

Jeremy Gibbons schreibt das Buch. Bis es fertig ist, können Sie seinen Blog lesen, Patterns in Functional Programming . Er empfiehlt, seine Beiträge von den ältesten bis zu den neuesten zu lesen.

Durchsuchen Sie auch seine Publikationen . Er behandelt Vierergruppenmuster in Entwurfsmustern als Datentyp-generische Programme höherer Ordnung und beschreibt die Muster der Programmierung mit rekursiven Gleichungen in der Origami-Programmierung (Falten und Entfalten).

Corbin March
quelle
13

Die einfache Tatsache ist, dass viele OO-Muster in funktionalen Sprachen (insbesondere die ursprünglichen GoF-Muster) als Redewendungen betrachtet werden. Beispielsweise ist das Iterator-Muster (das in Sprachen wie C # jetzt integriert ist) in Lisp oder ML mit Sequenzoperatoren nicht erforderlich.

Viele der Muster, die wir in OO-Systemen verwenden, helfen uns dabei, das "Nicht-Wesentliche" aus dem Weg zu räumen, damit wir uns auf das Codieren von Objekten konzentrieren können. Mit anderen Worten, die Muster sind Lösungen für die nicht interessanten Teile der Anwendung. Wir sollten Muster wirksam einsetzen, um allgemeine Anforderungen zu erfüllen, die zuvor gelöst wurden (z. B. die Muster in Fowlers Patterns der Enterprise Application Architecture für den Umgang mit Datenbankübertragungen oder xUnit Patterns für die Steigerung Ihrer Einheitentests), damit wir uns auf die Steigerung des geschäftlichen Nutzens konzentrieren können für die anwendung.

Ich bin sicher, dass es jenseits der Besonderheiten der GoF-Muster Entwurfsmuster gibt, die auch für die funktionale Programmierung gelten. Die Sache ist, dass OO das vorherrschende Paradigma ist. Ein Musterbuch zu schreiben, das sich an funktionale Entwickler richtet ... wird von einem Verlag ehrlich gesagt kein grünes Licht bekommen. Darauf kommt es an. Es gibt nicht genug Markt für funktionale Muster, um eine bedeutende Anzahl von Büchern zu diesem Thema zu haben.

Michael Brown
quelle
9

Ein guter Vortrag (~ 45 min) von Stuart Sierra zu diesem Thema:

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

Nicht unbedingt verbindlich und maßgeblich, aber ich erkannte eine Reihe seiner Beispiele aus eigener Erfahrung mit FP für die Datenanalyse.

Beispiele in Clojure geschrieben, aber wahrscheinlich auf jede FP-Sprache anwendbar. Die Namen, die er den Mustern gibt, die er bedeckt, sind:

  • Staat / Ereignis
  • Konsequenzen
  • Akkumulator
  • Reduzieren / Kombinieren
  • Rekursive Erweiterung
  • Pipeline
  • Verpackung
  • Zeichen
  • Beobachter
  • Strategie
Aaron Johnson
quelle
6

Wenn Sie wirklich daran interessiert sind, die Designmuster zu lernen, sind Sie bei Haskell genau richtig. Wenn Sie sich die Zeit nehmen , die Sprache auf die harte Tour zu lernen, werden Sie mit den meisten grundlegenden Mustern vertraut - sie sind in die Sprache eingebettet.

Überspringe keine Monaden. Es gibt eine Reihe von langwierigen Erklärungen, und es bedarf einiger Anstrengungen, um die Ideen in die Realität umzusetzen. Wenn Sie sich jedoch weiter verstecken, wird es Ihnen irgendwann klar und Sie werden erstaunt sein, wie viele Designmuster möglich sind Bauen Sie auf dieser einen Abstraktion / Schnittstelle auf.

Sobald Sie Haskell gefunden haben, steht Ihnen genug FP-Arsenal zur Verfügung, um gefährlich zu werden. Der Punkt ist, bleiben Sie dran, bis Sie es bekommen. Es gibt keine Abkürzungen.

Mario T. Lanza
quelle
-3

Sofern die Entwurfsmethode für FP darin besteht, Ihre Typen so zu entwerfen, dass sie den Problembereich genau widerspiegeln, und die Implementierung automatisch erfolgen sollte, entspricht das FP-Äquivalent eines Buches zu Entwurfsmustern etwa Chris Okasakis rein funktionalen Datenstrukturen .

Geekosaurier
quelle
1
Okasakis Buch ist das Äquivalent zum Datenstrukturteil zahlreicher Datenstruktur- und Algorithmenbücher, die normalerweise nur veränderbare Datenstrukturen berücksichtigen.
AProgrammer
1
Ich denke nicht, dass das Gleichsetzen von Datenstrukturen mit Entwurfsmustern der Rechnung entspricht. Es ist nicht so, als würden OO-Programmierer nur mit den Armen schlagen, bis die richtigen Klassendefinitionen auftauchen.
Davidk01
Ja, Okasakis Buch ist auf einer niedrigeren Ebene als Designmuster.
FinnNk