Gibt es eine Software-Engineering-Methode für die funktionale Programmierung?
Software-Engineering, wie es heute gelehrt konzentriert sich ganz auf das Objekt-orientierte Programmierung und die 'Natürliche' Objekt-orientierte Sicht auf die Welt. Es ist eine detaillierte Methode, die beschreibt, wie die Transformation eines domain model in einem Klasse-Modell mit mehreren Schritten und eine Menge von (UML -) Artefakten wie use-case-Diagramme oder class-Diagramme. Viele Programmierer haben diesen Ansatz verinnerlicht und haben eine gute Vorstellung darüber, wie der Entwurf einer Objekt-orientierten Anwendung von Grund auf neu.
Den neuen hype der funktionalen Programmierung, die gelehrt wird in vielen Büchern und tutorials. Aber was ist mit funktionalen software-engineering?
Beim Lesen über Lisp und Clojure, kam ich über zwei interessante Aussagen:
-
Funktionale Programme werden oft entwickelt, bottom-up statt top-down ("Auf Lisp', Paul Graham)
-
Funktionale Programmierer verwenden Karten, wo OO-Programmierer verwenden Objekte/Klassen ('Clojure für Java-Programmierer', Vortrag von Rich Hickley).
Also, was ist die Methodik für eine systematische (Modell-basiert ?) design eines funktionalen Anwendung, d.h. in Lisp oder Clojure? Was sind die häufigsten Schritte, welche Artefakte kann ich verwenden, wie kann ich die Karte Sie aus dem problem Platz, um die Lösung Raum?
InformationsquelleAutor der Frage Thorsten | 2011-01-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Danke Gott, dass die software-engineering-Menschen haben noch nicht entdeckt, funktionale Programmierung. Hier einige parallelen:
Viele OO "design patterns" erfasst werden, höher -, um-Funktionen. Zum Beispiel das Besucher-Muster ist bekannt in der funktionalen Welt als "Falten" (oder, wenn Sie eine pointy-headed-Theoretiker eine "catamorphism"). In funktionalen Programmiersprachen werden die Datentypen sind meist Bäume oder Tupeln, und jeder Baum hat eine Natürliche catamorphism zugeordnet.
Diese higher-order-Funktionen kommen Häufig mit bestimmten Gesetzen der Programmierung, aka "freier Theoreme".
Funktionale Programmierer verwenden Sie Diagramme, viel weniger stark als OO-Programmierer. Vieles von dem, was ausgedrückt ist in OO-Diagramme ist vielmehr ausgedrückt in Artenoder "Signaturen", die Sie denken sollten als "Modul-Typen". Haskell hat auch "Typ-Klassen", die ein bisschen wie eine Schnittstelle geben.
Funktionale Programmierer, die Typen denken in der Regel, dass "wenn man die Typen Recht; der code praktisch schreibt sich selbst."
Nicht alle funktionale Sprachen verwenden expliziten Typen, sondern die Wie-Design-Programme Buch, ein hervorragendes Buch zum lernen Scheme/Lisp/Clojure, stützt sich stark auf "Daten-Beschreibungen", die eng mit dem Typen.
Jede design-Methode basiert auf der Abstraktion der Daten funktioniert gut. Ich bin zufällig zu denken, dass dies ist leichter, wenn die Sprache expliziten Typen, aber es funktioniert auch ohne. Ein gutes Buch über design-Methoden für abstrakte Daten-Typen, die leicht angepasst werden, um die funktionale Programmierung, ist Abstraktion und Konkretisierung in der Programmentwicklung von Barbara Liskov und John Guttag, die ersten edition. Liskov gewann den Turing-award Teil für diese Arbeit.
Einem anderen design-Methodik, die einzigartig für Lisp ist zu entscheiden, welche Sprache extensions wäre nützlich, in der problem-Domäne, in der Sie arbeiten, und verwenden Sie dann hygienische Makros, zu add diese Konstrukte auf Ihre Sprache. Ein guter Ort, um zu Lesen über diese Art von design ist Matthew Flatt Artikel Erstellen von Sprachen-Schläger. Der Artikel hinter einer paywall. Sie können auch finden, mehr Allgemeines material auf diese Art der Gestaltung durch die Suche nach dem Begriff "domain-specific embedded language"; für Besondere Ratschläge und Beispiele über das hinaus, was Matthew Flatt deckt, würde ich wahrscheinlich beginnen mit Graham Lisp oder vielleicht ANSI Common Lisp.
Gemeinsame Schritte:
Identifizieren Sie die Daten in Ihrem Programm, und die Operationen auf Sie, und definieren Sie einen abstrakten Datentyp für diese Daten.
Gemeinsame Aktionen oder Muster der Berechnung, und Sie auszudrücken als höherwertige Funktionen oder Makros. Erwarten, dass dieser Schritt als Teil der Umgestaltung.
Wenn Sie eine typisierte, funktionale Sprache, die die type-checker früh und Häufig. Wenn Sie mit Lisp oder Clojure, ist die beste Methode zu schreiben, die Funktion von Verträgen ersten unit-tests—es ist test-driven development, um die max. Und Sie wollen, zu verwenden, was version der QuickCheck wurde portiert, um Ihre Plattform, die in Ihrem Fall aussieht, wie es heißt ClojureCheck. Es ist eine extrem leistungsfähige Bibliothek für das konstruieren von zufälligen tests von code mithilfe von höherer Ordnung Funktionen.
InformationsquelleAutor der Antwort Norman Ramsey
Für Clojure, ich empfehlen, geht zurück zur guten alten relationalen Modellierung. Out of the Tarpit ist ein inspirierendes Lesen.
InformationsquelleAutor der Antwort cgrand
Persönlich finde ich, dass all die üblichen guten Praktiken von OO-Entwicklung gelten in der funktionalen Programmierung als auch - nur mit ein paar kleinere Anpassungen zur Berücksichtigung der funktionalen Weltsicht. Aus einer Methodik, die Perspektive, die Sie nicht wirklich brauchen zu tun nichts grundlegend anders.
Meiner Erfahrung kommt nach dem Umzug von Java in Clojure in den letzten Jahren.
Einige Beispiele:
Verstehen Ihr Geschäft domain - /Datenmodell - gleichermaßen wichtig, ob Sie gehen, um design-Objekt-Modell, oder erstellen Sie eine funktionale Datenstruktur mit verschachtelten maps. In gewisser Weise, FP einfacher sein kann, weil es fordert Sie dazu auf, nachzudenken über das Datenmodell getrennt von Funktionen /Prozesse, aber Sie haben noch zu tun beide.
Service-Orientierung im design - funktioniert eigentlich sehr gut aus FP-Sicht, da ein typischer service ist wirklich nur eine Funktion, mit einige Nebenwirkungen. Ich denke, dass die "bottom up" - Ansicht der software-Entwicklung manchmal verlobt in der Lisp-Welt ist eigentlich nur guter service-orientierte API-design-Prinzipien in einem anderen Gewand.
Test Driven Development - funktioniert auch in den FP Sprachen, die in der Tat manchmal sogar besser, da Reine Funktionen eignen sich besonders gut zum schreiben klare, wiederholbare tests ohne die Notwendigkeit für die Einrichtung einer stateful-Umgebung. Vielleicht wollen Sie auch zu bauen, eigene tests um die Datenintegrität zu überprüfen (z.B. funktioniert diese Karte haben Sie alle Schlüssel in der es, dass ich erwarten, um die balance der Tatsache, dass in einer OO-Sprache die definition der Klasse durchsetzen würde, dies für Sie zur compile-Zeit).
Prototyping /iteration - funktioniert genauso gut mit FP. Man könnte sogar in der Lage, Prototyp-live mit Benutzer, wenn Sie sehr extrem gut in der Gebäude-tools /DSL und mit Ihnen auf die REPL.
InformationsquelleAutor der Antwort mikera
OO-Programmierung fest Paare Daten mit Verhalten. Funktionale Programmierung trennt die beiden. So dass Sie nicht haben Klassendiagramme, aber Sie haben Daten, Strukturen, und Sie haben insbesondere algebraische Datentypen. Diese Arten geschrieben werden können, sehr eng passend zu Ihrer domain, einschließlich der Eliminierung unmöglich Werte werden durch den Bau.
So gibt es nicht Bücher und Bücher über es, aber es ist ein gut etablierter Ansatz, wie das Sprichwort sagt, unmöglich machen, eigentlich nicht Darstellbare Werte.
Damit können Sie eine Reihe von Entscheidungen über die Vertretung bestimmter Arten von Daten als Funktionen statt, und Umgekehrt, repräsentieren bestimmte Funktionen als eine union von Datentypen statt, so dass Sie bekommen können, z.B.-Serialisierung, strengere Spezifikation, Optimierung, etc.
Dann, da schreiben Sie Funktionen, die über Ihre adts, so dass Sie eine gewisse algebra -- D. H. es gibt Feste Rechtsvorschriften, die für diese Funktionen. Einige sind vielleicht idempotent -- das gleiche nach mehreren Anwendungen. Einige sind assoziativ. Einige sind transitiv, etc.
Jetzt haben Sie eine domain, über die Sie die Funktionen, die das Komponieren nach gut benommen Gesetze. Eine einfache embedded-DSL!
Oh, und bestimmten Eigenschaften, können Sie natürlich schreiben von automatisierten randomisierten tests (ala QuickCheck).. und das ist nur der Anfang.
InformationsquelleAutor der Antwort sclv
Object-Oriented design ist nicht das gleiche wie software-engineering. Software-engineering zu tun hat, mit den gesamten Prozess der, wie wir gehen, von den Anforderungen zu einem system arbeiten, auf Zeit und mit einer niedrigen Fehlerrate. Funktionale Programmierung unterscheidet sich möglicherweise von OO, aber es nicht tun, Weg mit Anforderungen, high-level und detailliertem Design, Verifikation und Test, software-Metriken, die Einschätzung und der aller anderen "software-engineering-Stoff".
Darüber hinaus sind funktionale Programme zeigen, Modularität und andere Struktur. Ihre detaillierten Ausführungen zum Ausdruck gebracht in Bezug auf die Begriffe in der Struktur.
InformationsquelleAutor der Antwort Kaz
Siehe meine Antwort zu einem anderen Beitrag:
Wie funktioniert Clojure Leitbild Trennung von Belangen?
Ich Zustimmen muss schriftlich über das Thema " wie strukturiert man große Anwendungen, die eine FP-Ansatz (Plus mehr getan werden muss, um zu dokumentieren, FP-driven UIs)
InformationsquelleAutor der Antwort drcode
Ein Ansatz ist die Erstellung einer internen DSL in der funktionalen Programmiersprache der Wahl. Das "Modell" dann ist ein set an Geschäftsregeln, ausgedrückt in der DSL.
InformationsquelleAutor der Antwort James Kingsbery
Während dies vielleicht als naiv und simpel, denke ich, dass "design-Rezepte" (ein systematischer Ansatz zur Problemlösung angewendet, um zu Programmieren, wie dies von Felleisen et al. in Ihrem Buch HtDP) wäre nahe an dem, was Sie zu sein scheinen suchen.
Hier ein paar links:
http://www.northeastern.edu/magazine/0301/programming.html
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.86.8371
InformationsquelleAutor der Antwort Artyom Shalkhakov
Ehrlich gesagt, wenn Sie wollen design Rezepte für funktionale Programme, nehmen Sie einen Blick auf die standard-Funktion von Bibliotheken wie der Haskell - Prelude. In FP, Muster sind in der Regel erfasst von höherer Ordnung-Prozeduren (Funktionen, die auf Funktionen) selbst. Also, wenn Sie ein Muster zu sehen ist, oft eine höhere Ordnung, die Funktion ist lediglich erstellt, um zu erfassen, dass Muster.
Ein gutes Beispiel ist fmap. Diese Funktion nimmt eine Funktion als argument und wendet Sie auf alle "Elemente" das zweite argument. Da es Teil des Funktors Typ-Klasse, jede Instanz von Functor (wie eine Liste, graph, etc...) kann übergeben werden, wie eine zweite argument an diese Funktion. Es erfasst das Allgemeine Verhalten der Anwendung einer Funktion auf jedes element des zweiten Arguments.
InformationsquelleAutor der Antwort nightski
Es ist das "Programm Berechnung" /"design durch Berechnung" - Stil mit Prof. Richard Vogel und der Algebra of Programming group an der Oxford University (UK), ich glaube nicht, dass es zu weit hergeholt, dies zu berücksichtigen, wird eine Methodik.
Persönlich, während ich wie die Arbeit produziert von der AoP-Gruppe, habe ich nicht die Disziplin zu Praxis-design in dieser Art und Weise selber. Aber das ist mein Manko, und nicht ein Programm die Berechnung.
InformationsquelleAutor der Antwort stephen tetley
Ich gefunden habe, Behavior Driven Development werden eine Natürliche Ergänzung für die schnelle Entwicklung von code in beiden Clojure und SBCL. Der wirkliche Kopf der Nutzung von BDD mit einer funktionalen Sprache ist, dass ich dazu Neige viel zu schreiben feinere Körnung unit-tests, als ich das normalerweise bei der Verwendung von prozeduralen Sprachen, weil ich einen viel besseren job der ZERLEGUNG des Problems in kleinere Stücke von Funktionalität.
InformationsquelleAutor der Antwort Marc
Hab ich vor kurzem gefunden in diesem Buch:
Funktionale und Reaktive Domain Modeling
Ich denke, ist perfekt im Einklang mit Ihrer Frage.
Aus der Buch-Beschreibung:
InformationsquelleAutor der Antwort elviejo79
Gut,
In der Regel in vielen Funktionalen Programmiersprachen werden an den Universitäten für eine lange Zeit für "kleine Spielzeug-Probleme".
Sind Sie immer beliebter jetzt da OOP hat Schwierigkeiten mit "parallel programming", weil der "Staat".Und irgendwann funktionalen Stil ist besser für das problem zur hand wie Google MapReduce.
Ich bin sicher, dass, wenn functioanl Jungs die Wand schlagen [ versuchen zu implementieren Systeme, die größer als 1.000.000 Zeilen code], einige von Ihnen kommen mit der neuen software-engineering-Methoden mit Schlagworten :-). Sie sollte auch die Antwort auf die alte Frage: Wie aufteilen system in Stücke, so dass wir "beißen" jedes Stück ein zu einer Zeit? [ arbeiten iterativ, inceremental en evolutionäre Weise] mit Funktionalen Stil.
Aber funktionale Programme verwendet werden, die für solche großen Systeme?Sie werden in den main-stream? Das ist die Frage.
Und Niemand kann kommen mit realistischen Methodik ohne Durchführung eines so großen systems, so dass seine Hände dreckig zu machen.
Zuerst sollten Sie Ihre Hände schmutzig, dann schlage Lösung. Lösungen-Vorschläge ohne "echte Schmerzen und Schmutz" "fantasy".
InformationsquelleAutor der Antwort Hippias Minor