ビューは、定義上、無論理であると想定されています。ユーザーがビューを操作すると、コントローラーに通知されます。アプリで状態が変化すると、コントローラーはビューに通知します。しかし、ビューの一部またはすべてを再レンダリングするときに、ビューとそのコントローラー間の通信の性質について混乱しています。
2 人用のカード ゲームを作っているとしましょう。ビューは、デッキ、捨て札、プレイヤーの手札、およびその他の UI コンポーネントを表示する役割を果たします。プレーヤーがカードをプレイするとき、ビューはこの変更を反映する必要があり、そのようにビューに通知するのはコントローラーの仕事です。これらのオプションのうち、このイベントを処理するための最良の方法はどれですか?
コントローラーは、単に再描画するようにビューに指示します。ビューは、コントローラを介して、ゲーム ステートのすべてのパラメータにアクセスできます。これらのパラメーターを使用して、デッキ、両方のプレイヤーの手などを含むすべてを再描画します。
コントローラーは、プレイヤーがカードをプレイしたことをビューに伝えます。ビューは、プレーヤーがカードをプレイするときに、そのプレーヤーの手だけを再描画する必要があることを認識しています。オプション 1 と同様に、ビューはゲーム ステートのパラメーターを使用して、プレーヤーのハンドを再描画する方法を決定します。
(似ていますが 2 とは異なります) コントローラーは、そのプレイヤーの手札を再描画するようにビューに指示し、そのために必要なすべてのパラメーターを渡します。ビューはゲーム パラメータにアクセスできません。
私が見逃している他のアプローチはありますか?
オプション 1 は、ビューがステートレスであるため、最も簡単な 2 つの書き込みのようです。毎回すべてを再描画するだけです。しかし、同じ理由で、それは非常に無駄です。1 人のプレイヤーだけがカードをプレイした場合、両方のプレイヤーの手札を引く必要はありません。また、再描画するたびに、基本的に古いキャンバスを捨てて、すべての新しいビュー コンポーネントで新しいキャンバスを構築するため、アニメーションなどを行うのも困難です。
対極にあるオプション 3 は、ビューからロジックを削除するという点では最良のように見えますが、いくつかの問題があります。まず、すべての適切なメッセージをビューに送信することが不可欠であるため、記述するのがより困難であることがわかりました。いずれかが欠けていると、アプリの状態がビューに正しく反映されません。第 2 に、ユーザーが進行中の保存済みゲームを復元する場合などに、完全な再描画が必要な場合があるようです。
オプション 1 と 2 の両方で、ビューはゲームの状態に関するデータを「プル」しますが、オプション 3 ではこのデータを「プッシュ」します。景色?
このトピックについてご意見をお寄せいただきありがとうございます。