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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top