9

物心ついた頃から iOS アプリを作っていましたが、最近インターンシップでプログラミングを学ぶまで、自分のプログラミング スタイルはあまり成熟していませんでした。オブジェクト指向の概念を理解していないと人生はつまらないことに気づいたので、早い段階で多くの OO の概念を学びましたが、MVC パターンについては、決して自分自身に学ばせたことはありませんでした。

SolarSystemView文脈を説明するために、単一の ( のサブクラス)内に太陽系を描いているとしましょうUIView。クラス(すべての重要な惑星および恒星のプロパティを持つデータ構造を含むクラス)SolarSystemViewのインスタンス変数を持つべきですか、それとも のインスタンスの所有権の下にあるべきですか? それとも全く違うものですか?満足のいく答えを与えるサンプルコードが見つかりません。SolarSystemSolarSystemViewController

ビューがモデルを所有していれば、操作は非常にスムーズになると思いますが、それもスタイルが良くないように感じます。結局のところ、SolarSystemインスタンスは何らかの方法で動的に変更する必要があり、更新と同じまたは同様のレートで変更する必要がありSolarSystemViewます。

4

2 に答える 2

6

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

たとえば、cs193pでは、CalculatorViewController(Controller)にCalculatorBrain(Model)プロパティがあり、これと相互作用して、ビューに表示する方程式の結果を取得します。

あなたの特定の例では、SolarSystemViewControllerはおそらく、への強い参照を持っているでしょう。それは、更新が必要なときにそれ自体を描画できるように、SolarSystemそれが渡すデータをポーリングします。SolarSystemViewまた、は、ユーザーが操作しSolarSystemViewたときに通知して、実行できる他のタスクの中でも、他のビューを表示したり、を更新したりできるようにする場合があります。SolarSystemViewControllerSolarSystem

CocoaとCocoaTouchのMVCパラダイムは、Smalltalkのように他の場所で見られるMVCのより一般化されたバージョンとは少し異なることに注意してください。たとえば、MVCのWikipediaページを見ると、図はこれまで学習してきたものとは異なって見えるはずです。実際、GoF(デザインパターン)はMVCをこのように記述しています。

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

どちらの場合も、モデル自体がビューに接続して更新します。ただし、iOSでは、モデルとビュー間の相互作用はコントローラーを介して処理されます。これは、cs193pの最初のセッションと、MVC関係に関するApple自身のドキュメントで詳しく説明されています。そうすれば、他の場所でモデルとビューを再利用するためにコントローラーコードを書き直すだけで済みます。

明確にするために、cs193pのMVC図を次に示します。

モデルビューコントローラー

于 2013-03-16T19:15:23.080 に答える
0

この場合、SolarSystemView に SolarSystem クラスのインスタンスを含めないでください。SolarSystemViewController は、ビュー (SolarSystemView) とモデル (SolarSystem) の間を行き来する必要があります。

于 2013-03-16T19:46:14.073 に答える