it-swarm-eu.dev

Funktionale Programmierung vs. OOP

Ich habe in letzter Zeit viel über die Verwendung funktionaler Sprachen wie Haskell gesprochen. Was sind einige der großen Unterschiede, Vor- und Nachteile der funktionalen Programmierung gegenüber der objektorientierten Programmierung?

95
GSto

Ich würde sagen, dass es mehr ist Funktionale Programmierung vs Imperative Programmierung .

Der größte Unterschied besteht darin, dass es bei der imperativen Programmierung um Kontrollfluss geht, während es bei der funktionalen Programmierung um Datenfluss geht. Eine andere Art zu sagen ist, dass die funktionale Programmierung nur Ausdrücke verwendet, während in der imperativen Programmierung sowohl Ausdrücke als auch Anweisungen verwendet werden.

Zum Beispiel sind in imperative Programmiervariablen und Schleifen beim Behandeln des Zustands üblich, während in funktionalen Programmieren der Zustand über die Parameterübergabe behandelt wird , wodurch Nebenwirkungen und Zuordnungen 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 die Präsentation Zähmen von Effekten mit funktionaler Programmierung von Simon Peyton-Jones für eine gute Einführung in funktionale Konzepte.

69
Jonas

Die funktionale Programmierung basiert auf einem deklarativen Modell und hat ihre Wurzeln 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 referenzielle Transparenz, Lambda-Funktionen, erstklassige Funktionen, faule und eifrige Bewertung und Unveränderlichkeit.

Nicht zuletzt ist das Erlernen der funktionalen Programmierung für die darin enthaltenen Konzepte hilfreich. Es wird die Art und Weise ändern, wie Sie programmieren und über das Programmieren nachdenken. Und ich würde vermuten, dass funktionale Programmierung in Zukunft genauso wichtig sein wird wie objektorientierte Programmierung.

Zu Beginn können Sie eine reine Funktionssprache wie Haskell oder eine Hybridsprache wie F # verwenden.

Die meisten guten Universitäten werden sich mit funktionaler Programmierung befassen, 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 hilfreich, da Sie damit Ihr komplexes Problem in Hierarchien modellieren können, um das Problem zu vereinfachen. Es wird jedoch sehr schwierig, wenn Sie anfangen, Multithread-Programmierung in Betracht zu ziehen, während Sie veränderbare Objekte verwenden. In solchen Fällen müssen Sie häufig Synchronisationsobjekte verwenden, 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 wirklich Multithread-Programme. Es macht es fast trivial einfach, etwas zu parallelisieren, wenn Sie wissen, dass bei gegebener Eingabe X für eine Funktion immer Y ausgegeben wird. Außerdem wissen Sie, dass eine Variable (oder ein Wert in der funktionalen Programmierung) die Verwendung eines anderen Threads während der Verwendung nicht ändern kann.

16
Brian R. Bondy

(Diese Antwort wurde von einem Antwort auf eine geschlossene Frage bei StackOverflow angepasst.)

Einer der großen Unterschiede zwischen funktionaler Programmierung und objektorientierter Programmierung besteht darin, dass jeder eine andere Art der Softwareentwicklung besser beherrscht:

  • Objektorientierte Sprachen sind gut, wenn Sie einen festen Satz von Operationen für Dinge haben. -) und während 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 werden in Ruhe gelassen.

  • Funktionale Sprachen sind gut, wenn Sie einen festen Satz von Dingen haben und wenn sich Ihr Code weiterentwickelt, fügen Sie hauptsächlich neue hinzu. Operationen an vorhandenen Dingen. Dies kann erreicht werden, indem neue Funktionen hinzugefügt werden, die mit vorhandenen Datentypen rechnen, und die vorhandenen Funktionen werden in Ruhe gelassen.

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 Phil Wadler nannte es das "Ausdrucksproblem" . Obwohl einige Forscher der Meinung sind, dass das Ausdrucksproblem mit Sprachmerkmalen wie Mixins angegangen werden kann, muss eine allgemein akzeptierte Lösung erst noch den Mainstream erreichen.

10
Norman Ramsey

Es gibt keinen wirklichen Versus. Sie können sich perfekt ergänzen. Es gibt FP Sprachen, die OOP unterstützen. Die Communitys unterscheiden sich jedoch in der Art und Weise, wie sie mit Modularität umgehen.

Benutzer von FP Sprachen) erreichen Modularität in der Regel durch mathematische Gesetze. Sie bevorzugen Beweise, um die Einhaltung ihrer Gesetze zu belegen.

Im Imperativ OOP) neigen Benutzer dazu, das Verhalten des Objekts in Testfällen zu erfassen. Dies kann wiederholt werden, wenn sich das Objekt geändert hat, und auf diese Weise Modularität erreichen.

Es ist nur ein kleiner Aspekt, aber ich denke, es ist erwähnenswert.

5
Edgar Klerks

Eine Analogie:

Sie erhalten eine Bewerbung. Sie geben Ihren Namen, Ihre Kontaktinformationen und Ihre Arbeitshistorie ein. Wenn Sie fertig sind, haben Sie keine leere Bewerbung mehr.

Stellen Sie sich stattdessen vor, Sie überlagern es vor dem Schreiben mit einer klaren Schicht Zellophan. Du schreibst deinen Namen. Sie fügen ein weiteres Blatt Cellophan hinzu. Sie schreiben Ihre Kontaktinformationen. Mehr Cellophan. Sie schreiben Ihre Arbeitshistorie. Wenn Sie fertig sind, bleibt die leere Bewerbung unberührt. Sie haben auch drei Zellophanblätter, die jeweils den Effekt einer einzelnen, diskreten Änderung erfasst haben.

Ersteres (OOP) befasst sich mit der Idee, Dinge an Ort und Stelle zu ändern, während letzteres (FP) sie meidet. Beides sind Paradigmen des Staatsmanagements. Beide können mit unterschiedlichen Strategien den Effekt des Ausfüllens einer Bewerbung erfassen. OOP ändert das Startinstrument direkt, während FP überlagert das Vorherige m das Auftreten von Änderungen zu bewirken .

2
Mario T. Lanza