2010-03-16 5 views
43

Genauer gesagt, wie modelliert man ein funktionales Programm oder eines, das mit dem Functional Style (ohne Klassen) unter Verwendung eines Diagramms und nicht textlicher Darstellung entwickelt wurde, ist es überhaupt möglich und könnte mich jemand bitte an die nächste Anwendung verweisen tun Sie dies (Open Source, von frei wie in Bier, wenn Sie bitte)Kann UML verwendet werden, um ein funktionales Programm zu modellieren?

+1

Eine verwandte Frage: „Gibt es eine Modellierung verwenden Sprache für das funktionale Programmierparadigma? ": http://stackoverflow.com/questions/1364237/is-there-a-modeling-language-for-the-functional-programming-paradigm (die am häufigsten gewählte Antwort ist im Moment "Ich glaube, die Modellierungssprache für Haskell heißt 'math'") – Chuck

+0

Hier ist eine gute Frage und Antwort: https://softwareengineering.stackexchange.com/questions/30281 1/Was-sind-Funktional-Programmierer-Using-In-Place-of-Uml – Fuhrmanator

Antwort

27

Funktionelle Programmierer haben in der Regel keine große Verwendung für Diagramme. Viele funktionale Programmierer (aber nicht alle) finden, dass das Schreiben von Typen eine gute Möglichkeit ist, die Entwurfsbeziehungen zu kapseln, die OO-Programmierer in UML-Diagramme einfügen.

Da ein veränderbarer Zustand in funktionalen Programmen selten ist, gibt es keine veränderbaren "Objekte", daher ist es normalerweise nicht sinnvoll oder notwendig, Beziehungen zwischen ihnen zu zeichnen. Und während eine Funktion eine andere aufrufen kann, ist diese Eigenschaft für das Gesamtdesign eines Systems normalerweise nicht wichtig, sondern nur für die Implementierung der Aufruffunktion.

Wenn ich ein starkes Bedürfnis verspürte, ein funktionales Programm zu entwerfen, könnte ich eine verwenden, in der Typen oder Funktionen die Rolle von Konzepten spielen.

+0

Dank Norman, ein bisschen eine rekursive Frage, aber ich denke, dass Sie geantwortet haben, was ich am eloquentsten fühlte. – WeNeedAnswers

+1

dies zu überarbeiten, denke ich, dass unveränderliche Typen modelliert werden können. Sie können diese unveränderlichen Objekte dann in Funktionen übergeben, die auf sie wirken und eine neue Ausgabe erzeugen. Diese Frage, die ich gestellt habe, war für ein Projekt, an dem ich gerade arbeitete. Am Ende habe ich UML benutzt, aber die Objekte in Funktionen und unveränderliche Typen aufgespalten. Es hat Spaß gemacht. – WeNeedAnswers

+3

Ich bin gespannt, ob diese Antwort heute noch stimmt. Wie wird Komplexität verwaltet? Z. B. weist UML Paket-/Klassen-/Methoden-Ebenen von Abstraktionen auf, die es ermöglichen, die Komplexität zu verwalten (Verbergen von Details auf verschiedenen Abstraktionsebenen). Die Diagramme ermöglichen die Visualisierung dieser Ebenen. Meine bisherigen Erfahrungen mit FP sind zu trivial, um zu sehen, wie dies notwendig ist, aber jedes komplexe System wäre ohne irgendeine Art von Diagramm schwer zu finden. – Fuhrmanator

11

UML ist ein Kompendium verschiedener Arten von Modellierung. Wenn Sie über das Objektdiagramm (Klassendiagramm) sprechen, werden Sie nichts finden, was zu Ihrer gewünschten Verwendung passt. Aber wenn Sie über ein Interaktionsdiagramm (Aktivitätsdiagramm) oder ein Anforderungsdiagramm (Anwendungsfalldiagramm) sprechen, werden sie Ihnen natürlich helfen und sind Teil der UML-Basis.

+3

Ein "Anforderungsdiagramm" existiert nicht in UML (es ist von SysML) –

+1

Nein, UML ist Objekte den ganzen Weg. Alles ist ein Objekt, Interaktionsdiagramm Modellobjekte, es sei denn, Sie behandeln eine Funktion als Objekt? Ich habe das vor ein paar Jahren mit einem C# Delegierten versucht, was ein echtes Objekt ist, es hat nicht funktioniert. – WeNeedAnswers

+0

Ich schlage vor, etwas zu lesen. http://www.springerlink.com/content/wwvwbt5wbm35cq1r/ sollte Ihren Interessen entsprechen. – jpabluz

12

UML ist nicht nur Klassendiagramme, weißt du?

Die meisten anderen Diagrammtypen (Use-Case-Diagramme, Aktivitätsdiagramme, Sequenzdiagramme ...) sind perfekt für einen rein funktionalen Programmierstil geeignet. Selbst Klassendiagramme können immer noch nützlich sein, wenn Sie einfach keine Attribute und Assoziationen verwenden und "Klasse" als "Sammlung verwandter Funktionen" interpretieren.

+0

Ich fange aber an, den ursprünglichen Autor zu sehen. Wenn Sie nur eine Sammlung verwandter Funktionen modellieren, "modellieren" Sie nicht wirklich, sondern organisieren.Ich stimme nicht zu, dass es immer noch nützlich ist, aber es ist nicht so sehr Modellierungsverhalten. –

+1

@Marc: In Klassendiagrammen geht es nicht darum, das Verhalten zu modellieren. Dafür gibt es Aktivitäts- und Sequenzdiagramme. –

+0

UML dreht sich alles um Klassen, warum sonst noch eine solche papierbasierte Sprache erstellen ?, Ich habe eine Menge anderer Methoden vor und verwendet Methoden, die die Verfahrenstyp Sprachen (SSADM, um einen zu nennen). Noch keiner gesehen, der das gleiche für funktionale Sprachen tut. Bei UML dreht sich alles um Nachrichten und Kollaborationen mit diskreten Arbeitseinheiten, die als Klassen bezeichnet werden. Aber da eine Funktion eine Klasse sein kann, wie würde man etwas ohne Staat modellieren? UML Ich fühle, ist ein Hammer zu viel für etwas, das eine Nadel ist. – WeNeedAnswers

2

UML ist ein Objektansatz, da Sie auf grafischer Ebene keine funktionale Modellierung definieren können. Ein Trick besteht darin, Einschränkungen und Anmerkungen direkt am Modell und nicht in den Diagrammebenen hinzuzufügen. Ich meine, dass Sie zu jedem Modellelement eine vollständige Funktionsdokumentation direkt im Metamodell schreiben können und nur eine Objektansicht mit dem UML-Editor anzeigen. Das ist vielleicht dumm, aber ich fand diese Demo in Französisch Sprache genau auf dem gleichen Thema und mit EclipseUML Omondo: OCL und UML 2.2 (Demo in Französisch Sprache 3mn): http://www.download-omondo.com/regle_ocl.swf

Diese Demo wird erklärt, wie Einschränkungen hinzuzufügen direkt auf Methoden auf Metamodell-Ebene. Der interessante Punkt dieser Demo ist, dass die Verwendung eines einzigen Modells für das gesamte Projekt flexibel genug ist, um traditionelle UML zu erweitern und SysML-, BPMN- und DSL-Zusatzmodelle zu vermeiden, da alle Informationen auf dem UML 2.2-Metamodell aufgebaut sind. Ich weiß nicht, ob es ein Erfolg wird, aber diese Initiative ist sehr interessant, weil sie die Komplexität der Modellierung reduziert und neue Grenzen öffnet!

+0

Hey alle Antworten mit offenen Armen begrüßt, die einzigen dummen Fragen sind die, die nicht gefragt werden. :) Vielen Dank. Ich habe Einschränkungen betrachtet, denke, dass sie großartig sind, aber wenn dein Gefühl am reinsten ist, wenn man eine Sprache wie Haskell benutzt, wird es sehr peinlich, etwas anzuwenden, das keinen Zustand hat. Die Zwänge werden zu Wachen, aber Wächter sind so viel mehr als nur Zwänge. – WeNeedAnswers

+0

Ich verstehe nicht, warum die folgenden (praktischen) Aspekte nicht für funktionale Programmierung gelten: 1. Arbeitsteilung für Teams 2. Design für Test 3. Design für die Wiederverwendung. Nennen Sie es eine Klasse mit nur statischen Elementfunktionen oder einem Modul oder wie auch immer. Über die Ebene der Funktionen hinaus werden höhere Organisationsebenen aus praktischen Gründen benötigt. Systemkomponenten in nicht-monolithischen Anwendungen (z. B. Client, Server) erfordern auch Aussagen darüber, was gebaut und an Teams und Interessengruppen kommuniziert werden soll. UML bietet Möglichkeiten, eine solche Struktur unabhängig von der Sprache auszudrücken. – BitTickler

0

Ich habe nicht wirklich versucht, ein großes System in UML und dann für eine funktionale Implementierung zu modellieren, aber ich sehe nicht, warum es nicht funktionieren sollte.

Angenommen, die Implementierung würde Haskell sein, würde ich beginnen, indem Sie die Typen und ihre Beziehungen mit einem Klassendiagramm definieren. Ordnen Sie Klassen nach ihrem Hauptargument Funktionen zu, bedenken Sie jedoch, dass dies nur ein Artefakt von UML ist. Wenn es einfacher wäre, ein fiktives Singleton-Objekt zu erstellen, nur um alle Funktionen zu halten, wäre das auch in Ordnung. Wenn die Anwendung einen Zustand benötigt, dann hätte ich kein Problem damit, dies in einem Zustandsdiagramm oder Sequenzdiagramm zu modellieren.Wenn ich eine benutzerdefinierte Monade für anwendungsspezifische Sequenziersemantik benötigte, dann könnte das ein Stereotyp werden; Das Ziel wäre, zu beschreiben, was die Anwendung in Domain-Begriffen macht.

Der Hauptpunkt ist, dass UML könnte verwendet werden, um ein Programm für die funktionale Implementierung zu modellieren. Sie müssen eine Zuordnung zur Implementierung beachten (und es würde nicht schaden, sie zu dokumentieren), und die Anpassung ist bei weitem nicht exakt. Aber es könnte getan werden, und es könnte sogar einen Mehrwert bringen.

5

Funktionelle Programmierer haben ihre eigene Version von UML, sie heißt Category Theory.

(Es gibt eine gewisse Wahrheit, aber es soll mit einem Hauch von Humor gelesen werden).

+3

Ich weiß, du hast es mit ein bisschen Humor gemacht, aber für den Laien ist das Modellieren nicht nur ... Modellieren. Es geht darum, Komplexität (besonders große Mengen davon) zu verwalten und potenziell große Code-Basen auf verständliche Ebenen zu bringen. Ich bin mir sicher, dass FP'-Programmierer ihre eigenen großen Modelle auf verschiedene Arten erstellen; es wird nur Jahre dauern, bis es formalisiert und standardisiert wird (zum Zweck des Komplexitätsmanagements, nicht der formalen Korrektheit.) –

+0

Das ist wahrscheinlich das Lustigste, was ich seit Monaten gelesen habe. – Darkenor

0

Ich weiß, das ist ein alter Thread, aber ich verstehe das Problem hier nicht.

Eine Klasse ist lediglich eine Abstraktion eines Konzepts, das die Funktionalität seiner Methoden menschlicher zusammenhält. Zum Beispiel könnte die Klasse WaveGenerator die Methoden Sinus, Sägezahn und Quadratwelle enthalten. Alle drei Methoden sind eindeutig auf die Klasse Generator bezogen. Alle drei sind jedoch auch staatenlos. Wenn sie richtig entworfen sind, müssen sie keine Zustandsinformationen außerhalb der Methode speichern. Das macht sie zu staatenlosen Objekten, die - wenn ich sie richtig verstehe - sie zu unveränderlichen Funktionen machen, die ein Kernbegriff im funktionalen Paradigma sind.

Aus konzeptioneller Sicht I = ... keinen Unterschied zwischen

lassen Umschlag Sinus siehe

und

lassen Umschlag Generator.Sine = ...

andere als die Tatsache, dass letztere einen besseren Einblick in den Zweck der Funktion geben könnte.

+3

Objekte sind alle über den Zustand der Kapselung. In der funktionalen Programmierung, wie Sie korrekt feststellen, ist der Zustand kein Problem, da alles unveränderlich sein sollte. Bei der funktionalen Programmierung ist es viel besser, den Zustand von der Funktion zu trennen oder sogar den Zustand auf eine Funktion zu reduzieren. Es ist dieser Unterschied in der Kernphilosophie, dass ist das Problem. In OOP programmieren Sie den Zustand zu verstecken und die Änderungen an veränderbaren Objekten zu lokalisieren, während Sie in FOP den Zustand auf unveränderliche Strukturen reduzieren. – WeNeedAnswers

+0

Ein gutes Beispiel wäre ein Personenobjekt mit dem üblichen Status von Name, Alter, Adresse usw. In FOP wäre dieser Typ unveränderlich, um einen Wert zu ändern, würden Sie diesen in eine Funktion übergeben, wo er eine neue Person erzeugen würde Objekt. In OOP würden Sie Property Setter/Getter verwenden und der Status ist änderbar. – WeNeedAnswers

+0

Möglicherweise war ich nicht klar, als ich meinen Standpunkt darlegte. Der ursprüngliche Thread fragte nach dem Modellieren des funktionalen Programmierstils. Es stimmt zwar, dass OOP auf eine imperative Art der Programmierung ausgelegt ist, es ist jedoch nicht auf imperative Programmierung beschränkt. Eine Klasse, die sich auf statische Methoden beschränkt, entspricht einer Menge gekapselter Funktionen. So wie C keine OOP-Sprache ist, ist es nicht auf einen prozeduralen Stil beschränkt. –

1

Ich denke, Sie könnten eine Klasse namens noclass erstellen und Funktionen als Methoden einfügen. Vielleicht möchten Sie auch noclass in mehrere Kategorien von Funktionen aufteilen.

2

Um ein funktionsfähiges Programm zu modellieren, ein Diagramm verwenden und nicht Textdarstellung, können Sie Notation wie das verwendet, um Programm in Viskell oder Luna

enter image description here