1

Webで多くの論文や情報を読んだことがありますが、MVCは初めてです。私はそれがやや曖昧であり、MVCパターンの多くの異なる解釈があることを知っています..しかし、違いはやや最小限に見えます

私の主な質問は、M、V、およびCは、これを正しく行うために常に必要になるのでしょうか。私が読んだことの中で、誰もこれに取り組んでいるのを見たことがありません。例(私はCocoa / Obj-cで作業していますが、それほど重要ではありません)。

1)GUIに単純な画像がある場合、またはユーザーの便宜のためだけに保存​​または変更されていないテキスト入力フィールドがある場合、これらは両方ともV(ビュー)になりますが、M(データもドメインもありません)はありません処理が進行中です)、それらをブリッジするCはありません。だから私は「V」であるいくつかの側面を持っています-問題ないようです

2)2つの異なる表示ウィンドウがあり、それぞれに「ACTIVATE FOO」というラベルの付いたボタンがあります。ユーザーがどちらかのボタンをクリックすると、両方のボタンが押されて「DEACTIVATE FOO」と表示され、3番目のウィンドウが表示されます。ラベル「FOO」。ボタンをもう一度クリックすると、両方のウィンドウのボタンが「ACTIVATE FOO」に変更され、3番目の「FOO」ウィンドウが削除されます。この場合、私のVは両方のウィンドウのボタンで構成されており、3番目のウィンドウ(おそらく3つのウィンドウすべて)も推測します。私は間違いなくCを持っています。私のコントローラーオブジェクトはこれらのボタンとウィンドウを認識し、クリックを取得してウィンドウとボタンに関する一般的な状態を保持します。ただし、ボタンが1つでも10つでも、ウィンドウの名前は「FOO」、ウィンドウの名前は「BAR」のどちらでも構いません。ここにはドメイン知識やデータはありません。ビューを制御するだけです。したがって、この例では、実際には「V」と「C」がありますが、「M」はありません。大丈夫ですか?

3)私が最も実行している最後の例。ビューとしてテキスト入力フィールドがあります。これにテキスト、たとえば重力を表す数値を入力すると、重力パラメータを考慮しながら、ボールの物理を計算するなどの処理を実行できるモデルに保持されます。ここにVとMがありますが、なぜCを追加する必要があるのか​​わかりません。コントローラーはビューからの信号を受け入れてモデルに渡すだけで、その逆も同様です。Cは単なるパススルーであるため、実際には「ジャンク」コードであり、私の意見ではこれ以上再利用可能にはなりません。ほとんどの場合、何かが変更されたときは、CとMの両方をほぼ同じ方法で変更する必要があります。ほとんどの状況でVとMのみが必要であると考えるのは、おそらくMVC初心者の間違いだと思います。次の主題に私を導きます。

4)Cocoa / Xcode / IBでは、コントローラーは常にIBでインスタンス化されたオブジェクトである必要があると思いますか?つまり、すべての「V」コンポーネントをIBに配置し、Viewオブジェクト(関連するもの)のコレクションごとに、インスタンス化されたコントローラーが必要ですか?そして、おそらく私のモデルはIBで見つけられるべきではなく、代わりにそこで見つけられたコントローラーコードと結びつくXcodeのクラスとしてのみ見つけられるべきです。これは正確ですか?これは、一貫性を維持しているため、実際には付加価値のないコントローラーを使用する理由を説明している可能性があります。

5)これらに名前を付けるのはどうですか?FOO / BARに関する上記の例では、FancyWindowOpeningControllerなどのようにControllerで終わるものがCになる可能性がありますか?モデルの場合-GravityBallPhysicsModelなどの接尾辞を付ける必要がありますか、それとも好きな名前を付けるだけですか?私は野生で何が起こっているのかを知るのに十分なコードを見ていません、そして私は早い段階で正しい軌道に乗りたいです

私をまっすぐにするか、私が正しい軌道に乗っていることを知らせてくれて、事前に感謝します。私はそれを理解し始めているように感じます、そして私がここで言うことのほとんどは理にかなっています、しかし私の推測の検証は私が自信を持って感じるのを助けるでしょう。

4

1 に答える 1

4

あなたの例はすべて、個々の操作/機能をアプリ全体のデザインと混同していると思います。したがって、すべての質問に対する一般的な答えは、いいえ、アプリのすべての操作または機能が3つのMVCコンポーネントすべてを使用する必要はないということです。

MVC設計の本当の目標は、各コンポーネントを可能な限りモジュール化してスタンドアロンにすることです。したがって、各コンポーネントの各操作に3つのMVCコンポーネントすべてを含める必要があると、そもそもデザインパターンの目的が損なわれます。

モデルとビューは、原則として他がなくても機能するように設計する必要があります。モデルは、データがウィンドウ、Webビュー、ファイル、印刷、またはコマンドラインで表示されているかどうかに関係なく機能する必要があります。ビューは、自分自身の空のバージョンを表示できる必要があります。コントローラーだけがモデルオブジェクトとビューオブジェクトの両方の知識を持っている必要がありますが、それはコントローラー全体の目的が2つをリンクすることであるためです。

あなたの質問:

(1)UI要素が直接ビューの外部にあるものを参照する必要がない場合、UI要素を制御するロジックはビューに属します。別のモデルと別のコントローラーを使用して別のプロジェクトにビューを移動でき、それでも機能する場合は、ビューが適切にカプセル化されていることがわかります。

(2)この場合、何もモデリングしていないため、モデルは必要ありません。モデルは、物理的なオブジェクトまたはアクションのデータ表現です。ウィンドウとコントロールに代表的なデータが表示されない場合は、モデルは必要ありません。彼らはただ自分自身を描いているだけです。

(3)コントローラーが必要なので、モデルとビューのどちらかを変更するたびに、もう一方を書き直す必要がありません。小さなプロジェクトではすぐにはわかりませんが、いくつかの異なるインターフェイス(UI、ネットワーク、ディスク操作など)と各インターフェイスでのさまざまな表現方法を備えたプロジェクトを取得すると、ビューをモデルに結び付けると急いで壊れます。

(4)コントローラーがない場合は、モデルにすべてのビューへの参照が含まれている必要があります。ニブシステムは、ニブ内の他のオブジェクトを管理するオブジェクトとしてコントローラーを使用します。階層オブジェクトが必要であり、ファイル所有者がその役割を果たします。

(5)名前は長く、わかりやすい名前の方が適しています。今から6か月後、メンテナンスを行うために戻ってきたとき、どのウィンドウ「WindowOpeningController」が開いているのか、またはそれが特別なことをしているのかを思い出せません。

MVCを評価する最良の方法は、一歩下がって、本当に大きく、本当に複雑で、常に進化しているアプリについて考えることです。次に、さまざまなアプリでコンポーネントを再利用することを追加します。次に、各コンポーネントのデバッグを追加します。なぜそれが素晴らしいデザインパターンであるのかがすぐに明らかになります。

于 2010-06-14T19:06:42.877 に答える