私が開発するアプリケーションは、最初は Flux で構築されました。
しかし、時間が経つにつれて、アプリケーションの保守が難しくなりました。非常に多くのアクションがありました。そして通常、 1 つのアクションは 1 つの場所(ストア)でのみ聴取されます。
アクションを使用すると、すべてのイベント ハンドラー コードを 1 か所に記述しなくても済みます。したがって、これの代わりに:
store.handleMyAction('ha')
another.handleMyAction('ha')
yetAnotherStore.handleMyAction('ha')
私は書くことができます:
actions.myAction('ha')
しかし、私はそのようにアクションを使用することはありません。これは私のアプリケーションの問題ではないことはほぼ確実です。
アクションを呼び出すたびに、store.onSmthHappen
の代わりに呼び出すことができaction.smthHappen
ました。
もちろん、1 つのアクションが複数の場所で処理される場合は例外があります。しかし、それが起こると、何かがうまくいかなかったように感じます。
アクションを呼び出す代わりにストアからメソッドを直接呼び出すとどうなるでしょうか? 私のアプリケーションはそれほど柔軟ではありませんか? いいえ!名前を変更するだけで発生します(まれな例外を除きます)。しかし、なんと費用がかかります!これらすべてのアクションにより、アプリケーションで何が起こっているのかを理解することは非常に難しくなります。複雑なアクションの処理を追跡するたびに、それらが処理されているストアを見つける必要があります。次に、これらのストアで、別のアクションを呼び出すロジックを見つける必要があります。など。
今、私は私の解決策に来ます:
ストアから直接メソッドを呼び出すコントローラーがあります。アクションの処理方法に関するすべてのロジックがストアにあります。WebAPI への呼び出しも格納します (通常、1 つの WebAPI に関連する 1 つのストアとして)。イベントを複数の Store で (通常は順番に) 処理する必要がある場合、コントローラーはストアから返された promise を調整することでこれを処理します。それ自体のプライベート メソッドでのシーケンシャル (一般的に使用される) の一部。また、コントローラーのメソッドは、それらを処理の単純な部分として使用できます。したがって、コードを複製することは決してありません。
コントローラ メソッドは何も返しません (一方向フロー)。
実際、コントローラーには、データを処理する方法のロジックが含まれていません。それは、どこで、どの順序でポイントだけです。
ストアでのデータ処理のほぼ全体像を見ることができます。ストアには、別のストアと対話する方法に関するロジックはありません(flux を使用すると、多対多の関係に似ていますが、アクションのみを介して行われます)。これでストアは、ドメイン モデル (コレクション) のロジックのみを担当する、非常にまとまりのあるモジュールになりました。
フラックスの主な (私の意見では) 利点はまだここにあります。
その結果、データの唯一の真のソースである店舗があります。コンポーネントはストアにサブスクライブできます。また、コンポーネントは以前と同じメソッドを呼び出しますが、代わりに をactions
使用しcontroller
ます。Reactとのやり取りは全く変わりませんでした。
また、イベント処理も明らかになります。これで、コントローラーのハンドラーを見るだけですべてが明確になり、デバッグがはるかに簡単になります。
質問は:
アクションが流動的に作成されたのはなぜですか? そして、私が見逃したそれらの利点は何ですか?