Anfänger JavaScript-OOP vs Funktionale
Ich bin gerade erst anfangen zu forschen unterschiedlichen Programmier-Stilen (OOP, funktional, prozessual).
Lerne ich JavaScript und starten underscore.js und kam diese kleinen Abschnitt in der Dokumentation.
Die docs sagen, dass underscore.js kann verwendet werden in einer objektorientierten oder Funktionalen Stil und, dass diese beiden in der gleichen Sache.
_.map([1, 2, 3], function(n){ return n * 2; });
_([1, 2, 3]).map(function(n){ return n * 2; });
Ich verstehe nicht, was ist funktional und was ist OOP, und ich verstehe nicht, warum, selbst nachdem einige der Forschung in diese Programmier-Paradigmen.
- Sie können prüfen wollen, lodash als alternative zu unterstreichen.
- Relevant: "Hey Unterstreichen, Du Machst Es Falsch!"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine richtige definition für das, was ist und ist nicht "funktionsfähig", aber in der Regel funktionale Sprachen haben einen Schwerpunkt auf Einfachheit, wo Daten und Funktionen betroffen sind.
Meisten funktionalen Programmiersprachen keine Konzepte von Klassen und Methoden gehörenden Objekte. Funktionen arbeiten auf klar definierte Daten-Strukturen, als vielmehr die Zugehörigkeit zu den Datenstrukturen.
Den ersten Stil
_.map
ist eine Funktion in der_
namespace. Es ist eine eigenständige Funktion, und man konnte es zurück oder übergeben Sie es einer anderen Funktion als argument.Ist es nicht möglich, das gleiche zu tun, für den zweiten Stil, weil die Methode, die Instanz ist untrennbar gebunden an die Daten, die zum erstellen des Objekts. Also ich würde sagen, dass die erste form ist mehr funktionsfähig.
In jedem Fall die Allgemeinen funktionalen Programmierstil ist, dass die Daten sollte das Letzte argument der Funktion, so dass es leichter zu curry oder teilweise, gelten die früheren Argumente. Lodash/fp und ramda Adresse dies, indem er die folgende Signatur für die Karte.
Wenn die Funktion Curry, die Sie erstellen können bestimmte Versionen der Funktion, die von nur übergeben das erste argument.
Programmier-Paradigma
Objektorientierte Programmierung (OOP) und Functionnal Programmierung (FP) sind Programmier-Paradigmen. Grob gesagt, die folgenden ein Programmier-Paradigma ist das schreiben von code-kompatibel mit einem bestimmten set von Regeln. Zum Beispiel die Organisation den code in Einheiten, die aufgerufen werden würde, OOP, Vermeidung von Nebenwirkungen genannt werden würde FP.
Jeder Programmier-Paradigma ist aus der spezifischen Funktionen, jedoch Ihre bevorzugte Sprache nicht haben, um alle Funktionen zu fallen, in ein Paradigma. In der Tat, OOP Leben können, ohne Vererbung oder Kapselung, so können wir sagen, dass JavaScript (JS) ist eine OOP-Sprache mit Vererbung und ohne Kapselung.
Jetzt haben Sie ein wenig Verständnis dafür, was für ein Programmier-Paradigma ist (hoffentlich), haben wir einen kurzen Blick auf die Grundlagen von OOP und FP.
Objektorientierte Programmierung
In OOP ein Objekt ist eine box mit Informationen und Vorgänge werden soll, beziehen sich auf das gleiche Konzept. Informationen sind Häufig bekannt als "Attribute", und Operationen sind Häufig bekannt als "Methoden". Attribute erlauben, zu verfolgen, den Zustand des Objekts und Methoden erlauben es, zu manipulieren, um den Zustand des Objekts.
In JS-können Sie senden eine Nachricht an ein Objekt zur Ausführung einer bestimmten Methode. Der folgende code zeigt, wie eine Methode aufzurufen, die in JS. Die "point" - Objekt hat zwei Attribute, "x" und "y", und eine Methode namens "übersetzen". Die "translate" - Methode aktualisiert die Koordinaten des "point", basierend auf den gegebenen Vektor.
Gibt es nicht viele Funktionen beteiligt, die in einem so einfachen Fall. In OOP-code ist oft unterteilt in Klassen, und in der Regel unterstützt die Vererbung und Polymorphismus. Aber ich will nicht weiter ins Detail gehen, da ich fürchte, ich bin schon außerhalb der Reichweite Ihrer Frage.
Funktionale Programmierung
In der FP, der code ist im wesentlichen eine Kombination von Funktionen. Außerdem werden die Daten unveränderlich ist, die dazu führt, das schreiben von Programmen mit keine Nebenwirkungen. In funktionalen code, eine Funktion ist nicht in der Lage zu ändern, die außerhalb der Welt, und der Ausgangswert hängt nur von den angegebenen Argumenten. Diese können starke Kontrolle über den Programmablauf.
Eigentlich JS kann verwendet werden, als ein FP-Sprache so lange, wie Sie kümmern sich um Nebenwirkungen, gibt es keinen eingebauten Mechanismus für, die. Der folgende code ist ein Beispiel für einen solchen Programmierstil. Die "zipWith" - Funktion kommt von der Haskell Welt. Es führt zwei Listen mit der gegebenen Funktion, wie es geschieht,
add(point[i], vector[i])
.Diese definition ist sehr oberflächlich wenn. Haskell zum Beispiel, das ist eine Reine funktionale Sprache, implementiert viele weitere Konzepte wie Funktionen, Zusammensetzung, funktoren, currying, Monaden, etc.
Fazit
Eigentlich OOP und FP sind zwei verschiedene Konzepte, die nichts gemein haben, ich würde sogar sagen, dass es nichts zu vergleichen. Somit glaube ich, dass das, was Sie gelesen haben, von Underscore.js docs ist ein Missbrauch der Sprache.
Sollten Sie nicht studieren Programmier-Paradigmen, die in den Anwendungsbereich dieser Bibliothek. In der Tat, wie Sie code schreiben, der mit Underscore.js macht es ähnlich wie OOP und FP, aber es ist nur eine Frage der Erscheinung. Daher gibt es nichts wirklich spannendes unter der Haube 🙂
Siehe Wikipedia für vertiefte Lektüre.
Funktional: Sie ein Objekt übergeben, um die Funktion und die Sachen tun,
_.map([1, 2, 3], function(n){ return n * 2; });
OOP: Sie rufen Sie die Funktion auf das Objekt und machen Sachen
_([1, 2, 3]).map(function(n){ return n * 2; });
In beiden Beispielen
[1,2,3] (array)
ist ein Objekt.Beispiel OOP reference: http://underscorejs.org/#times
FP
In FP, eine Funktion übernimmt Eingaben und erzeugt eine Ausgabe, mit der Garantie, dass die gleichen Eingaben wird der Ertrag der gleichen Ausgänge. Um dies zu tun, eine Funktion muss immer der Parameter für die Werte, die das Unternehmen betreibt und nicht verlassen sich auf Staat. Dh, wenn eine Funktion stützt sich auf den Staat, und dass sich der Zustand ändert, die Ausgabe der Funktion könnte eine andere sein. FP vermeidet dies um jeden Preis.
Zeigen wir eine Mindest-Umsetzung der
map
im FP und OOP. In diesem FP-Beispiel unten, beachten Sie, wiemap
arbeitet nur auf lokalen Variablen und setzt nicht auf StaatlicheJS:
In diesem Stil, es spielt keine Rolle, dass
map
gespeichert wurde, in die_
Objekt - das macht es nicht "OOP", da ein Objekt verwendet wurde. Wir konnte gerade als leicht geschrieben -JS:
Dies ist das Grundrezept für einen Anruf im FP -
Die Bemerkenswerte Sache für FP ist hier, dass
map
hat zwei (2) Parameterarr
undfn
, und die Ausgabe vonmap
richtet sich einzig und allein auf diese Eingänge. Sie werden sehen, wie diese änderungen sich dramatisch in die OOP-Beispiel unten.OOP
In OOP-Objekte dienen zum speichern des Status. Wenn eine Methode eines Objekts aufgerufen wird, wird der Rahmen der Methode (Funktion) ist dynamisch an das empfangende Objekt als
this
. Dathis
ist ein ändern Wert, OOP kann nicht garantieren, jede Methode hat die gleiche Leistung, auch wenn der gleiche Eingang ist gegeben.NB wie
map
nur dauert nur ein (1) argument untenfn
. Wie können wirmap
mit nur einemfn
? Was werden wirmap
? Wie kann ich festlegen, das Ziel zumap
? FP hält dies für ein Alptraum, weil die Ausgabe der Funktion hängt nicht mehr ausschließlich auf die Eingänge - Jetzt die Ausgabe vonmap
ist schwieriger zu bestimmen, denn es hängt von der dynamische Wert vonthis
-JS:
Dies ist das Grundrezept für einen dynamischen Aufruf in OOP -
FP revisited
In der ersten FP Beispiel sehen wir
.concat
und.slice
- nicht OOP dynamische Aufrufe? Sie sind, aber diese nicht ändern, wird die Eingabe-array, und so sind Sie sicher für die Verwendung mit FP.Sagte, die Mischung der Aufruf Stile können ein bisschen ein Dorn im Auge. OOP bevorzugt ein "infix" - notation, wo die Methoden (Funktionen) angezeigt werden zwischen die Argumente der Funktion -
Dies ist, wie JavaScript-Operatoren funktionieren auch -
FP bevorzugt ein "Präfix" - notation, wo die Funktion kommt immer vor seinen Argumenten. In einer idealen Welt wären wir in der Lage zu call OOP-Methoden und-Operatoren in alle position, aber leider ist JS nicht funktionieren auf diese Weise -
Durch die Umwandlung Methoden wie
.conat
und.slice
Funktionen, können wir schreiben FP-Programme auf eine mehr Natürliche Weise. Beachten Sie, wie konsequente Verwendung der Präfix-notation macht es einfacher, um sich vorzustellen, wie die Berechnung durchführt -Die Methoden werden wie folgt umgewandelt -
Dieser beginnt zu zeigen, andere stärken der FP, wo Funktionen gehalten werden kleine und konzentrieren sich auf eine Aufgabe. Und weil diese Funktionen arbeiten nur auf Ihre Eingaben, können wir leicht die Wiederverwendung in anderen Bereichen unseres Programms.
Ihre Frage war ursprünglich gestellte 2016. Da die modernen JS-Funktionen ermöglichen Ihnen das schreiben von FP in eleganter Weise -
JS:
Einer weiteren Verfeinerung mit Ausdrücke statt Aussagen -
JS:
Aussagen beruhen auf Nebenwirkungen in der Erwägung, dass Ausdrücke geben direkt einen Wert ein. Ausdrücke lassen weniger potentielle "Löcher" in Ihrem code, wo Aussagen kann nichts tun jederzeit, wie auslösen eines Fehlers oder verlassen einer Funktion ohne Rückgabe eines Wertes.
FP mit Objekten
FP bedeutet nicht "nicht verwenden Objekte" - es geht um die Erhaltung der Fähigkeit, leicht Grund über Ihre Programme. Wir können das gleiche schreiben
map
Programm, das gibt die illusion, dass wir mit Hilfe der OOP, aber in Wirklichkeit verhält es sich eher wie FP. Es sieht wie eine Methode aufrufen, aber die Umsetzung stützt sich nur auf lokale Variablen und nicht auf dynamischen Zustand (this
).JavaScript ist eine reiche, expressive, multi-Paradigma Sprache, die es Ihnen ermöglicht, Programme zu schreiben, um Ihre Bedürfnisse und Vorlieben -
JS:
Beide
map
funktionsfähig ist, und sowohl code basierend auf ein concpet, Wert => Wert von map-Funktion.Aber beide können auch gesehen werden, OOP, weil Objekt.Karte Stil.
Ich würde nicht recoomend Sie zu verstehen funktionale Programmierung mit Unterstrich.