ビュー内の複雑なコンポーネント間の相互作用を調整するためのベスト プラクティスは何ですか?
コンボ ボックスやグリッド コントロールのような単純なウィジェットについて話しているのではなく、複数のウィジェットで構成されていて、それ自体で単体テストを行うに値するコンポーネントについて話しているのです。
あなたは:
- 各コンポーネントの抽象インターフェースを定義し、
コントローラーに任せる依存性注入を介してそれらを接続し、メソッド呼び出しを介して互いに直接通信できるようにしますか? したがって、コンポーネントは他のコンポーネントのインターフェースを認識します。 - 各コンポーネントが起動できるイベントを定義し、
コントローラーに任せるイベントリスナーを介して相互に直接接続しますか? したがって、コンポーネントには、他のコンポーネントのイベント シンクにアタッチされたイベント ハンドラがあります。 - 各コンポーネントの抽象インターフェイスを定義し、それらが起動できるイベントを定義し、
コントローラーに任せるすべてのイベントをリッスンし、インターフェイスでメソッド呼び出しを実行しますか? したがって、コンポーネントは他のコンポーネントに対して完全に不可知です。 - オブザーバー パターンの古典的なアプリケーションですか?
- 他に何か?
更新: #1 から 3 までの「let the Controller ...」を削除しました。これらの場合、ルーティング/オーケストレーションを行う必要があるのは必ずしも Controller であるとは限らないためです。ビュー自体である可能性があります。
最近のプロジェクトで方法 3 を採用しましたが、コンポーネントのデカップリングと個々のテスト容易性に満足しています。しかし、コンポーネントの配線を合理化できた気がします。私の場合、メインの View オブジェクトは、各コンポーネントに複数のイベント リスナーを追加し、適切なコンポーネントのメソッドを呼び出す必要があります。これは、時々ローカル処理 (モデルとの対話など) を行った後に行います。イベント ハンドラーを追加するためのコードは少し乱雑に見えます。特に、それを行うクリーンな方法を探しています。