Frage

Ich habe bisher zu OO-Programmierung in erster Linie ausgesetzt und freue mich auf eine funktionale Sprache zu lernen. Meine Fragen sind:

  • Wenn Sie sich entscheiden funktionale Programmierung über objektorientiert?
  • Was sind die typischen Problemstellungen, wo funktionale Programmierung eine bessere Wahl ist?
War es hilfreich?

Lösung

  

Wenn Sie sich entscheiden funktionale Programmierung über objektorientierte?

Wenn Sie eine andere Art von Software Entwicklung vorwegzunehmen:

  • Die objektorientierte Sprachen sind gut, wenn Sie einen festen Satz von Operationen auf Dinge , und wie Ihr Code entwickelt sich, Sie in erster Linie neue Dinge hinzuzufügen. Dies kann durch das Hinzufügen neuer Klassen erreicht werden, die bestehenden Verfahren zu implementieren und die bestehenden Klassen werden allein gelassen.

  • Funktionale Sprachen sind gut, wenn Sie einen festen Satz von Dinge , und wie Ihr Code entwickelt sich, fügen Sie in erster Linie neue Operationen auf bestehende Dinge. Dies kann durch das Hinzufügen neuer Funktionen erreicht werden, die Rechen mit vorhandenen Datentypen und die vorhandenen Funktionen werden allein gelassen.

Wenn die Evolution in die falsche Richtung geht, haben Sie Probleme:

  • eine neue Operation zu einem objektorientierten Programm Hinzufügen erfordert viele Klassendefinitionen Bearbeitung kann eine neue Methode hinzuzufügen.

  • eine neue Art der Sache zu einem funktionalen Programm Hinzufügen erfordert viele Funktionsdefinitionen Bearbeitung kann einen neuen Fall hinzuzufügen.

Dieses Problem ist seit vielen Jahren bekannt; 1998 Phil Wadler das "Ausdruck Problem" bezeichnet . Obwohl einige Forscher glauben, dass der Ausdruck Problem mit einer solchen Sprache angesprochen werden können Funktionen wie Mixins, eine allgemein akzeptierte Lösung noch den Mainstream zu treffen hat.

  

Was sind die typischen Problemstellungen, wo funktionale Programmierung eine bessere Wahl ist?

Funktionale Sprachen zeichnen sie symbolische Daten in Baumform zu manipulieren. Ein beliebtes Beispiel ist Compiler, wo Quellen- und Zwischensprachen selten ändern (meist die gleichen Dinge ), aber Compiler Schriftsteller immer fügt neue Übersetzungen und Code-Verbesserungen oder Optimierungen (neue Operationen auf Dinge). Erstellung und Übersetzung allgemeiner sind „Killer-Applikationen“ für funktionale Sprachen.

Andere Tipps

Sie müssen nicht unbedingt zwischen den beiden Paradigmen wählen. Sie können Software mit einer OO-Architektur mit vielen funktionellen Konzepte schreiben. FP und OOP sind orthogonal in der Natur .

Nehmen Sie zum Beispiel C #. Man könnte sagen, es ist vor allem OOP, aber es gibt viele FP Konzepte und Konstrukte. Wenn man bedenkt, Linq , die wichtigsten Konstrukte, die Linq to exist ermöglichen, sind funktional in der Natur. Lambda-Ausdrücke

Ein weiteres Beispiel, # F. Man könnte sagen, es ist vor allem FP, aber es gibt viele OOP-Konzepte und Konstrukte zur Verfügung. Sie können mit Vererbung Klassen, abstrakte Klassen, Interfaces, abkommen definieren. Sie können sogar Veränderlichkeit verwenden, wenn es Ihren Code klarer macht, oder wenn es dramatisch erhöht die Leistung.

Viele moderne Sprachen sind Multi-Paradigma.

Empfohlene Messwerte

Wie ich im selben Boot bin (OOP Hintergrund, Lernen FP), würde ich vorschlagen, dass Sie ein paar Lesungen ich wirklich geschätzt haben:

Objektorientierte Programmierung bietet:

  1. Encapsulation, auf
    • Steuer Mutation von internem Zustand
    • Begrenzungs Ankoppeln an interne Darstellung
  2. Subtyping, so dass:
    • Substitution von kompatibelen Typen (Polymorphismus)
    • ein rohes Mittel des Teilens Umsetzung zwischen den Klassen (Implementierungsvererbung)

Functional Programming, in Haskell oder sogar in Scala, kann Substitution durch allgemeinere Mechanismus der Typklassen ermöglichen. Veränderliche interner Zustand wird entweder entmutigt oder verboten. Die Einkapselung der internen Darstellung kann auch erreicht werden. Siehe Haskell vs OOP für einen guten Vergleich.

Norman Behauptung, dass „eine neue Art der Sache zu einem funktionalen Programm Hinzufügen erfordern viele Funktionsdefinitionen Bearbeitung einen neuen Fall hinzuzufügen.“ hängt davon ab, wie gut der Funktionscode Typklassen eingesetzt. Wenn Pattern Matching auf einem bestimmten Typ Abstrakte Daten ist verbreitete sich in einer Code-Basis, werden Sie in der Tat unter diesem Problem leiden, aber es ist vielleicht ein schlechtes Design zu beginnen.

EDITED Entfernte Bezug auf implizite Konvertierungen, wenn Typklassen diskutieren. In Scala werden Typklassen mit impliziten Parametern codiert wird, keine Umrechnungen, obwohl implizite Konvertierungen ein weiteres Mittel sind die Substitution von kompatibelen Typen Acheiving.

  1. Wenn Sie in einer stark konkurrierenden Umgebung sind, dann rein funktionale Programmierung ist nützlich. Der Mangel an wandelbaren Zustand macht Gleichzeitigkeit fast trivial. Siehe Erlang.

  2. In einer Multiparadigma Sprache, können Sie einige Dinge funktionell zu modellieren, wenn die Existenz von wandelbarem Zustand muss eine Implementierung Detail, und somit FP ist ein gutes Modell für den Problembereich. Siehe zum Beispiel Listenkomprehensionen in Python oder std.range in der Programmiersprache D . Diese sind inspiriert von der funktionalen Programmierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top