?FacebookのFluxサイトが、その理由を説明している:MVCアプリケーションでは、モデル間の連鎖更新によって不安定な状態となり、正確なテストが非常に困難になることがあるが、ストアに自動更新をまかせると、MVCアプリケーションにありがちな多くのもつれを取り除いてくれる。リデューサーは外から状態を変えても動く。Fluxは確かにMVCアプリケーションにありがちな多くのもつれを取り除いてくれるが、MVCアプリケーションがそれ自身を変更しているからだとは思わない。私の経験から思うに、名付けたアクションのコンテキストに正確に書き込んでいるからだ。私には、これがFluxのもたらす大きな拡張であるように思える。UI状態の大きな問題は、異なった状態のオブジェクト間における依存関係が、劇的にアクションのコンテキストを変えてしまうことだ。あるアクションのコンテキストにおいて、状態オブジェクトAは状態オブジェクトBに依存する。一つのアクションコンテキストでは、同じ状態オブジェクトAはBから完全に分離しているかもしれない。これはまさにBackboneスタイルのモデルチェンジイベントを使う際に陥りがちな罠だ。モデルAが、アクションのコンテキストを考慮に入れずに、モデルBからの更新をリッスンする。モデル間オブザーバのような依存関係を示す静的パターンは、UIプログラミングにおいてはうまく働かない。要求された変更のコンテキストを、依存関係が劇的に変えるからだ。あるアクションの全書き込みに関する概観を求めることは、関連した状態の変更を決定するアクションコンテキストの重要性や状態オブジェクト間の依存関係に起因する。あなたが全ストア内の名付けたアクションに対処しなければならない時、Fluxはこのことをある程度うまくやってくれる。いつもこの調子でいかないのか?グローバルな状態ツリーとリデューサーがあれば、さらに踏み込むことだってできる。リデューサーはやっぱり問題を解決してくれる!なぜ私たちは、リデューサーが状態を潜在的に更新できるようにしないのだろうか?そうすれば、必要に応じて様々な状態オブジェクト間の依存関係を築きながら、少し書いただけでアクションの更新工程を一か所に全部宣言できたかもしれない。これはつまり、全てのアクションを一回だけ処理するということだ。あなたが、リデューサーの使用に必要な前提であるグローバルなAppStateを持っていたとしよう。起こり得る全てのアクションとあらゆる状態の処理をするリデューサーを一つ登録するだけだ。書き込みがFooStateの書き込みに依存しているCOMPLEX_ACTIONに注意。したら、これはアプリほどには拡張しないと思うかもしれないが、そんなことはないと思う。更新の表現を豊かにしたり、実装やビジネスロジックを隠したりするために、他のリデューサーを使うのがコツだ。あなたはそれでも、別々のモジュールにおける特定の状態の断片の書き込みに関係するリデューサーを実装するかもしれない。全てのアクションを切り替える「状態の断片モジュール」ごとに一つのリデューサーを書く代わりに、書き込み条件ごとにリデューサーを書けばいい。TodoStateモジュールの中は以下のようになる。なく、todoを追加する実際のオペレーションの実装をする。それからaddTodoリデューサーをグローバルなアプリ状態リデューサーにおいて使う。これの素晴らしいところは、使うリデューサーのインターフェイスを自由に選べることだ。それにより、ブーリアン引数における依存関係がより明確になる。このアプローチには、たくさんの良いところがある:アクションをトリガする全書き込みの要約文書を一か所に持つことができる。2つの異なった集約レベルにおいて、何がどの順番から、どのように変更されるかという宣言を明確に分けることができる。望む場面において、関連するビジネスロジックを含む状態の更新をするリデューサーを分けることができる。「これ全部、同じアクションの影響を受けるから1つのストアになきゃダメだな」という日々はもう遠い昔だ。再利用でき、複合的かつ名前付きの状態の更新を作成するリデューサーを書くことができる。stores(ストアを半分リセットする)」)どのアクションがどの状態の断片に影響するかということに依存しない、グローバルな状態構造を保つことができる。これは、Elmとかなり似ている。このサイトを見て、アクションの明確な概観とそれが与える状態への影響をチェックしてみてほしい。Reduxでこれをやるのは簡単だ。グローバルなアプリリデューサーを一つ登録すれば、他の未登録リデューサーも作成してくれる。依存関係すら必要ないだろう。一つのリデューサーを処理するグローバルな状態ストアを書くためのコードは、ほんの2~3行だからだ。上述のプロパティでシステムを実装する方法は、数え切れないほどある。全アクションではなく特定のアクショングループを処理する多重リデューサーを実装する可能性がある。アクションごとのリデューサーの宣言までしてしまい、ステートメントを切り替えてしまう可能性すらある。重要なポイントは、状態の断片によってではなく、アクションによって書き込みを概念的に一次配置することだ。この方法で、全てのアクションが1回だけ処理されることになり、あなたの複合的な書き込みを一層包括的にしてくれる。これについて考えれば考えるほど、全更新を記述するために、一つのリデューサー内にある特定の小さい状態の断片にアクションを切り替えることがますますおかしく思えてくる。私はある程度大きいアプリを除いて、状態の断片を処理するアクションを「小さくする」ことはそこまで役に立たないと考えている。言い換えると、起こり得る全てのアクションに切り替えるストアのような実体は、たった一つだけ、もしくはごくわずかしか持つべきでない。リデューサーですごくわかりづらい書き込みをすれば、システムの悪用も難しくないと思う。それは、多くのチームにとって管理しやすい課題のように思える。一方で、アクションのコンテキストには、たとえベテラン開発者であっても注意が必要だ。このことはできる限り強調しておきたいし、集中型のコンテキスト設定は、非集中型のそれよりもずっと理解しやすい。リデューサーを作ることで、全てのコンテキストの依存関係を非常に美しく処理できるようになるだろう。したら欠点をいくつか書き忘れたかもしれないけれど、それについては今から1年以内に書くつもりだ。一つ確かなことがある。それは、リデューサーを使うことでたくさんの自由を手に入れることができるということだ。私たちは多分、古いFluxのやり方にただ固執するのではなく、リデューサーを体系化する様々なやり方を探っていくべきなのだと思う。原文:http://www.code-experience.com/problems-with-flux/(2015-7-28)※元記事の筆者には直接翻訳の許可を頂いて、翻訳・公開しております。1秒間あたり3,000枚の画像(約200GB)を作成し持続している。Uberがリアルタイムマーケットプラットフォームをスケールしている方法Uberは、たった4年で38倍という目覚ましい成長を遂げたという。Bots」に先駆けて、V8はどうやってJavaScriptコードを最適化しているのか?僕の過去記事で、NodeJSがなぜ速いかについて話した。今日は、V8について話したいと思う。ソーシャルコーディングという言葉が一昔前に流行りましたがCrystalの紹介:Cのように速く、Rubyのように滑らか僕は、Rubyistだ。