Da sich die Maschinensprache (z. B. 0110101000110101
) in der Regel zu höheren Abstraktionsformen entwickelt hat, ist es im Allgemeinen einfacher, den Code zu verstehen, wenn er auf ein Problem angewendet wird. Assembler war eine Abstraktion über Maschinencode, C war eine Abstraktion über Assembler usw.
Objektorientiertes Design scheint sehr gut darin zu sein, ein Problem in Bezug auf Objekte zu modellieren, z. B. kann das Problem eines Universitätslehrgangs mit einer Course
Klasse, einer Student
Klasse usw. modelliert werden . Dann, wenn wir die Lösung schreiben In einer OO-Sprache haben wir ähnliche Klassen, die Verantwortlichkeiten haben und die im Allgemeinen für das Design hilfreich sind, insbesondere für die Modularisierung des Codes. Wenn ich dieses Problem 10 unabhängigen Teams gebe, die es mit einer OO-Methode lösen, haben die 10 Lösungen im Allgemeinen die Klassen gemeinsam, die sich auf das Problem beziehen. Es kann viele Unterschiede geben, wenn Sie anfangen, sich mit der Kopplung und Interaktion dieser Klassen zu befassen, also gibt es keine "Null-Repräsentationslücke".
Meine Erfahrung mit funktionaler Programmierung ist sehr begrenzt (keine reale Verwendung, nur Hello World-Programme). Ich verstehe nicht, wie solche Sprachen es ermöglichen, FP-Lösungen auf einfache Weise auf Probleme (mit einer geringen Repräsentationslücke) abzubilden, wie dies bei OO-Sprachen der Fall ist.
Ich verstehe die Vorteile von FP in Bezug auf die gleichzeitige Programmierung. Aber fehlt mir etwas oder geht es in FP nicht darum, eine Repräsentationslücke zu schließen (um das Verständnis von Lösungen zu erleichtern)?
Eine andere Möglichkeit, dies zu fragen: Würde der FP-Code von 10 verschiedenen Teams, die dasselbe Problem in der realen Welt lösen, viel gemeinsam haben?
Aus Wikipedia über Abstraktion (Informatik) (Schwerpunkt Mine):
Funktionale Programmiersprachen weisen üblicherweise Abstraktionen auf, die sich auf Funktionen beziehen , wie Lambda-Abstraktionen (Verwandeln eines Begriffs in eine Funktion einer Variablen), Funktionen höherer Ordnung (Parameter sind Funktionen), Klammer-Abstraktion (Verwandeln eines Begriffs in eine Funktion einer Variablen).
Die Repräsentationslücke könnte potenziell vergrößert werden, da [einige] Probleme der realen Welt mit solchen Abstraktionen nicht einfach modelliert werden können.
Eine andere Möglichkeit, die Abnahme der Repräsentationslücke zu erkennen, besteht darin, die Lösungselemente auf das Problem zurückzuführen. Das 0
s und 1
s im Maschinencode ist sehr schwer zurückzuverfolgen, wohingegen die Student
Klasse leicht zurückzuverfolgen ist. Nicht alle OO-Klassen lassen sich leicht auf den Problembereich zurückführen, aber viele tun dies.
Müssen FP-Abstraktionen nicht immer erklärt werden, um herauszufinden, welchen Teil des Problemraums sie lösen (abgesehen von mathematischen Problemen)?OK - ich bin gut in diesem Teil. Wenn ich mir viele weitere Beispiele anschaue, sehe ich, wie deutlich die FP-Abstraktionen für Teile des Problems sind, die in der Datenverarbeitung zum Ausdruck kommen.
Die akzeptierte Antwort auf eine verwandte Frage Kann UML zur Modellierung eines Funktionsprogramms verwendet werden? - sagt "Funktionale Programmierer haben nicht viel mit Diagrammen zu tun." Es ist mir wirklich egal, ob es sich um UML handelt, aber ich frage mich, ob FP-Abstraktionen einfach zu verstehen / zu kommunizieren sind, wenn es keine weit verbreiteten Diagramme gibt (vorausgesetzt, diese Antwort ist richtig). Auch hier ist mein Kenntnisstand in Bezug auf die Verwendung / das Verständnis von FP trivial, sodass ich keine Diagramme für einfache FP-Programme benötige.
OO-Design verfügt über Abstraktionsebenen für Funktionen / Klassen / Pakete mit jeweils einer Kapselung (Zugriffskontrolle, Ausblenden von Informationen), wodurch die Verwaltung der Komplexität vereinfacht wird. Dies sind Elemente, die den Übergang vom Problem zur Lösung und zurück erleichtern.
Viele Antworten sprechen davon, wie Analyse und Design in FP auf eine Art und Weise analog zu OO durchgeführt werden, aber bis jetzt hat noch niemand etwas Hochrangiges angeführt (Paul hat einige interessante Dinge angeführt, aber es ist niedrigrangig). Ich habe gestern viel gegoogelt und interessante Diskussionen gefunden. Das Folgende ist aus Refactoring Functional Programs von Simon Thompson (2004) (Schwerpunkt Mine)
Beim Entwurf eines objektorientierten Systems wird vorausgesetzt, dass der Entwurf der Programmierung vorausgeht. Entwürfe werden mit einem System wie UML geschrieben, das in Tools wie Eclipse unterstützt wird. Anfänger können einen visuellen Entwurfsansatz mit Systemen wie BlueJ erlernen. Über die Arbeit an einer ähnlichen Methodik für die funktionale Programmierung wird in FAD: Functional Analysis and Design berichtet , es gibt jedoch nur wenige andere Arbeiten. Dafür kann es eine Reihe von Gründen geben.
Bestehende Funktionsprogramme sind von einer Größe, die kein Design erfordert. Viele Funktionsprogramme sind klein, aber andere, wie der Glasgow Haskell Compiler, sind umfangreich.
Funktionsprogramme modellieren direkt die Anwendungsdomäne und machen so das Design irrelevant. Während funktionale Sprachen eine Vielzahl leistungsfähiger Abstraktionen bieten, ist es schwierig zu behaupten, dass diese alle und nur die zur Modellierung der realen Welt erforderlichen Abstraktionen bereitstellen.
Funktionsprogramme werden als eine sich entwickelnde Reihe von Prototypen erstellt.
In der oben zitierten Dissertation werden die Vorteile des Einsatzes von Analyse- und Entwurfsmethoden (ADM) unabhängig von Paradigmen skizziert. Es wird jedoch argumentiert, dass ADMs mit dem Implementierungsparadigma in Einklang gebracht werden sollten. Das heißt, OOADM eignet sich am besten für die OO-Programmierung und lässt sich nicht gut auf ein anderes Paradigma wie FP anwenden. Hier ist ein großartiges Zitat, das meiner Meinung nach die so genannte Repräsentationslücke umschreibt:
Man kann sich ausführlich darüber streiten, welches Paradigma die beste Unterstützung für die Softwareentwicklung bietet, aber man erreicht das natürlichste, effizienteste und effektivste Entwicklungspaket, wenn man innerhalb eines einzigen Paradigmas von der Problembeschreibung bis zur Implementierung und Bereitstellung bleibt.
Hier sind die von FAD vorgeschlagenen Diagramme:
- Funktionsabhängigkeitsdiagramme, die eine Funktion mit denen darstellen, die sie in ihrer Implementierung verwendet;
- Typabhängigkeitsdiagramm, das den gleichen Dienst für Typen bereitstellt; und,
- Modulabhängigkeitsdiagramme, die Ansichten der Modularchitektur des Systems darstellen.
In Abschnitt 5.1 der FAD-Arbeit gibt es eine Fallstudie, die ein System zur Automatisierung der Datenerfassung für eine Fußballliga darstellt. Die Anforderungen sind zu 100% funktional, z. B. Eingabe von Fußballergebnissen, Erstellung von Ranglisten, Wertungslisten, Anwesenheitstabellen, Übertragung von Spielern zwischen Mannschaften, Aktualisierung von Daten nach neuen Ergebnissen usw. Es wird nicht erwähnt, wie FAD bei der Lösung nichtfunktionaler Anforderungen vorgeht Abgesehen von der Feststellung, dass "neue Funktionalität zu minimalen Kosten erlaubt sein sollte", was praktisch unmöglich zu testen ist.
Abgesehen von FAD sehe ich leider keine modernen Referenzen für Modellierungssprachen (visuell), die für FP vorgeschlagen werden. UML ist ein anderes Paradigma, deshalb sollten wir das vergessen.