問題MVC
は、ビュー、コントローラー、モデルは互いにできるだけ独立している必要があると人々が考えることです。彼らはそうではありません-ビューとコントローラーはしばしば絡み合っています-それをそれと考えてくださいM(VC)
。
コントローラーはユーザーインターフェイスの入力メカニズムであり、特にGUIの場合、ビューで複雑になっています。それにもかかわらず、ビューは出力であり、コントローラーは入力です。ビューは対応するコントローラーがなくても機能することがよくありますが、コントローラーは通常、ビューがなければあまり役に立ちません。ユーザーフレンドリーなコントローラーは、ビューを使用して、ユーザーの入力をより意味のある直感的な方法で解釈します。これが、コントローラーの概念をビューから分離することを困難にしている理由です。
モデルとして、密閉ボックス内の検出フィールドにあるラジコンロボットを考えてください。
モデルはすべて、出力(表示)の概念や状態遷移をトリガーするもののない状態と状態遷移に関するものです。フィールド上でのロボットの位置を取得でき、ロボットは位置を遷移する方法を知っています(前進/後退/左/右に進みます。ビューやコントローラーがなくても簡単に想像できますが、何も役に立ちません)
(x、y)がスクロールコンソールを流れるように調整しながらロボットの位置を監視している、別の部屋のネットワーク上の別の部屋にいる誰かなど、コントローラーのないビューを考えてください。このビューはモデルの状態を表示しているだけですが、この人にはコントローラーがありません。繰り返しになりますが、このビューはコントローラーがなくても簡単に想像できます。
無線コントローラがロボットの周波数に同調している誰かがクローゼットに閉じ込められているなど、ビューのないコントローラを考えてください。このコントローラーは入力を送信し、モデルに対して(もしあれば)何をしているのかわからない状態遷移を引き起こしています。簡単に想像できますが、ビューからの何らかのフィードバックがないと、あまり役に立ちません。
ほとんどのユーザーフレンドリーなUIは、コントローラーとビューを調整して、より直感的なユーザーインターフェイスを提供します。たとえば、ロボットの現在の位置を2Dで表示し、ユーザーが画面上のたまたまロボットの前にあるポイントにユーザーが触れることができるタッチスクリーンを備えたビュー/コントローラーを想像してみてください。コントローラは、ビューポートの位置やスケール、画面上のロボットのピクセル位置を基準にしてタッチされたスポットのピクセル位置など、ビューの詳細を正しく解釈する必要があります(クローゼットにロックされている男とは異なります)ラジオコントローラー)。
私はもうあなたの質問に答えましたか?:-)
コントローラは、モデルの状態を遷移させるために使用される、ユーザーからの入力を受け取るものです。ビューとコントローラーを別々に保つようにしてください。ただし、ビューとコントローラーは相互に依存していることが多いので、それらの境界があいまいであっても問題ありません。のようですが、それは大丈夫です。ビューがモデルからのものであるため、コントローラーがビューからきれいに分離されないことを受け入れる必要がある場合があります。
...コントローラで検証などを行う必要がありますか?もしそうなら、どうすればエラーメッセージをビューにフィードバックできますか?それは再びモデルを通過する必要がありますか、それともコントローラーがビューに直接送信するだけですか?
検証がビューで行われた場合、コントローラーには何を入れますか?
リンクされたビューとコントローラーは、モデルを経由せずに自由に相互作用する必要があると言います。コントローラーはユーザーの入力を受け取り、検証を実行する必要があります(モデルやビューからの情報を使用している可能性があります)が、検証が失敗した場合、コントローラーは関連するビューを直接更新できる必要があります(エラーメッセージなど)。
これに対する酸性テストは、他の誰かの検証エラーの結果として独立したビュー(つまり、ネットワークを介してロボットの位置を監視している他の部屋の男)が何かを見る必要があるかどうかを自問することです(例:クローゼットの男)ロボットにフィールドから降りるように伝えようとした)。一般に、答えはノーです-検証エラーが状態遷移を妨げました。状態遷移がなかった(ロボットが動かなかった)場合は、他のビューを伝える必要はありません。クローゼットの男は、彼が違法な移行を引き起こそうとした(ビューなし-悪いユーザーインターフェイス)というフィードバックをまったく受け取っていません。
タッチスクリーンを持った男がロボットをフィールドから送り出そうとした場合、ロボットを検出フィールドから送り出してロボットを殺さないようにとのメッセージが表示されましたが、他の誰もこれを知る必要はありません。
他のビューがこれらのエラーについて知る必要がある場合、ユーザーからの入力と結果として生じるエラーはモデルの一部であり、全体が少し複雑であることを効果的に言っています...