Lang laufende Switch-Fälle oder If-else-If-Konstrukte werden in OOP mithilfe von Polymorphismus vermieden, wo immer dies anwendbar ist.
Anstatt durch Abgleichen eines Werts zu verzweigen, erfolgt die Verzweigung auf Klassenebene.
Wie kann ein ähnlicher Ansatz im Paradigma der funktionalen Programmierung, speziell Clojure, angewendet werden?
functional-programming
clojure
Amogh Talpallikar
quelle
quelle
Antworten:
Sie meiden sie nicht, sie umarmen sie mit der Pattern-Match-Syntax.
Die funktionale Programmierung ist jedoch weitgehend orthogonal zur objektorientierten Programmierung, so dass die absolute Mehrheit der "funktionalen" Sprachen auch objektorientiert ist¹, einschließlich Clojure. Tatsächlich sind die Multi-Methoden von clojure sogar noch besser als einfache virtuelle Java-Methoden, da sie nicht nur die ersten, sondern mehrere Arten von Argumenten dynamisch auslösen können.
Es gibt eine rein funktionale Sprache ohne dynamischen Polymorphismus, Haskell. In Haskell können Sie mehrere Methoden über Typklassen definieren, die Typen werden jedoch zur Kompilierungszeit aufgelöst. Um zur Laufzeit unterschiedliche Typen zu haben, müssen Sie einen Union-Typ erstellen und entweder die Funktion mit Musterübereinstimmung schreiben (ähnlich wie die if-Kette, jedoch mit einer bequemeren Syntax) oder den Compiler bitten, die Methode durch Zusammenstellen des abzuleiten Methoden der Bestandteilstypen. Oder verwenden Sie die GHC-
forall
Erweiterung.¹ Mit objektorientiert meine ich, dass die Sprache eine Form von dynamischem Polymorphismus aufweist, wobei der Versand auf dem tatsächlichen Laufzeittyp basiert. Viele neue Sprachen haben nur einen auf Merkmalen basierenden Polymorphismus, bei dem nur Schnittstellen vererbt werden können. Ich halte das für objektorientiert und für den Zweck dieser Antwort ist es ausreichend.
quelle
forall
Erweiterung verwenden, ist die Kompilierungszeit vollständig.Dies ist eine sehr alte Frage, aber ich habe das Gefühl, dass die Antworten fehlten.
Wie Sie bereits erwähnt haben, wird die Verzweigung in OO häufig auf die Klassenebene verschoben. Lassen Sie uns darüber nachdenken, was das bedeutet:
Genau so würden Sie damit umgehen: eine Funktion höherer Ordnung. Ihre Funktion höherer Ordnung übernimmt die Verzweigung und gibt optimierte Funktionen für den Verbrauch zurück.
Im Kontext Ihrer Frage ist Polymorphismus eine Art Abstraktion dafür - mit zusätzlicher Typensicherheit.
quelle
In der funktionalen Programmiersprache können wir Funktionen und Schlüsselparameter verwenden, um bedingte Verzweigungen zu entfernen. Das heißt, verwenden Sie Funktionen mit Bedingungsparameter anstelle von "if esle". Siehe Beispiel 3. Als computeSphereArea ({Radius: 25,55})
Beispiel 1: OOP // in OOP (verwenden Sie beispielsweise Java (Quellcode von: http: //developer.51cto.com/art/200907/136506.htm)):
Beispiel 2: funktional wie oop. // in der funktionalen Programmierung (verwenden Sie zum Beispiel Javascript):
// Dies ist zwar kein reines Funktionsprogrammbeispiel, sondern eine Funktionsschnittstelle wie initCircle () initSphere (). Sie können weitere Funktionen erstellen, wie computeCircleArea () computeSphereArea () es funktionaler macht. // PS: typeOf () ist hier: https://github.com/will-v-king/javascript-showMe
Beispiel 3: Ok, machen wir es funktionsfähiger:
quelle