Functional Programming Architektur
-
01-07-2019 - |
Frage
Ich bin vertraut mit objektorientierter Architektur, einschließlich der Verwendung von Design Patterns und Klassendiagramme zur Visualisierungen, und ich weiß, die serviceorientierten Architektur mit ihren Verträgen und Protokollbindungen, aber gibt es etwas charakteristisch über eine Software Architektur für ein System in einer funktionalen Programmiersprache geschrieben?
Ich weiß, dass FP hat für mittelgroße bis große Projekte verwendet. Paul Graham schrieb die erste Inkarnation von Yahoo! Lagern Sie in Common Lisp. Einige Lisp-Entwicklungssysteme sind komplex. Künstlicher Intelligenz und Finanzsysteme in funktionalen Sprachen geschrieben sind, können ziemlich groß werden. Sie alle haben mindestens eine Art von inhärenter Architektur, aber ich frage mich, ob sie etwas gemeinsam hat?
Was ist eine Architektur, die auf der Auswertung von Ausdrücken basierte aussehen? Sind FP-Architekturen mehr zusammensetzbare?
Update: Kyle erinnerte mich, dass SICP ist eine gute Ressource für dieses Thema.
Update 2: Ich fand einen guten Beitrag zum Thema: Wie funktioniert die funktionale Programmierung, die die Struktur des Codes beeinflussen?
Lösung
Der rote Faden in der „Architektur“ von Projekten, die funktionalen Sprachen verwenden, ist, dass sie in Schichten von Algebren getrennt werden neigen eher als Subsysteme in dem traditionellen Systemarchitektur Sinne.
Für große Beispiele solcher Projekte Besuche XMonad , Yi und Happs . Wenn Sie untersuchen, wie sie strukturiert sind, werden Sie feststellen, dass sie umfassen Schichten von monadischen Struktur mit einigen combinator Kleber dazwischen.
Schauen Sie auch unter Das Papier Scala Experiment, das umreißt eine Architektur, bei der ein System von Komponenten, die abstrakt über die Abhängigkeiten zusammengesetzt ist.
Andere Tipps
Im Moment arbeite ich an dem Buch "Design and Architecture in Functional Programming". Es beschreibt viele Entwurfsmuster und Ansätze, die in reiner FP Welt existieren werden (primäre Sprache Haskell), aber nicht nur. Das Buch zeigt Ihnen, wie von Grund auf mit großen Anwendung bauen reinen und unreinen Zustand, Multithreading, Netzwerk, Datenbank, GUI, wie sie in Schichten zu unterteilen und Einfachheit erhalten. Es zeigt auch, wie Domains und Sprachen modellieren, wie Architektur der Anwendung zu organisieren und zu beschreiben, wie es zu testen und noch mehr.
Die Liste der Themen:
- Ansätze zur Architekturmodellierung Diagramme verwendet wird;
- Anforderungsanalyse;
- Embedded DSL-Domäne Modellierung;
- Externes DSL-Design und Implementierung;
- Monaden als Subsysteme mit Effekten;
- Free Monaden als funktionale Schnittstellen;
- Arrowised eDSLs;
- Inversion of Control Freie monadischen eDSLs verwendet wird;
- Software Transactional Memory;
- Objektive;
- State, Reader, Writer, RWS, ST Monaden;
- unreiner Zustand: IOREF, MVar, STM;
- Multithreading und gleichzeitige Domänenmodellierung;
- GUI;
- Anwendbarkeit von Mainstream techiques und Ansätze wie UML, FEST, GRASP;
- Die Interaktion mit dem unreinen Subsystemen.
Das Buch basiert auf den Haskell Projekten Ich bin die Erforschung, insbesondere eine SCADA-Anwendung Andromeda . Der Code für dieses Buch ist verfügbar hier . Während das Buch in der Entwicklung befindet (es wird bis auf die 2017 durchgeführt werden), kann ich Ihnen empfehlen, ein href um sich mit meinem Artikel „Design and Architecture in FP“ <= "https://docs.google.com/ Dokument / e / 1Gypzxp13aMpzD7o5XAmgy5zRrchQKrEbJArm6hDmwqk bearbeiten / # heading = h.zgk3nhua391m“rel = "noreferrer"> hier (Rus).
UPDATE
Ich teilte mein Buch online (ersten 5 Kapitel). Siehe Beitrag auf Reddit
Die größte Gemeinsamkeit Sie in funktionalen Sprachen finden wird mit Funktionen, um Daten zu speichern. Es ist ein bisschen wie ohne das Objekt auf ein Objekt Accessor-Funktionen. Stattdessen wird die Funktion in einer Umgebung geschaffen, in dem sie den Zugang zu den Daten hat es braucht. Nun kann diese Funktion überall weitergegeben und verwendet werden und immer noch die Fähigkeit beibehalten, die Daten zu verwenden.
Hier ist ein sehr einfaches Beispiel. Dies ist nicht rein funktional wie Zustand nicht ändert, aber es ist häufig genug:
(define (make-counter)
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(define x (make-counter))
(x) returns 1
(x) returns 2
...etc...
So wir eine Funktion haben, Make-Zähler, die eine andere Funktion zurückgibt, die den Zustand des Zählers nach innen hat. Wir können das neu erstellte Zähler aufrufen und beobachten Sie die Änderung im Inneren.
Dies ist, wie funktionalen Programme strukturiert sind. Sie haben Funktionen, die Funktionen als Argumente, Sie Funktionen, die Funktionen mit verstecktem Zustand zurück, usw. Es ist alles viel sauberer als du Speicher zu verwalten.
Ich habe mit einigen ziemlich großen funktionalen Projekten gearbeitet. Sie fallen in der Regel in zwei Lager (zumindest die, die ich verwendet habe):
- Extreme Skalierbarkeit / Zuverlässigkeit / Gleichzeitigkeit. Transactional Modelle können sehr eng in die Sprache eingebaut werden. Concurrent ML ist ein gutes Beispiel dafür, und Projekte, die es sehr schwer verwenden falsch zu machen, wenn es um die Parallelität Korrektheit kommt.
- Parsing / Modifizieren-Frameworks. Viele der Design-Muster, die diese Frameworks auf basieren sind unglaublich einfach zu formulieren / build / ändern in funktionalen Sprachen. Das Besuchermuster ist ein gutes Beispiel dafür.
ich ausgedruckt und sah über Design Patterns in ocaml , und sie nutzen Module und functors (und Objekte) die normalen Entwurfsmuster neu erstellen wir es gewohnt sind. Es ist interessant, aber ich denke, dass sie Objekte verwenden zu viel, um wirklich den Vorteil der funktionalen Sprachen zu sehen. FP sehr zusammensetzbare ist, ein Teil davon ist die Natur. Ich denke, meine kurze Antwort ist, zu verwenden, Module und functors .
Mein aktuelles Projekt ist ziemlich groß, und wir trennen die einzelnen Module von Dateien in ocaml --implicit. Ich habe auch für eine umfassende Ressource gejagt, dass einige alternative Ansichten oder einige Gedanken über ein wirklich gelungenes Design haben könnte, die aus einem Projekt kam.
Hoffentlich nicht zu tangential, aber wahrscheinlich interessant für alle, die Antworten auf diese Frage suchen, wird diese Präsentation Design Patterns in dynamische Programmierung von Peter Norvig.
Ich denke, das helfen kann;
Einige der Muster verschwinden - das ist, werden sie direkt unterstützt durch Sprach-Features, einige Muster sind einfacher oder einen anderen Fokus haben, und einige sind im Wesentlichen unverändert.
[AIM-2002-005] Gregory T. Sullivan, Erweiterte Programmiersprache Features für Executable Entwurf Patterns „Bessere Muster durch Reflexion
22. März 2002
Das Design Patterns Buch [GOF95] präsentiert 24 altbewährten Muster, konsequent erscheinen in gut gestalteten Software-Systeme. Jedes Muster ist mit einer Beschreibung der dargebotenen Design-Problem das Muster adressiert, sowie Beispielimplementierung Code und Design-Überlegungen. Dieses Papier untersucht, wie die Muster von der "Gang of Four '' oder" GOF '' Buch, wie es oft genannt wird, angezeigt, wenn ähnlich Probleme adressiert ein mit dynamische höhere Ordnung, objektorientierter Programmiersprache. Einige der Muster verschwinden zu lassen - das heißt, sie direkt nach Sprache werden unterstützt Merkmale sind einige Muster einfacher oder haben einen anderen Fokus, und einige sind im Wesentlichen unverändert.