it-swarm.com.de

Funktionale Programmierung vs. objektorientierte Programmierung

Bisher habe ich mich hauptsächlich mit OO Programmierung beschäftigt und freue mich darauf, eine funktionierende Sprache zu lernen. Meine Fragen sind:

  • Wann wählen Sie die funktionale Programmierung gegenüber der objektorientierten?
  • Was sind die typischen Problemdefinitionen, bei denen funktionale Programmierung die bessere Wahl ist?
748
Olivier Lalonde

Wann wählen Sie die funktionale Programmierung gegenüber der objektorientierten?

Wenn Sie eine andere Art von Softwareentwicklung erwarten:

  • Objektorientierte Sprachen sind gut, wenn Sie eine feste Menge von Operationen auf Dingen 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 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 hauptsächlich neue hinzu. Operationen an bestehenden Dingen. 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. im Jahr 1998 Phil Wadler nannte es das "Ausdrucksproblem" . Obwohl einige Forscher der Ansicht sind, dass das Expressionsproblem mit Sprachmerkmalen wie Mixins angegangen werden kann, hat eine allgemein akzeptierte Lösung noch keinen Einzug in den Mainstream gehalten.

Was sind die typischen Problemdefinitionen, bei denen funktionale Programmierung die bessere Wahl ist?

Funktionssprachen Excel bei der Bearbeitung symbolischer Daten in Baumform. Ein beliebtes Beispiel sind Compiler, bei denen sich Quell- und Zwischensprachen selten ändern (meistens die gleichen Dinge ), Compiler-Autoren jedoch immer neue Übersetzungen und Code-Verbesserungen hinzufügen oder Optimierungen (neue Operationen an Dingen). Zusammenstellung und Übersetzung sind im Allgemeinen "Killer-Apps" für funktionale Sprachen.

1153
Norman Ramsey

Sie müssen nicht unbedingt zwischen den beiden Paradigmen wählen. Sie können Software mit einer OO Architektur unter Verwendung vieler Funktionskonzepte schreiben. FP und OOP sind orthogonal .

Nehmen Sie zum Beispiel C #. Man könnte sagen, es ist meistens OOP, aber es gibt viele FP Konzepte und Konstrukte. Wenn Sie Linq berücksichtigen, sind die wichtigsten Konstrukte, die das Vorhandensein von Linq ermöglichen, funktionaler Natur: Lambda-Ausdrücke .

Ein weiteres Beispiel, F #. Man könnte sagen, dass es sich hauptsächlich um FP handelt, aber es sind viele OOP Konzepte und Konstrukte verfügbar. Sie können Klassen, abstrakte Klassen, Schnittstellen definieren und sich mit der Vererbung befassen. Sie können sogar die Wandlungsfähigkeit verwenden, wenn der Code klarer wird oder die Leistung dramatisch gesteigert wird.

Viele moderne Sprachen sind ein Multiparadigma.

Empfohlene Lektüre

Da ich im selben Boot bin (OOP-Hintergrund, FP lernen), schlage ich Ihnen einige Lesungen vor, die ich sehr geschätzt habe:

169
Bruno Reis

Objektorientierte Programmierung bietet:

  1. Verkapselung zu
    • kontrollmutation des inneren Zustands
    • begrenzung der Kopplung auf interne Repräsentation
  2. Subtypisierung, die Folgendes ermöglicht:
    • substitution kompatibler Typen (Polymorphismus)
    • ein grobes Mittel, um die Implementierung zwischen Klassen zu teilen (Implementierungsvererbung)

Funktionale Programmierung in Haskell oder sogar in Scala kann die Substitution durch allgemeinere Mechanismen von Typklassen ermöglichen. Der veränderbare interne Zustand wird entweder entmutigt oder ist verboten. Es kann auch eine Kapselung der inneren Repräsentation erreicht werden. Siehe Haskell vs OOP für einen guten Vergleich.

Normans Behauptung: "Das Hinzufügen einer neuen Art von Dingen zu einem Funktionsprogramm erfordert möglicherweise das Bearbeiten vieler Funktionsdefinitionen, um einen neuen Fall hinzuzufügen." hängt davon ab, wie gut der Funktionscode Typklassen verwendet hat. Wenn die Mustererkennung für einen bestimmten abstrakten Datentyp über eine Codebasis verteilt ist, tritt dieses Problem zwar auf, es handelt sich jedoch möglicherweise um ein schlechtes Design.

GEÄNDERT Der Verweis auf implizite Konvertierungen bei der Erörterung von Typklassen wurde entfernt. In Scala werden Typklassen mit impliziten Parametern codiert, nicht mit Konvertierungen, obwohl implizite Konvertierungen ein weiteres Mittel sind, um die Ersetzung kompatibler Typen zu erreichen.

31
retronym
  1. Wenn Sie sich in einer stark parallelen Umgebung befinden, ist reine Funktionsprogrammierung hilfreich. Das Fehlen eines veränderlichen Zustands macht die Nebenläufigkeit fast trivial. Siehe Erlang.

  2. In einer Multiparadigmasprache möchten Sie möglicherweise einige Dinge funktional modellieren, wenn das Vorhandensein eines veränderlichen Zustands ein Implementierungsdetail sein muss, und daher ist FP ein gutes Modell für die Problemdomäne. Siehe zum Beispiel Listenverständnisse in Python oder std.range in der Programmiersprache D. Diese sind von der funktionalen Programmierung inspiriert.

24
dsimcha