Eine konträre Sicht der Unveränderlichkeit
TL / DR: Unveränderlichkeit ist in JavaScript eher ein Modetrend als eine Notwendigkeit. Wenn Sie React verwenden, können einige verwirrende Entwurfsoptionen in der Statusverwaltung ordentlich umgangen werden. In den meisten anderen Situationen wird die damit verbundene Komplexität jedoch nicht ausreichend aufgewertet, da sie eher dazu dient , einen Lebenslauf aufzufüllen, als einen tatsächlichen Kundenbedarf zu decken.
Lange Antwort: lesen Sie unten.
Warum ist Unveränderlichkeit in Javascript so wichtig (oder notwendig)?
Nun, ich bin froh, dass du gefragt hast!
Vor einiger Zeit schrieb ein sehr talentierter Mann namens Dan Abramov eine Javascript State Management Library namens Redux, die reine Funktionen und Unveränderlichkeit verwendet. Er hat auch einige wirklich coole Videos gemacht , die die Idee wirklich leicht zu verstehen (und zu verkaufen) machten.
Das Timing war perfekt. Die Neuheit von Angular verblasste und die JavaScript-Welt war bereit, sich auf das Neueste zu konzentrieren, das den richtigen Grad an Coolness aufwies. Diese Bibliothek war nicht nur innovativ, sondern passte auch perfekt zu React, das von einem anderen Silicon Valley-Kraftpaket verkauft wurde .
So traurig es auch sein mag, in der Welt von JavaScript herrscht Mode. Jetzt wird Abramov als Halbgott gefeiert und wir Sterblichen müssen uns alle dem Dao der Unveränderlichkeit unterwerfen ... Ob es Sinn macht oder nicht.
Was ist falsch daran, Objekte zu mutieren?
Nichts!
Tatsächlich haben Programmierer Objekte für ähm ... mutiert, solange es Objekte zum Mutieren gab. Mit anderen Worten: Über 50 Jahre Anwendungsentwicklung.
Und warum die Dinge komplizieren? Wenn Sie ein Objekt haben cat
und es stirbt, brauchen Sie wirklich eine Sekunde cat
, um die Änderung zu verfolgen? Die meisten Leute würden einfach sagen cat.isDead = true
und damit fertig sein.
Macht (mutierende Objekte) die Dinge nicht einfach?
JA! .. Natürlich tut es das!
Insbesondere in JavaScript, das in der Praxis am nützlichsten ist, um eine Ansicht eines Status zu rendern, der an anderer Stelle (wie in einer Datenbank) verwaltet wird.
Was ist, wenn ich ein neues News-Objekt habe, das aktualisiert werden muss? ... Wie erreiche ich in diesem Fall? Laden löschen und neu erstellen? Ist das Hinzufügen eines Objekts zum Array nicht eine kostengünstigere Operation?
Nun, Sie können den herkömmlichen Ansatz wählen und das News
Objekt aktualisieren , sodass sich Ihre speicherinterne Darstellung dieses Objekts ändert (und die Ansicht, die dem Benutzer angezeigt wird, oder so würde man hoffen) ...
Oder alternativ...
Sie können den sexy FP / Immutability-Ansatz ausprobieren und Ihre Änderungen am News
Objekt einem Array hinzufügen, das jede historische Änderung verfolgt, sodass Sie das Array durchlaufen und herausfinden können, wie die korrekte Zustandsdarstellung aussehen sollte (puh!).
Ich versuche zu lernen, was hier richtig ist. Bitte erleuchte mich :)
Mode kommt und geht Kumpel. Es gibt viele Möglichkeiten, eine Katze zu häuten.
Es tut mir leid, dass Sie die Verwirrung eines sich ständig ändernden Satzes von Programmierparadigmen ertragen müssen. Aber hey, willkommen im Club!
Nun ein paar wichtige Punkte, die Sie in Bezug auf Unveränderlichkeit beachten sollten, und Sie werden diese mit der fieberhaften Intensität auf Sie werfen, die nur Naivität aufbringen kann.
1) Unveränderlichkeit ist fantastisch, um Rennbedingungen in Umgebungen mit mehreren Threads zu vermeiden .
Multithread-Umgebungen (wie C ++, Java und C #) haben sich der Praxis schuldig gemacht, Objekte zu sperren, wenn mehr als ein Thread sie ändern möchte. Dies ist schlecht für die Leistung, aber besser als die Alternative der Datenbeschädigung. Und doch nicht so gut wie alles unveränderlich zu machen (Herr preise Haskell!).
ABER leider! In JavaScript arbeiten Sie immer mit einem einzelnen Thread . Sogar Web-Worker (jeder läuft in einem separaten Kontext ). Da Sie in Ihrem Ausführungskontext keine Thread-bezogenen Race-Bedingungen haben können (all diese schönen globalen Variablen und Abschlüsse), geht der Hauptpunkt zugunsten der Unveränderlichkeit aus dem Fenster.
(Having said that, es ist ein Vorteil der Verwendung von reinen Funktionen in Web - Arbeitern, die sind , dass Sie mit Objekten auf dem Haupt - Thread keine Erwartungen über das Hantieren haben werden.)
2) Unveränderlichkeit kann (irgendwie) Rennbedingungen im Zustand Ihrer App vermeiden.
Und hier ist der eigentliche Kern der Sache: Die meisten (React-) Entwickler werden Ihnen sagen, dass Unveränderlichkeit und FP diese Magie irgendwie anwenden können, die es ermöglicht, dass der Status Ihrer Anwendung vorhersehbar wird.
Dies bedeutet natürlich nicht, dass Sie Rennbedingungen in der Datenbank vermeiden können. Um diese zu erreichen, müssten Sie alle Benutzer in allen Browsern koordinieren. Dazu benötigen Sie eine Back-End-Push-Technologie wie WebSockets ( mehr dazu weiter unten), das Änderungen an alle überträgt, die die App ausführen.
Es bedeutet auch nicht, dass JavaScript ein inhärentes Problem aufweist, bei dem Ihr Anwendungsstatus unveränderlich sein muss, um vorhersehbar zu werden. Jeder Entwickler, der Front-End-Anwendungen vor React codiert hat, würde Ihnen dies mitteilen.
Diese ziemlich verwirrende Behauptung bedeutet einfach, dass mit React Ihr Bewerbungsstatus anfälliger für Rennbedingungen wird , aber dass Unveränderlichkeit es Ihnen ermöglicht, diesen Schmerz zu lindern. Warum? Da React etwas Besonderes ist, wurde es als hochoptimierte Rendering-Bibliothek konzipiert, wobei die kohärente Statusverwaltung an zweiter Stelle steht. Daher wird der Komponentenstatus über eine asynchrone Ereigniskette (auch als "Einweg-Datenbindung" bezeichnet) verwaltet, auf die Sie keinen Einfluss haben über und verlassen Sie sich darauf, dass Sie daran denken, den Zustand nicht direkt zu mutieren ...
In diesem Zusammenhang ist leicht zu erkennen, dass die Notwendigkeit der Unveränderlichkeit wenig mit JavaScript und viel mit den Rennbedingungen in React zu tun hat: Wenn Ihre Anwendung eine Reihe von voneinander abhängigen Änderungen enthält und keine einfache Möglichkeit besteht, herauszufinden, was Ihr Zustand befindet sich derzeit in einem Zustand, in dem Sie verwirrt sein werden. Daher ist es durchaus sinnvoll, die Unveränderlichkeit zu verwenden, um jede historische Veränderung zu verfolgen .
3) Die Rennbedingungen sind kategorisch schlecht.
Nun, sie könnten sein, wenn Sie React verwenden. Sie sind jedoch selten, wenn Sie ein anderes Framework auswählen.
Außerdem haben Sie normalerweise weitaus größere Probleme … Probleme wie die Hölle der Abhängigkeit. Wie eine aufgeblähte Codebasis. Als würde Ihr CSS nicht geladen. Wie ein langsamer Build-Prozess oder das Festhalten an einem monolithischen Back-End, das das Iterieren fast unmöglich macht. Wie unerfahrene Entwickler, die nicht verstehen, was los ist, und die Dinge durcheinander bringen.
Wissen Sie. Wirklichkeit. Aber hey, wen interessiert das?
4) Bei der Unveränderlichkeit werden Referenztypen verwendet , um die Auswirkungen der Verfolgung jeder Zustandsänderung auf die Leistung zu verringern.
Denn im Ernst, wenn Sie jedes Mal, wenn sich Ihr Status ändert, etwas kopieren, sollten Sie besser sicherstellen, dass Sie klug sind.
5) Unveränderlichkeit ermöglicht es Ihnen, Sachen rückgängig zu machen .
Weil ähm ... das ist die Nummer eins, nach der Ihr Projektmanager fragen wird, oder?
6) Unveränderlicher Zustand hat in Kombination mit WebSockets viel cooles Potenzial
Last but not least ist die Anhäufung von Zustandsdeltas in Kombination mit WebSockets ein ziemlich überzeugender Fall, der einen einfachen Verbrauch des Zustands als Fluss unveränderlicher Ereignisse ermöglicht ...
Sobald der Penny auf dieses Konzept fällt (Zustand ist ein Fluss von Ereignissen - und nicht eine grobe Reihe von Aufzeichnungen, die die neueste Sichtweise darstellen), wird die unveränderliche Welt zu einem magischen Ort zum Wohnen. Ein Land voller Wunder und Möglichkeiten, die über die Zeit hinausgehen . Und wenn es richtig getan kann auf jeden Fall machen Echtzeit - EASI apps er zu erreichen, Sie übertragen nur den Fluss der Ereignisse an alle Interessierten , so können sie ihre eigene Darstellung bauen der Gegenwart und schreiben ihre eigenen Änderungen in den kommunalen Fluss zurück.
Aber irgendwann wachst du auf und merkst, dass all diese Wunder und Magie nicht umsonst sind. Im Gegensatz zu Ihren eifrigen Kollegen kümmern sich Ihre Stakeholder (ja, die Leute, die Sie bezahlen) wenig um Philosophie oder Mode und viel um das Geld, das sie bezahlen, um ein Produkt zu bauen, das sie verkaufen können. Und das Fazit ist, dass es schwieriger ist, unveränderlichen Code zu schreiben und ihn leichter zu brechen. Außerdem macht es wenig Sinn, ein unveränderliches Front-End zu haben, wenn Sie kein Back-End haben, das ihn unterstützt. Wenn Sie (und wenn!) Ihre Stakeholder endgültig davon überzeugen, dass Sie Ereignisse über eine Push-Technologie wie WebSockets veröffentlichen und nutzen sollten, finden Sie heraus , wie schwierig es ist, die Produktion zu skalieren .
Nun zu einigen Ratschlägen, sollten Sie sich dafür entscheiden, diese zu akzeptieren.
Die Wahl, JavaScript mit FP / Immutability zu schreiben, ist auch eine Wahl, um Ihre Anwendungscodebasis größer, komplexer und schwieriger zu verwalten. Ich würde mich nachdrücklich dafür aussprechen, diesen Ansatz auf Ihre Redux-Reduzierungen zu beschränken, es sei denn, Sie wissen, was Sie tun ... Und wenn Sie die Unveränderlichkeit unabhängig davon verwenden, wenden Sie den unveränderlichen Status auf Ihren gesamten Anwendungsstapel an und nicht nur auf den clientseitig, da Ihnen sonst der wahre Wert fehlt.
Wenn Sie das Glück haben, Entscheidungen in Ihrer Arbeit treffen zu können, versuchen Sie, Ihre Weisheit zu nutzen (oder nicht) und tun Sie, was von der Person, die Sie bezahlt, richtig ist . Sie können dies auf Ihre Erfahrung, Ihren Bauch oder das, was um Sie herum vor sich geht, stützen (zugegebenermaßen, wenn jeder React / Redux verwendet, gibt es ein gültiges Argument dafür, dass es einfacher ist, eine Ressource zu finden, um Ihre Arbeit fortzusetzen). Sie können entweder Resume Driven Development- oder Hype Driven Development- Ansätze ausprobieren . Sie könnten eher deine Art von Dingen sein.
Kurz gesagt, die Sache, die für Unveränderlichkeit gesagt werden muss, ist, dass es Sie mit Ihren Kollegen in Mode bringt , zumindest bis der nächste Wahnsinn kommt, und an diesem Punkt werden Sie froh sein, weiterzumachen.
Nach dieser Selbsttherapiesitzung möchte ich darauf hinweisen, dass ich dies als Artikel in meinem Blog hinzugefügt habe => Unveränderlichkeit in JavaScript: Eine konträre Ansicht . Fühlen Sie sich frei, dort zu antworten, wenn Sie starke Gefühle haben, die Sie auch von Ihrer Brust bekommen möchten;).