2013-03-16 11 views
7

私は覚えているので、私はiOSアプリケーションを作ってきましたが、最近私がインターンシップのプログラミングをしてからは、プログラミングスタイルが熟していません。私は人生が彼らの理解から吸い込まれたことに気づいたので、早い段階で多くのOOの概念を学びましたが、私が自分で決して学ばなかったことの1つはMVCパターンでした。モデルをMVCパターンで所有する必要はありますか?

コンテキストを与えるために、単一のSolarSystemView(サブクラスUIView)の中に太陽系を描いているとしましょう。私のSolarSystemViewはクラスSolarSystem(すべての重要な惑星と惑星のプロパティを持つデータ構造を含むクラス)のインスタンス変数を持っているか、またはSolarSystemViewControllerのインスタンスの所有権の下にあるべきですか?それとも全く違うものなのでしょうか?私は満足のいく答えを与えるサンプルコードを見つけることができません。

ビューがモデルを所有していた場合、操作は非常にスムーズになりますが、それはまた良いスタイルのように感じられません。結局のところ、SolarSystemのインスタンスは、何らかの形で動的に変更しなければならず、SolarSystemViewの更新と同じか、それと同じ割合で変更する必要があります。

答えて

5

MVCパラダイムでは、モデルはビューから切り離されていると考えられます。描画する必要があるデータを取得するには、コントローラーにそのデータを要求します。コントローラーはそれをモデルに要求します。こうすることで、GUIから情報を切り離します。それが役立つなら、それをModel Controller Viewと考えてください。したがって、ほとんどの場合、コントローラはモデルを所有しています。

たとえば、CalculatorViewController(コントローラ)にはCalculatorBrain(モデル)プロパティがあり、このプロパティは相互作用してビューに表示する方程式の結果を取得します。

SolarSystemViewControllerSolarSystemを強く参照しています。SolarSystemViewにデータをポーリングして、更新が必要なときに自分自身を描画できるようにします。 SolarSystemViewは、他のビューを表示したり、実行可能な他のタスクのうちSolarSystemを更新できるように、ユーザが対話するときにSolarSystemViewControllerに通知することもできます。

CocoaとCocoa TouchのMVCパラダイムは、Smalltalkのように、より一般的なMVCのバージョンと少し異なります。たとえば、Wikipedia page on MVCを見ると、あなたが学んでいるものとは違った外観になるはずです。実際、GoF(デザインパターン)は、MVCをこのように説明しています。

MVCは3種類のオブジェクトで構成されています。モデルはアプリケーション オブジェクトであり、ビューはその画面プレゼンテーションであり、コントローラ はユーザーインターフェイスがユーザー入力に反応する方法を定義します。 MVCの前に、 のユーザーインターフェイスデザインは、これらのオブジェクトをいっしょにまとめる傾向がありました。 MVC は柔軟性と再利用性を高めるためにそれらを分離します。 MVCは、ビュー とモデルの間でサブスクライブ/通知プロトコルを確立することによってビューの切り離しを行います。 ビューでは、外観がモデルの状態を反映していることを確認する必要があります。 モデルのデータが変更されるたびに、モデルは が依存するビューを通知します。これに応答して、各ビューは 自体を更新する機会を得る。このアプローチでは、異なるプレゼンテーションを提供するモデルに複数のビューを添付することができます。 モデルの新しいビューを書き直すことなく作成することもできます。

これらの両方の場合、モデル自体がビューに接続して更新しています。ただし、iOSでは、モデルとビューの間のやりとりはコントローラを介して処理されます。これはfirst session of cs193pApple's own documentation on MVC relationships.でよく説明されています。そうすれば、モデルとビューを別の場所で再利用するためにコントローラコードを書き直すだけで済みます。

ここでは、明確にするためにcs193pのMVC図を示します。この場合

Model View Controller

+0

それは私が尋ねたものを完全にカバーしています。私はもう一つ質問があります。 「ダニ」は何をすべきか?明らかに、惑星が移動し続けるための目安になる必要があります。私が正しく理解していれば、タイマーを所有するコントローラーになります。その時点で、モデルが変更され、モデルからデータが取得され、画面に表示されます。これは、別の質問のための内容かもしれません。 –

+0

@CarterPapeはい、それは私に聞こえます。コントローラは、通常、モデルの更新を処理し、それに依存するビューに更新を通知します。例えば、コントローラにはゲームの実行ループが存在し、ビュー(GLKViewなど)に自身を更新するように通知する前に、ゲーム内のエージェント(モデル)に更新を通知するすべてのフレームが存在します。 – Metabble

0

、SolarSystemViewはSolarSystemクラスの任意の瞬間を含めることはできません。 SolarSystemViewControllerは、ビュー(SolarSystemView)とモデル(SolarSystem)の間にある必要があります。

関連する問題