2008-11-13 9 views
5

Im objektorientierten Paradigma würde ich ein Objekt/konzeptionelles Modell erstellen, bevor ich es mit der OO-Sprache implementieren würde.Gibt es etwas wie ein funktionales Modell?

Gibt es in der funktionalen Programmierung etwas Paralleles zum Objektmodell? Wird es Funktionsmodell genannt? oder wir erstellen das gleiche konzeptionelle Modell in beiden Paradigmen vor der Implementierung in einer der Sprache.

Gibt es Artikel/Bücher, wo ich über das Funktionsmodell lesen kann, falls es existiert?

oder um es anders auszudrücken ... würden wir, wenn wir eine funktionale Programmiersprache verwenden, mit dem Objektmodell beginnen?

Antwort

0

Ein Flussdiagramm und/oder Prozessmodell/-diagramm kann als funktionales Modell für Nicht-OO-Programme verwendet werden. Aber es gibt immer noch nicht das Gefühl von Grenzen ähnlich dem des OO-Modells.

http://en.wikipedia.org/wiki/Functional_model

6

In der Tat ist es. Es gibt eine Form der Spezifikation für funktionale Sprachen, die auf abstrakten Datentypen basiert, die als algebraische Spezifikation bezeichnet werden. Ihr Verhalten ist dem von Objekten in mancher Hinsicht sehr ähnlich, die Konstrukte sind jedoch logisch und mathematisch und sind wie funktionale Konstrukte unveränderlich.

Eine spezielle funktionale Spezifikationssprache, die in der Klasse Algorithmen und Datenstrukturen der Universität von Buenos Aires verwendet wird, hat Generatoren, Beobachter und zusätzliche Operationen. Ein Generator ist ein Ausdruck, der sowohl eine Instanz als auch eine mögliche Zusammensetzung des Datentyps ist. Zum Beispiel haben wir für einen Binärbaum (ADT bt) null Knoten und binäre Knoten. So würden wir die Generatoren haben:

-nil 
-bin(left:bt, root: a, right:bt) 

Wo links eine Instanz eines bt ist, ist die Wurzel ein allgemeiner Wert, und rechts ist ein weiterer bt. Also, nil ist eine gültige Form eines bt, aber bin (bin (nil, 1, nil), 2, nil) ist auch gültig und repräsentiert einen binären Baum mit einem Wurzelknoten mit einem Wert von 2, einem linken Kindknoten mit einem Wert von 1 und einem Null-Kind rechts Knoten.

Also für eine Funktion, die sagen, berechnet die Anzahl der Knoten in einem Baum, definieren Sie einen Beobachter der ADT, und Sie definieren eine Reihe von Axiomen, die zu jedem Generator zuordnen. So , zum Beispiel:

numberOfNodes(nil) == 0 
numberOfNodes(bin(left,x,right))== 1 + numberOfNodes(left) + numberOfNodes(right) 

Dies hat den Vorteil der Verwendung von rekursiven Definitionen von Operationen und hat die mehr formal interessante Eigenschaft, dass Sie etwas genannt strukturelle Induktion verwenden kann, um nachzuweisen, dass Ihre Angabe korrekt ist (ja, Sie demonstrieren, dass Ihr Algorithmus das richtige Ergebnis liefert).

Dies ist ein ziemlich akademisches Thema, das selten außerhalb von akademischen Kreisen zu sehen ist, aber es lohnt sich, einen Einblick in das Programmdesign zu bekommen, das Ihre Denkweise über Algorithmen und Datenstrukturen verändern kann. Die richtige Bibliographie umfasst:

Bernot, G., Bidoit, M., und Knapik, T. 1995. Beobachtungs Spezifikationen und die Ununterscheidbarkeit Annahme. Theor. Comput. Sci. 139, 1-2 (Mar. 1995), 275-314. DOI = http://dx.doi.org/10.1016/0304-3975(94)00017-D

Guttag, J.V. und Horning, J.J. 1993. Lärche: Sprachen und Werkzeuge für Formal Spezifikation. Springer-Verlag New York, Inc. Abstraktion und Spezifikation in der Softwareentwicklung, Barbara Liskov y John Guttag, MIT Press, 1986.

Grundlagen der algebraischen Spezifikation 1. Gleichungen und Anfangs Semantics. H. Ehrig y B. Mahr Springer-Verlag, Berlin, Heidelberg, New York, Tokio, Deutschland, 1985.

mit entsprechenden Links: http://www.cs.st-andrews.ac.uk/~ifs/Resources/Notes/FormalSpec/AlgebraicSpec.pdf http://nms.lcs.mit.edu/larch/pub/larchBook.ps

Es ist ein Heck eines interessanten Thema.

+1

Wenn Sie in der Programmierung sind mit rekursiven Datentypen, werfen Sie einen Blick auf die Arbeit "Funktionale Programmierung mit Bananen, Linsen, Umschlägen und Stacheldraht" [1]. Es ist sehr interessant und hat mich sehr berührt. [1]: = http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.125 – Tetha

1

In OO- und FP-Paradigmen bilden Sie Ihr Domänenmodell (das Problem, das Sie lösen) und erstellen dann Objekte in Ihrem Programm, um die Domänenobjekte zu spiegeln. Es gibt einige Unterschiede darin, dass die Programmobjekte, die die Domänenobjekte spiegeln, von dem Paradigma und der Sprache, die Sie verwenden, beeinflusst werden. Einige Beispiele (in Haskell):