Ich habe in letzter Zeit viel darüber gesprochen, funktionale Sprachen wie Haskell zu verwenden. Was sind einige der großen Unterschiede, Vor- und Nachteile der funktionalen Programmierung gegenüber der objektorientierten Programmierung?
Ich habe in letzter Zeit viel darüber gesprochen, funktionale Sprachen wie Haskell zu verwenden. Was sind einige der großen Unterschiede, Vor- und Nachteile der funktionalen Programmierung gegenüber der objektorientierten Programmierung?
Antworten:
Ich würde sagen , dass es mehr ist Functional Programming vs Imperative Programmierung .
Der größte Unterschied besteht darin, dass es bei der imperativen Programmierung um den Kontrollfluss und bei der funktionalen Programmierung um den Datenfluss geht . Eine andere Art zu sagen ist, dass die funktionale Programmierung nur Ausdrücke verwendet , während bei der imperativen Programmierung sowohl Ausdrücke als auch Anweisungen verwendet werden.
Zum Beispiel sind Variablen und Schleifen in der imperativen Programmierung beim Umgang mit Zuständen üblich, während in der funktionalen Programmierung der Zustand über die Parameterübergabe behandelt wird, wodurch Nebenwirkungen und Zuweisungen vermieden werden.
Imperativer Pseudocode für eine Funktion zur Berechnung der Summe einer Liste (die Summe wird in einer Variablen gespeichert):
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
Funktionaler Pseudocode für dieselbe Funktion (die Summe wird als Parameter übergeben):
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
Ich empfehle den Vortrag Zähmungseffekte mit funktionaler Programmierung von Simon Peyton-Jones, um eine gute Einführung in funktionale Konzepte zu erhalten.
Die funktionale Programmierung basiert auf einem deklarativen Modell und wurzelt in der Lambda-Rechnung. Es bietet viele großartige Konzepte, die aus wichtigeren Sprachen wie C ++ und C # entlehnt werden können.
Einige Beispiele sind referentielle Transparenz, Lambda-Funktionen, erstklassige Funktionen, verzögerte und eifrige Bewertung und Unveränderlichkeit.
Wenn für nichts anderes das Erlernen der funktionalen Programmierung für die darin enthaltenen Konzepte nützlich ist. Es wird die Art und Weise verändern, wie Sie programmieren und über das Programmieren nachdenken. Und ich würde vermuten, dass die funktionale Programmierung in Zukunft genauso wichtig sein wird wie die objektorientierte Programmierung.
Zunächst können Sie eine rein funktionale Sprache wie Haskell oder eine hybride Sprache wie F # verwenden .
Die meisten guten Universitäten decken funktionale Programmierung ab, und wenn Sie zur Schule gehen, würde ich Ihnen dringend empfehlen, diesen Kurs zu belegen.
Was sind einige der großen Unterschiede, Vor- und Nachteile der funktionalen Programmierung gegenüber der objektorientierten Programmierung?
Eine gut objektorientierte Programmierung ist nett, da Sie damit Ihr komplexes Problem in Hierarchien modellieren können, um das Problem zu vereinfachen. Es wird jedoch sehr schwierig, wenn Sie anfangen, Multi-Thread-Programmierung bei der Verwendung veränderlicher Objekte in Betracht zu ziehen. In solchen Fällen müssen Synchronisationsobjekte häufig verwendet werden, und es ist nahezu unmöglich, eine große Anwendung zu perfektionieren.
Hier kommt die funktionale Programmierung ins Spiel. Aufgrund von Unveränderlichkeit vereinfacht die funktionale Programmierung Multithread-Programme wirklich. Es macht es fast trivial einfach, etwas zu parallelisieren, wenn Sie wissen, dass bei einer Eingabe von X für eine Funktion immer Y ausgegeben wird. Außerdem wissen Sie, dass eine Variable (oder ein Wert in der funktionalen Programmierung) während der Verwendung eines anderen Threads nicht geändert werden kann.
(Diese Antwort wird von einer Antwort auf eine geschlossene Frage bei StackOverflow übernommen .)
Einer der großen Unterschiede zwischen funktionaler Programmierung und objektorientierter Programmierung besteht darin, dass jeder einzelne in einer anderen Art der Softwareentwicklung besser ist:
Objektorientierte Sprachen sind gut, wenn Sie eine feste Anzahl von Operationen für Dinge ausführen und wenn sich Ihr Code weiterentwickelt, fügen Sie hauptsächlich neue Dinge hinzu. Dies kann erreicht werden, indem neue Klassen hinzugefügt werden, die vorhandene Methoden implementieren, und die vorhandenen Klassen in Ruhe gelassen werden.
Funktionale Sprachen sind gut, wenn Sie einen festen Satz von Dingen haben und wenn sich Ihr Code weiterentwickelt, fügen Sie in erster Linie neue Operationen für vorhandene Dinge hinzu. Dies kann erreicht werden, indem neue Funktionen hinzugefügt werden, die mit vorhandenen Datentypen rechnen, wobei die vorhandenen Funktionen in Ruhe gelassen werden.
Wenn die Evolution in die falsche Richtung geht, haben Sie Probleme:
Das Hinzufügen einer neuen Operation zu einem objektorientierten Programm erfordert möglicherweise das Bearbeiten vieler Klassendefinitionen, um eine neue Methode hinzuzufügen.
Das Hinzufügen einer neuen Art von Dingen zu einem Funktionsprogramm erfordert möglicherweise das Bearbeiten vieler Funktionsdefinitionen, um einen neuen Fall hinzuzufügen.
Dieses Problem ist seit vielen Jahren bekannt. 1998 nannte Phil Wadler es das "Ausdrucksproblem" . Obwohl einige Forscher der Ansicht sind, dass das Expressionsproblem mit solchen Sprachmerkmalen wie Mixins angegangen werden kann, hat eine allgemein akzeptierte Lösung noch nicht den Mainstream erreicht.
Es gibt keine wirklichen Verse. Sie können sich perfekt ergänzen. Es gibt FP-Sprachen, die OOP unterstützen. Die Communities unterscheiden sich jedoch in der Art und Weise, wie sie mit Modularität umgehen.
Benutzer von FP-Sprachen neigen dazu, Modularität durch mathematische Gesetze zu erreichen. Und bevorzugen Sie Beweise, die die Einhaltung ihrer Gesetze belegen.
In imperativen OOP-Fällen neigen Benutzer dazu, das Verhalten des Objekts in Testfällen zu erfassen, die erneut ausgeführt werden können, wenn sich das Objekt geändert hat, und auf diese Weise Modularität erzielen.
Es ist nur ein kleiner Aspekt, aber ich denke, es ist erwähnenswert.
Eine Analogie:
Sie erhalten eine Bewerbung. Sie geben Ihren Namen, Ihre Kontaktinformationen und Ihren Arbeitsverlauf ein. Wenn Sie fertig sind, haben Sie keine leere Bewerbung mehr.
Stellen Sie sich stattdessen vor, Sie überziehen sie vor dem Schreiben mit einem klaren Blatt Zellophan. Du schreibst deinen Namen. Sie fügen ein weiteres Blatt Zellophan hinzu. Sie schreiben Ihre Kontaktinformationen. Mehr Zellophan. Sie schreiben Ihre Arbeitsgeschichte. Wenn Sie fertig sind, haben Sie noch die leere Anwendung unberührt. Sie haben auch drei Blätter Cellophan, von denen jedes den Effekt einer einzelnen diskreten Änderung erfasst hat.
Ersteres (OOP) befasst sich mit der Idee, Dinge an Ort und Stelle zu ändern, während letzteres (FP) dies meidet. Beides sind Paradigmen des Staatsmanagements. Beide können mit unterschiedlichen Strategien den Effekt des Abschlusses einer Bewerbung erfassen. OOP ändert das Startinstrument direkt, während FP das Vorherige überlagert , um das Erscheinungsbild der Änderung zu beeinflussen .