Pourquoi est immutabilité si important (ou au besoin) en JavaScript?
Je suis actuellement en train de travailler sur Réagir JS et Réagir Natif cadres. À mi-chemin de la route, je suis tombé sur l'Immuabilité ou la Immuable-bibliothèque JS, quand j'ai lu sur Facebook Flux et Redux mise en œuvre.
La question est, pourquoi est immutabilité si important? Ce qui est faux dans la mutation des objets? N'est-ce pas faire des choses simples?
Donner un exemple, considérons un simple lecteur de News app avec l'ouverture de l'écran étant une vue de liste de titres de l'actualité.
Si je dis une tableau d'objets avec une valeur initialement je ne peux pas la manipuler. C'est ce principe de l'immutabilité dit, à droite? (Corrigez-moi si je me trompe.)
Mais, que faire si j'ai une nouvelle News de l'objet qui doit être mis à jour? Dans le cas d'habitude, j'aurais juste ajouté de l'objet dans le tableau.
Comment puis-je atteindre dans ce cas? Supprimer le stocker et de le recréer?
N'est pas d'ajouter un objet à la matrice une opération moins cher?
- Simple oui. Simple à briser. L'immutabilité, fondamentalement signifie que vous pouvez faire confiance qu'elle ne changera pas. Selon les circonstances, ce n'est pas seulement important, mais essentiel.
- Pertinentes: programmers.stackexchange.com/questions/151733/...
- Les données immuables de la structure et de la fonction pure conduire à la transparence référentielle, ce qui rend beaucoup plus facile de raisonner sur le comportement de votre programme. Vous bénéficiez également de retour en arrière pour gratuit lors de l'utilisation fonctionnelle de la structure de données.
- J'ai fourni un Redux du point de vue @bozzmob.
Vous devez vous connecter pour publier un commentaire.
J'ai été récemment des recherches sur le même sujet. Je vais faire de mon mieux pour répondre à votre question(s) et d'essayer de partager ce que j'ai appris jusqu'à présent.
Fondamentalement, il s'agit du fait que l'immutabilité augmente la prévisibilité, de la performance (indirectement) et permet la mutation de suivi.
Prévisibilité
Mutation cache changer, ce qui créer (inattendue) des effets secondaires, qui peuvent causer des méchants bugs. Lorsque vous appliquez l'immuabilité vous pouvez garder votre architecture de l'application et modèle mental simple, ce qui rend plus facile de raisonner sur votre application.
Performance
Même si l'ajout de valeurs d'un Objet immuable signifie qu'une nouvelle instance doit être créé où les valeurs existantes doivent être copiés et les nouvelles valeurs doivent être ajoutés à la nouvelle de l'Objet dont le coût de la mémoire, des Objets immuables pouvez utiliser structurels de partage pour réduire la surcharge de la mémoire.
Vous pouvez lire plus sur ce ici.
Mutation De Suivi
Outre l'utilisation réduite de la mémoire, l'immuabilité vous permet d'optimiser votre application en faisant usage de la référence et de la valeur de l'égalité. Cela le rend vraiment facile de voir si quelque chose a changé. Par exemple, un changement d'état dans un réagir composant. Vous pouvez utiliser
shouldComponentUpdate
pour vérifier si l'état est identique en comparant l'état des Objets et éviter de rendu.Vous pouvez lire plus sur ce ici.
Ressources supplémentaires:
Oui, c'est correct. Si vous êtes confus sur la façon de l'implémenter dans votre demande, je vous recommande de regarder comment redux fait cela pour se familiariser avec les concepts de base, il m'a beaucoup aidé.
J'aime utiliser Redux comme exemple, car il embrasse l'immuabilité. Il a un seul état immuable de l'arbre (appelé
store
), où tous les changements d'état sont explicites par l'envoi d'actions qui sont traitées par un réducteur qui accepte de l'état précédent avec dit des actions (un à la fois), et renvoie le prochain état de votre demande. Vous pouvez en lire plus à ce sujet les principes fondamentaux de ici.Il y a un super redux cours sur tête d'oeuf.io où Dan Abramov, l'auteur de redux, explique ces principes comme suit (j'ai modifié un peu le code pour mieux répondre à la scénario):
Aussi, ces vidéos démontrer plus en détail comment faire pour obtenir l'immutabilité pour:
addNews
retourne une nouvelle news de tableau et l'originalnews
est intacte, mais alors quoi? Allez-vous attribuer à ...news2
? Et puis le prochain appel estnews3
? Il semble y avoir une erreur dans l'approche spécifique pour ce morceau de code. (Indice: est-il judicieux d'utiliserconst
pour un état variable? L'état est spécifiquement destiné à changer au fil du temps; je dirais même implicitement garantie)const
n'est pas à propos de l'immuabilité. Mathias Bynens, a écrit un grand blog à ce sujet.Allant à contre-courant de l'Immuabilité
Réponse courte: l'Immuabilité est plus une tendance de la mode que d'une nécessité en JavaScript. Il y a un peu étroit cas, quand il devient utile (Réaction/Redux pour la plupart), mais généralement pour les mauvaises raisons.
Réponse longue: lire ci-dessous.
Bien, je suis content que vous avez demandé!
Il y a quelques temps un très talentueux gars qui s'appelle Dan Abramov a écrit un script javascript de l'état de gestion de bibliothèque appelée Redux qui utilise les fonctions pures et d'immuabilité. Il a également fait quelques vraiment cool les vidéos qui ont fait l'idée est vraiment facile à comprendre (et de vendre).
Le timing était parfait. La nouveauté de Angulaire a été la décoloration, et JavaScript monde était prêt à se concentrer sur la dernière chose qui avait le bon degré de frais, et cette bibliothèque n'était pas seulement innovant, mais à fente parfaitement avec Réagir qui a été colporté par un autre Silicon Valley de la centrale.
Triste que cela puisse être, la mode, la règle dans le monde du JavaScript. Maintenant Abramov est saluée comme un demi-dieu et tous les nous, simples mortels ont pour objet de nous-mêmes à la Dao de l'Immuabilité... Si elle a du sens ou pas.
Rien!
En fait, les programmeurs ont été mutation des objets pour euh... tant qu'il y a des objets à muter. 50 ans et+ du développement de l'application dans d'autres mots.
Et pourquoi compliquer les choses? Lorsque vous avez un objet
cat
et il meurt, avez-vous vraiment besoin d'un deuxièmecat
pour suivre le changement? La plupart des gens serait juste de direcat.isDead = true
et être fait avec elle.OUI! .. Bien sûr il ne!
Spécialement en JavaScript, ce qui dans la pratique est le plus utile, utilisé pour le rendu de la vue de quelque état que se trouve ailleurs (comme dans une base de données).
Bien, vous pouvez aller de l'approche traditionnelle et la mise à jour de la
News
objet, de sorte que votre représentation en mémoire de l'objet de modifications (et la vue affichée à l'utilisateur, ou alors on l'espère)...Ou sinon...
Vous pouvez essayer de le sexy FP/Immutabilité approche et ajouter vos modifications à la
News
objet à un tableau de suivi à chaque changement historique de sorte que vous pouvez ensuite parcourir le tableau et la figure ce que la bonne représentation de l'état devrait être (ouf!).Les modes passent copain. Il existe de nombreuses façons à la peau d'un chat.
Je suis désolé que vous avez à supporter la confusion de changer constamment de paradigmes de programmation. Mais hey, BIENVENUE AU CLUB!!
Maintenant quelques points importants à retenir en ce qui concerne l'Immutabilité, et vous obtiendrez ces jeté à vous avec la fébrile intensité que seule la naïveté peut rassembler.
1) l'Immuabilité est génial pour éviter des conditions de course dans les environnements multi-threads.
Les environnements Multi-threads (comme C++, Java et C#) se sont rendus coupables de la pratique de verrouillage des objets lorsque plus d'un thread veut les modifier. C'est mauvais pour la performance, mais mieux que l'alternative de la corruption des données. Et pourtant, pas aussi bon que rendre tout ce qui est immuable (Seigneur louange Haskell!).
MAIS HÉLAS! En JavaScript vous toujours fonctionner sur un seul thread. Même des web workers (chaque exécute à l'intérieur d'un contexte distinct de). Donc, puisque vous ne pouvez pas avoir un fil condition de course à l'intérieur de votre contexte d'exécution (toutes ces belles variables globales et fermetures), le principal argument en faveur de l'Immuabilité va à la fenêtre.
(Ceci dit, il est un avantage de l'utilisation de fonctions pures dans des web workers, qui est que vous n'aurez pas d'attentes au sujet de jongler avec des objets sur le thread principal.)
2) l'Immuabilité peut (en quelque sorte) d'éviter des conditions de course dans l'état de votre application.
Et là est le véritable nœud de la question, la plupart (Réagir) les développeurs vont vous dire que l'Immutabilité et de la FP peut en quelque sorte le travail de cette magie qui permet à l'état de votre demande pour devenir prévisible.
Bien sûr, cela ne signifie pas que vous pouvez éviter des conditions de course dans la base de données, à tirer que l'on off vous auriez à coordonner tous les utilisateurs dans tous les navigateurs, et pour cela vous aurez besoin d'un back-end de la technologie de push comme Les WebSockets (plus sur ce ci-dessous) qui permettront la diffusion de modifications à tout le monde de lancer l'application.
Ce plutôt déroutant revendication signifie simplement que la dernière valeur affectée à un objet d'état (définie par un seul utilisateur d'exploitation au sein de leur navigateur) devenir prévisible. Ce qui n'est vraiment pas de progrès du tout. Parce que vous pourriez avoir utilisé un simple vieux muté variable pour le suivi de votre état et vous savez que vous avez affaire avec les dernières informations à chaque fois que vous accédez à elle, et que cela fonctionne avec n'importe quoi, mais Réagir/Redux.
Pourquoi? En raison de Réagir est spécial.. et composant de l'état est géré par l'intermédiaire d'une chaîne d'événements que vous n'avez aucun contrôle sur, et comptons sur vous se rappelant de ne pas muter état directement. Cela a été manipulé étonnamment à partir d'un PR perspective, comme le Réagir battage médiatique a tourné une lacune dans un mode sexy. La mode de côté, je préfère voir l'immutabilité pour ce qu'elle est, c'est à dire un outil permettant de brancher un écart lors de votre choix de cadre ne traite pas de l'état de manière intuitive.
3) conditions de Course sont catégoriquement mauvais.
Bien, elle pourrait être si vous êtes à l'aide de Réagir. Mais ils sont rares, si vous chercher un cadre différent.
En outre, vous avez normalement beaucoup plus de problèmes pour faire face à... des Problèmes comme la dépendance de l'enfer. Comme un ballonnement de base de code. Comme votre CSS de ne pas consommer. Comme un lent processus de construction ou d'être coincé à un monolithe de back-end qui fait de l'itération presque impossible. Comme inexpérimenté devs de ne pas comprendre ce qui se passe et faire un gâchis de choses.
Vous savez. La réalité. Mais bon, qui se soucie de qui?
4) Immutabilité fait usage de Les Types De Référence pour réduire l'impact sur les performances de suivi de chaque changement d'état.
Parce que sérieusement, si vous voulez copier des trucs à chaque fois vos modifications de l'état, de mieux vous assurez-vous que vous êtes intelligent à ce sujet.
5) Immutabilité vous permet d'ANNULER les choses.
Parce er.. c'est le numéro un de la fonctionnalité de votre chef de projet est le point de demander, non?
6) état Immuable a beaucoup de fraîcheur potentiel en combinaison avec les WebSockets
Dernier mais non le moindre, l'accumulation de l'état deltas donne un joli cas en combinaison avec les WebSockets, ce qui permet une consommation facile de état des flux de immuable événements...
Une fois que la pièce tombe sur ce concept (l'état étant un flux d'événements -- plutôt que d'un brut de l'ensemble d'enregistrements qui représente la dernière vue), l'immuable monde devient un endroit magique à habiter. Une terre de l'événement d'origine l'émerveillement et la possibilité que transcende le temps lui-même. Et quand c'est fait droit, cela peut certainement faire en temps réel des applications easier à réaliser, vous de diffuser le flux d'événements pour tous les intéressés afin qu'ils puissent construire leur propre représentation de la présenter et d'écrire leurs propres changements dans la commune de flux.
Mais à un certain point de vous réveiller et de réaliser que tout ce que l'émerveillement et la magie ne sont pas gratuits. Contrairement à vos désireux collègues, vos parties prenantes (oui, les gens qui vous payer) soucient peu de la mode et beaucoup de choses sur l'argent qu'ils paient pour fabriquer un produit qu'ils peuvent vendre. Et la ligne de fond est que plus difficile de l'écrire immuable code et plus facile à casser, plus il y a peu de point ayant une immuable front-end si vous n'avez pas de back-end pour la soutenir. Quand (et si!) vous avez enfin convaincre les parties prenantes de votre organisation que vous devriez publier et de consommer des événements par l'intermédiaire d'un poussez le techology comme les WebSockets, vous trouverez ce qu'un la douleur c'est-à-échelle dans la production.
Maintenant pour quelques conseils, si vous choisissez de l'accepter.
Un choix à écrire du code JavaScript à l'aide de PF/Immutabilité est aussi un choix à faire votre demande de code de base plus vaste, plus complexe et plus difficile à gérer. Je soutiens fermement pour la limitation de cette approche à votre Redux réducteurs.. sauf si vous savez ce que vous faites. En d'autres mots: Keep It Simple™. Vous serez mieux dans la plupart des cas. Et où vous n'êtes pas, je voudrais mettre l'accent sur l' les avantages de données immuables qui coule à travers votre (ensemble) application, plutôt que de construire un point de vue purement fonctionnel avant la fin de l'appel et la chose faite.
Maintenant, si vous êtes assez chanceux pour être en mesure de faire des choix dans votre travail, puis d'essayer et d'utiliser votre sagesse (ou pas) et faire ce qui est juste par la personne qui paie, vous. Vous pouvez vous baser sur votre expérience, sur votre intestin, ou ce qui se passe autour de vous (il est vrai que si tout le monde est à l'aide de Réagir/Redux puis il y a un argument valable qu'il sera plus facile de trouver une ressource pour continuer votre travail).. Alternativement, vous pouvez essayer soit Résumé De Développement Axée Sur L' ou Hype Développement Piloté Par Les approches. Ils pourraient être plus votre genre de chose.
En bref, la chose à dire pour l'immutabilité, c'est qu'il sera vous faire la mode avec vos pairs, au moins jusqu'à la prochaine engouement vient autour, par quel point vous serez heureux de passer sur.
Maintenant, j'ai ajouté ce que un article dans mon blog => L'immutabilité en JavaScript: allant à contre-courant. Hésitez pas à répondre si vous avez des sentiments forts vous souhaitez obtenir votre poitrine trop ;).
"hyped" !== "bad"
views
/projections
sur le sous-jacent immuable événements qui sont indexés par objet et afficher les propriétés à l'heure actuelle. Comme vous l'avez mentionné, d'autres sous-ensembles (les filtres) sont des vues étroites en bas de ces objets et aider les utilisateurs à trouver ce qu'ils sont intéressés à. Espérons que cela a du sens.En fait, le contraire est vrai: la mutabilité rend les choses plus compliquées, au moins dans le long terme. Oui, c'est votre premier codage plus facile parce que vous pouvez simplement changer les choses là où vous le voulez, mais quand votre programme va plus cela devient un problème – si une valeur a changé, ce qui a changé?
Quand vous faites tout immuables, cela signifie que les données ne peuvent pas être modifiés par surprise, pas plus. Vous savez pour certain que si vous passez une valeur dans une fonction, il ne peut pas être changé dans cette fonction.
Dit simplement: si vous utilisez des valeurs inaltérables, il est très facile de raisonner à propos de votre code: tout le monde obtient un unique* copie de vos données, de sorte qu'il ne peut pas futz avec elle et d'endommager d'autres parties de votre code. Imaginez combien cela rend plus facile de travailler dans un environnement multi-thread!
Note 1: Il existe un potentiel de performance coût de l'immuabilité en fonction de ce que vous faites, mais des choses comme Immutable.js optimiser du mieux qu'ils peuvent.
Note 2: Dans le cas improbable où vous n'étiez pas sûr, Immutable.js et ES6
const
signifier des choses très différentes.Oui, de nouvelles de votre exemple est parfaitement bon, et votre raisonnement est tout à fait vrai: vous ne pouvez pas modifier votre liste actuelle, alors vous avez besoin pour créer un nouveau:
Imagine how much easier this makes working in a multi-threaded environment!
-> Ok pour les autres langues, mais ce n'est pas un avantage en monothread JavaScript.Bien que les autres réponses sont beaux, pour répondre à votre question au sujet d'une pratique de cas d'utilisation (d'après les commentaires sur les autres réponses) permet de sortir de votre code en cours d'exécution pendant une minute et regardez omniprésente, la réponse juste sous votre nez: git. Qu'arriverait-il si à chaque fois que vous avez poussé un commit, vous écrasait les données dans le référentiel?
Nous sommes maintenant à l'un des problèmes, immuable collections de visage: la mémoire de la météorisation. Git est assez intelligent pour ne pas simplement faire de nouvelles copies de fichiers chaque fois que vous faites un changement, simplement, il assure le suivi de la diff.
Alors que je ne connais pas beaucoup de choses sur le fonctionnement interne de git, je ne peux que supposer qu'il utilise une stratégie similaire à celle des bibliothèques de référence: structurelle de partage. Sous le capot, les bibliothèques utilisent essaie ou d'autres arbres pour ne suivre les nœuds qui sont différents.
Cette stratégie est aussi assez performant pour les structures de données en mémoire qu'il y a bien connu arbre-fonctionnement des algorithmes qui fonctionnent en temps logarithmique.
Un autre cas d'utilisation: dites que vous voulez un bouton annuler sur votre webapp. Avec immuables représentation de vos données, la mise en œuvre de telles est relativement trivial. Mais si vous comptez sur la mutation, cela signifie que vous avez à vous soucier de la mise en cache de l'état du monde et de faire les mises à jour atomiques.
En bref, il y a un prix à payer pour l'immuabilité dans les performances d'exécution et la courbe d'apprentissage. Mais tout programmeur expérimenté vous dira que le débogage de temps l'emporte sur le code-le temps de rédaction d'un ordre de grandeur. Et le léger coup sur les performances d'exécution est probablement compensé par l'état-les bugs liés à vos utilisateurs n'ont pas à endurer.
Immutabilité peuvent être suivis dans des contextes différents, mais le plus important serait la suivre à l'encontre de l'état de l'application et à l'encontre de l'INTERFACE de l'application.
Je vais envisager le JavaScript Redux motif très à la mode et modernes de l'approche et parce que vous avez mentionné.
Pour l'UI, nous avons besoin de le faire prévisible.
Il sera prévisible si
UI = f(application state)
.Applications (en JavaScript) ne modifiez pas l'état, via des actions mises en œuvre à l'aide de la réducteur de la fonction.
Le réducteur fonction simplement de l'action et de l'ancien état et renvoie le nouvel état, en gardant l'ancien état intact.
L'avantage: vous voyagez dans le temps des etats-unis depuis tous les objets d'état sont enregistrés et vous pouvez effectuer le rendu de l'application, en tout état depuis
UI = f(state)
De sorte que vous pouvez annuler/refaire facilement.
Se trouve être la création de tous ces états peuvent encore être efficace en terme de mémoire, une analogie avec Git est grand, et nous avons la même analogie dans le système d'exploitation Linux avec les liens symboliques (basé sur les inodes).
Sur la mutabilité
Rien n'est mauvais dans la mutabilité du point de vue technique. Il est rapide, il est de nouveau à l'aide de la mémoire. Les développeurs sont à utiliser à partir du début (que je m'en souvienne). Problème dans l'utilisation de la mutabilité et de troubles qui cela peut apporter.
Si l'objet n'est pas partagée avec quoi que ce soit, par exemple, existe dans le domaine de la fonction et n'est pas exposée à l'extérieur, il est difficile de voir les avantages de l'immuabilité. Vraiment, dans ce cas, il n'ya pas de sens à être immuable. Le sens de l'immuabilité commence quand quelque chose est partagé.
De la mutabilité des maux de tête
Mutable structure partagée pouvez facilement créer de nombreux écueils. Un changement dans une partie du code d'accès à la référence n'a pas d'impact à d'autres parties de la visibilité de cette référence. Cet impact se connecte toutes les pièces ensemble, même quand ils ne devraient pas être au courant des différents modules. Mutation dans une fonction peut se bloquer totalement différente de la partie de l'application. Une telle chose est un mauvais effet de côté.
Autre problème avec la mutation est corrompu. L'état corrompu peut se produire lorsque la mutation procédure échoue dans le milieu, et certains champs ont été modifiés et d'autres non.
Qui plus est, avec la mutation, il est difficile de suivre le changement. Simple vérification des références ne montrera pas la différence, à savoir ce qui a changé profondément chèque doit être fait. Également de suivre l'évolution de certaines observables modèle doit être mis en place.
Enfin, la mutation est en raison du déficit de confiance. Comment vous pouvez être sûr que la structure a voulu valeur, si elle peut être muté.
Comme l'exemple ci-dessus montre, en passant mutable structure peut toujours finir par avoir une structure différente. Fonction doSomething est la mutation de l'attribut donné de l'extérieur. Pas de confiance pour le code, vous vraiment ne savez pas ce que vous avez et ce que vous devrez. Tous ces problèmes parce qu': Mutable structures représentant des pointeurs de la mémoire.
Immutabilité sur les valeurs
Immutabilité signifie que le changement ne se fait pas sur le même objet,la structure, mais le changement est représenté dans une nouvelle. Et c'est parce que de référence représente non seulement de la valeur pointeur de la mémoire. Chaque changement crée de nouvelles de la valeur et de ne pas toucher à l'ancienne. De telles règles claires redonne la confiance et le code de la prévisibilité. Les fonctions sont sûrs à utiliser, car au lieu de mutation, ils traitent propres versions avec ses propres valeurs.
À l'aide de valeurs au lieu d'une mémoire conteneurs donne la certitude que chaque objet représente spécifiques immuable de la valeur et il est sûr à utiliser.
Immuable des structures représentant les valeurs.
Je suis plongée encore plus dans le sujet au moyen de l'article https://medium.com/@macsikora/the-state-of-immutability-169d2cd11310
Un autre avantage de l'Immuabilité en Javascript, c'est qu'il réduit Temporelle de Couplage, ce qui a des avantages substantiels pour le design en général. Tenir compte de l'interface d'un objet avec les deux méthodes:
Il peut être le cas que d'un appel à
baz()
est nécessaire pour obtenir l'objet dans un état valide pour un appel àbar()
pour fonctionner correctement. Mais comment savez-vous cela?De le comprendre, vous devez examiner de près la classe internes, car il n'est pas immédiatement apparent de l'examen de l'interface publique. Ce problème peut exploser dans une grande base de code avec beaucoup de mutables de l'état et des classes.
Si
Foo
est immuable, alors ce n'est plus un problème. Il est sûr de supposer que nous pouvons appelerbaz
oubar
dans n'importe quel ordre, parce que l'état intérieur de la classe ne peut pas changer.De Prendre Un Différent...
Mon autre réponse répond à la question à partir d'un très point de vue pratique, et je l'aime toujours. J'ai décidé d'ajouter ce que une autre réponse plutôt que d'un avenant à celui-là parce que c'est un ennuyeux philosophique coup de gueule qui, espérons-le, répond aussi à la question, mais ne correspond vraiment pas avec ma réponse existant.
TL;DR
Même dans de petits projets d'immutabilité peut être utile, mais ne supposez pas que parce qu'il existe, il est là pour vous.
Beaucoup, beaucoup plus de réponse
REMARQUE: pour le but de cette réponse, je suis en utilisant le mot "discipline" dans le sens de la négation de soi pour certaines prestations.
Ceci est similaire dans la forme à une autre question: "dois-je utiliser la Machine? Pourquoi sont les types de si important dans le JavaScript?". Il a une semblable réponse trop. Envisagez le scénario suivant:
Alors maintenant, vous avez un choix à faire, ne vous déplacez à Tapuscrit?
Tapuscrit a d'incontestables avantages: intellisense, la capture des erreurs dès le début, en précisant votre Api d'avance, à la facilité de fixer les choses lors d'un refactoring-casse, moins de contrôles. La machine a également une certaine coûts: certains très naturel et bon JavaScript idiomes peut être difficile de modèle, il n'est pas particulièrement puissant type de système, les annotations pousser du col, du temps et de l'effort de réécriture base de code existante, étape supplémentaire dans la construction de pipelines, etc. Plus fondamentalement, il creuse un sous-ensemble possible de corriger les programmes JavaScript en échange de la promesse que votre code est plus susceptibles être correct. C'est arbitrairement restrictive. C'est le point essentiel: vous imposer une certaine discipline qui vous limite (j'espère que de se tirer une balle dans le pied).
Revenir à la question, reformulé dans le cadre de l'alinéa ci-dessus: est-il la peine?
Dans le scénario décrit, je maintiens que, si vous êtes très familier avec une petite médiocre, JS base de code, que le choix de l'utilisation de la Machine est plus esthétique que pratique. Et c'est fine, il n'y a rien mal avec l'esthétique, elles ne sont simplement pas nécessairement convaincante.
Scénario B:
En arrière quand vous étiez 5k LoC gars/fille, il n'a tout simplement pas beaucoup d'importance. Même la documentation n'était pas que un gros problème, même de revenir à une certaine partie du code au bout de 6 mois vous avez pu le comprendre assez facilement. Mais maintenant, la discipline n'est pas seulement agréable, mais nécessaire. Cette discipline ne peut pas porter sur la Machine, mais sera susceptibles d'impliquer une certaine forme de l'analyse statique ainsi que toutes les autres formes de codage de la discipline (documentation, guide de style, scripts de compilation, les tests de régression, CI). La Discipline n'est plus un de luxe, c'est un nécessité.
Tout cela appliqué à
GOTO
en 1978: votre dinky peu de jeu de blackjack en C pourrait utiliserGOTO
s et les spaghettis de la logique et ce n'était pas un gros problème pour choisir-votre-propre-aventure votre chemin à travers elle, mais que des programmes est devenu plus grand et plus ambitieux, bien, indisciplinés utilisation deGOTO
ne pouvait pas être soutenue. Et tout cela s'applique à l'immutabilité aujourd'hui.Comme types statiques, si vous ne travaillez pas sur une grande base de code avec une équipe d'ingénieurs de maintenir et de l'étendre, le choix de l'utilisation de l'immuabilité est plus esthétique que pratique: les bénéfices sont toujours là, mais ne peuvent pas l'emporter sur les coûts encore.
Mais comme avec toutes les disciplines, il arrive un point où il n'est plus facultatif. Si je veux maintenir un poids santé, puis de la discipline impliquant la crème glacée peut être facultatif. Mais si je veux être un athlète de compétition, mon choix de savoir si ou de ne pas manger de la crème glacée est subsumé par mon choix d'objectifs. Si vous voulez changer le monde avec le logiciel, l'immuabilité peut-être partie de ce dont vous avez besoin pour éviter qu'il s'effondre sous son propre poids.
Une fois, il y avait un problème avec la synchronisation des données entre threads. Ce problème a été une grande douleur, il y avait 10+ solutions. Certaines personnes ont essayé de résoudre radicalement. C'était un endroit où la programmation fonctionnelle est né. Il est juste comme le Marxisme. Je ne pouvais pas comprendre comment Dan Abramov vendu cette idée en JS, parce qu'il est mono-thread. Il est un génie.
Je peux donner un petit exemple. Il y a un attribut
__attribute__((pure))
dans gcc. Les compilateurs essaie de le résoudre si votre fonction est pur ou pas, si vous ne declear spécialement. Votre fonction peut être pur, même votre état est mutable. L'immuabilité est seulement un de plus de 100 façons de vous garantir fonction sera pur. En fait 95% de vos fonctions seront purs.Vous ne devriez pas utiliser toutes les limitations (comme l'immuabilité) si vous avez réellement n'avez pas de raison sérieuse. Si vous voulez "Défaire" de l'état, vous pouvez créer des opérations. Si vous voulez simplifier les communications que vous pouvez envoyer des événements avec des données immuables. C'est à vous.
Je suis en train d'écrire ce message post le marxisme de la république. Je suis sûr que la radicalisation de toute idée est une mauvaise façon.
Je pense que la principale raison pro des objets immuables, est de garder l'état de l'objet valide.
Supposons que nous avons un objet appelé
arr
. Cet objet n'est valide que lorsque tous les articles sont de la même lettre.si
arr
devenir un objet immuable, alors nous allons être sûr arr est toujours dans un état valide.arr
mutera chaque fois que vous appelezfillWithZ