不変性の逆張り的見方
TL / DR:不変性は、JavaScriptでの必要性よりファッショントレンドです。Reactを使用している場合は、状態管理での混乱を招くいくつかの設計の選択肢にきちんとした回避策を提供します。ただし、他のほとんどの状況では、それがもたらす複雑さに対して十分な価値を追加することはなく、実際のクライアントのニーズを満たすよりも、履歴書を埋め込むために役立ちます。
長い答え:以下をお読みください。
JavaScriptで不変性がそれほど重要(または必要)なのはなぜですか?
さて、あなたが尋ねてうれしいです!
先日、Dan Abramovと呼ばれる非常に才能のある男が、純粋な関数と不変性を使用するReduxと呼ばれるjavascript状態管理ライブラリを書きました。彼はまた、アイデアを非常に理解しやすく(そして販売しやすく)するいくつかの本当にクールなビデオを作りました。
タイミングは完璧だった。Angularの目新しさが薄れ、JavaScriptの世界は適切なクールさを備えた最新のものにこだわる準備ができていました。このライブラリは革新的であるだけでなく、別のシリコンバレー発電所によって売り出されていたReactと完全に組み入れられました。
悲しいことに、ファッションはJavaScriptの世界を支配しています。今、アブラモフは半神として称賛されており、私たちすべての単なる人間は不変性の道に身を任せなければなりません...それが理にかなっているかどうか。
オブジェクトの変更の何が問題になっていますか?
何もない!
実際、プログラマは変異するオブジェクトが存在する限り、オブジェクトをer ...に変異させています。言い換えれば、50年以上のアプリケーション開発。
そして、なぜ物事を複雑にするのですか?オブジェクトがcat
あり、オブジェクトが停止した場合cat
、変更を追跡するために本当に1秒必要ですか?ほとんどの人は言うだけcat.isDead = true
でそれで終わります。
(オブジェクトの変更)は物事を単純にしませんか?
はい!..もちろんそうです!
特にJavaScriptの場合、これは実際には、他の場所(データベースなど)で維持されている状態のビューをレンダリングするのに最も役立ちます。
更新する必要がある新しいNewsオブジェクトがある場合はどうなりますか?...この場合、どうすれば達成できますか?ストアを削除して再作成しますか?オブジェクトを配列に追加する方が安価な操作ではありませんか?
まあ、従来のアプローチでNews
オブジェクトを更新すれば、そのオブジェクトのメモリ内の表現が変化します(そして、ユーザーに表示されるビューなどが変わるでしょう)...
または代わりに...
セクシーなFP / Immutabilityアプローチを試して、News
オブジェクトへの変更をすべての履歴変更を追跡する配列に追加して、配列を反復処理し、正しい状態表現が何であるかを理解することができます(ふw !)。
私はここで何が正しいのかを学習しようとしています。教えてください:)
ファッションは行き交う。猫の皮をむく方法はたくさんあります。
絶えず変化するプログラミングパラダイムのセットの混乱に耐えなければならないのは残念です。しかし、ちょっと、クラブへようこそ!!
ここで、不変性に関して覚えておくべき重要なポイントが2つあります。これらは、初心者だけが集めることができる熱狂的な強さで投げつけられます。
1)不変性は、マルチスレッド環境での競合状態を回避するのに最適です。
マルチスレッド環境(C ++、Java、C#など)は、複数のスレッドがオブジェクトを変更したい場合にオブジェクトをロックする習慣があります。これはパフォーマンスに悪影響を及ぼしますが、データ破損の代替手段よりも優れています。しかし、すべてを不変にするほどよくはありません(主はHaskellを賞賛します!)。
しかし悲しいかな!JavaScriptでは、常にシングルスレッドで動作します。Webワーカー(それぞれが別のコンテキスト内で実行されます)。したがって、実行コンテキスト内でスレッド関連の競合状態(これらすべての素敵なグローバル変数とクロージャー)を持つことはできないので、不変性を支持する主要なポイントは枠を超えています。
(そうは言っても、Webワーカーで純粋な関数を使用することには利点があります。つまり、メインスレッド上のオブジェクトをいじる必要はありません。)
2)不変性は、(何らかの形で)アプリの状態の競合状態を回避できます。
そして、これが問題の本当の核心です。ほとんどの(React)開発者は、不変性とFPが、アプリケーションの状態を予測可能にするこの魔法を何らかの形で機能させることができると伝えます。
もちろん、これはデータベースの競合状態を回避できることを意味するものではありません。そのため、すべてのブラウザーですべてのユーザーを調整する必要があります。そのためには、WebSocketsなどのバックエンドプッシュテクノロジー(アプリの実行者全員に変更をブロードキャストします。
また、JavaScriptには、アプリケーションの状態を予測可能にするために不変性が必要な固有の問題があるという意味でもありません。
このやや紛らわしい主張は、単にReactを使用するとアプリケーションの状態が競合状態になりやすくなることを意味しますが、その不変性により、その痛みを取り除くことができます。どうして?Reactは特別なので、コヒーレントな状態管理が2番目に行われる高度に最適化されたレンダリングライブラリとして設計されているため、コンポーネントの状態は、制御できないイベントの非同期チェーン(別名「一方向データバインディング」)によって管理されます。以上、状態を直接変更しないことを思い出してあなたに依存しています...
このコンテキストを考えると、不変性の必要性がJavaScriptとほとんど関係がなく、Reactの競合状態と多くの関係があることが簡単にわかります。あなたの状態は現在であり、混乱することになるので、不変性を使用してすべての履歴変更を追跡することは完全に理にかなっています。
3)競合状態は明らかに悪い。
まあ、Reactを使用している場合はそうかもしれません。ただし、別のフレームワークを選択した場合はまれです。
その上、通常、対処する必要があるはるかに大きな問題があります...依存関係の地獄のような問題。肥大化したコードベースのように。CSSが読み込まれないように。ビルドプロセスが遅い、または反復がほぼ不可能になるモノリシックなバックエンドに行き詰まっているようなものです。経験の浅い開発者のように、何が起こっているのかを理解せず、物事を混乱させるようなものです。
ええと。現実。しかし、ねえ、誰がそれを気にしますか?
4)不変性は参照タイプを利用して、すべての状態変化を追跡することによるパフォーマンスへの影響を軽減します。
なぜなら真剣に、状態が変化するたびにコピーするつもりなら、それが賢明であることを確認した方がいいからです。
5)不変性により、元に戻すことができます。
なぜなら、これは、プロジェクトマネージャーが求める最大の機能だからです。
6)不変状態はWebSocketsと組み合わせて多くの素晴らしい可能性を秘めています
最後に重要なことですが、状態デルタの蓄積は、WebSocketsと組み合わせてかなり説得力のある事例を作り出します。これにより、不変のイベントのフローとして状態を簡単に消費できます ...
ペニーがこの概念に落ちたら(状態はイベントの流れであり、最新のビューを表す大まかなレコードのセットではなく)、不変の世界が住む魔法の場所になります。時間そのものを超越する、イベントが生み出す驚異と可能性の土地。完了したら、右、これは間違いなくリアルタイムでEASIアプリ作ることができるとER達成するために、あなたはちょうど彼らがすることができますので、興味のあるすべての人へのイベントの流れ放送、独自の表現を構築する現在のを、共同流れの中に、自分の変更を書き戻しを。
しかし、ある時点で目を覚ますと、そのすべての不思議と魔法が無料で提供されないことに気づきます。熱心な同僚とは異なり、利害関係者(そう、あなたに支払う人)は、哲学やファッションにはほとんど関心がなく、販売できる製品を構築するために支払うお金に多くの関心を持っています。そして、一番下の行は、不変のコードを書くのがより難しく、それを壊すのがより簡単であることに加えて、それをサポートするバックエンドがなければ、不変のフロントエンドを持っている意味がほとんどありません。ときに(と!あれば)、あなたは最終的にあなたが公開する必要があることをあなたの利害関係者を説得し、経由でイベントを消費プッシュtechology WebSocketをのような、あなたは何を見つけるの痛みは、それが生産に拡大することです。
ここで、いくつかのアドバイスとして、それを受け入れることを選択する必要があります。
FP / Immutabilityを使用してJavaScriptを作成する選択肢は、アプリケーションのコードベースをより大きく、より複雑にし、管理を困難にする選択肢でもあります。あなたが何をしているのかわからない限り、私はこのアプローチをReduxのレデューサーに限定することを強く主張します...そして、先に進んで不変を使用する場合は、不変の状態をアプリケーションスタック全体に適用するだけでなく、そうでなければクライアントの真の価値を見逃しているので、クライアント側。
さて、あなたがあなたの仕事で選択をすることができるほど幸運であるならば、あなたの知恵を試してみて(またはそうではない)、あなたに支払っている人が正しいことをしてください。これは、経験、内臓、または周囲の状況に基づいて行うことができます(確かに、全員がReact / Reduxを使用している場合は、作業を続行するためのリソースを見つける方が簡単であるという有効な議論があります)。Resume Driven DevelopmentまたはHype Driven Developmentのいずれかのアプローチを試すことができます。彼らはもっとあなたのようなものかもしれません。
要するに、不変性について言われるべきことは、少なくとも次の流行が来るまで、あなたが仲間とファッショナブルになるということです。
このセルフセラピーのセッションの後で、これをブログの記事として追加したことを指摘したいと思います => JavaScriptの不変性:逆張りのビュー。あなたが胸から降りたいという強い気持ちを持っているなら、そこに気軽に返信してください;)