2

私は現在Objective-Cを一歩ずつ学んでいます!現在、私の主な焦点はMVCパターンです。コンセプトをうまくまとめたかどうかはまだわかりません。

それで、少し背景情報:私は現在私のプログラムで「エンティティ」を実験しています。エンティティのモデルは、ヘルスや速度などの情報を保持します。このエンティティを利用できる非常に基本的なコントローラーをすでに実装しました。入力は、基本的に私の見解であるコマンドラインインターフェイスを介して行われます。

さて、私の質問は、エンティティコントローラがモデルプロパティからの情報にどのようにアクセスする必要があるかということです。エンティティコントローラーが処理する「エンティティ」の配列を持つことができる必要があります。

私のコントローラーの@interfaceで:私は宣言しました:

NSMutableArray *entities; 

次に、コントローラーの@implementationで、init関数をオーバーライドします。この関数では:

entities = [[NSMutableArray alloc] init]; 

新しいエンティティを「スポーン」する別の関数もあります。

- (void)spawnEntity {

Entity *entity = [[Entity alloc] init];
[entity setName:@"Default"];
...
...
[entities addObject: entity];
}

次に、メインから(後で真のビューコントローラーになります。実際にiPhoneでアプリをセットアップしたら、今はモデルといくつかのコントローラーを準備しているだけです。):

EntityController *entityController = [[EntityController alloc] init];

[entityController spawnEntity];

このアプローチはMVCパターンを利用する正しい方法ですか?私の主な関心事は、コントローラーで宣言したNSMutableArrayです。これを正しく行っているかどうかはわかりません。

フィードバックをいただければ幸いです。

ありがとうございました。

-スティーブン

4

3 に答える 3

1

MVC デザイン パターンのモデルとコントローラーを .xml にマージしましたEntityController。場合によっては、それが最適な場合もありますが、それらを互いに離したい理由がいくつかあります. それらを分割する理由は、クラス、メソッド、および変数を追加するときにコードを理解しやすくするためです。もう 1 つの理由は、コードの再利用性です。

NSMutableArrayあなたの例では、インスタンス変数を持つモデルオブジェクトの新しいクラスを作成することでこれが可能になります。次に、コントローラーは、そのクラス (またはシングルトン) のインスタンスを作成して、独自の配列ではなく、新しいエンティティを追加できます。

ただし、このアプリケーションに必要な変数が配列だけである場合は、現在のパターンに完全に固執することができます。(NSArrayまたはそのサブクラスの 1 つ) はそれ自体がモデル オブジェクトであるため、別のクラスでラップする必要はありません。

詳細については、Apple ドキュメントを参照してください。

于 2012-10-19T09:42:41.617 に答える
0

iOS アプリのデータ アクセス レイヤーにリポジトリ パターンを実装しました。これは、CoreData エンティティ フレームワークまたは REST API で使用できます。https://github.com/ducngo-tpl/Repository-Pattern-in-Objective-Cで確認してください。それが役立つことを願っています。

于 2013-03-04T08:56:50.683 に答える
0

MVC は、関心の分離を提供するためのパターンです。「モデル」と「ビュー」は、関連するオブジェクトのコレクション/グループです。各オブジェクトには完全な機能があり、オブジェクト指向の原則に準拠する必要があります。

モデル オブジェクトは、ユーザー、アカウント、アドレスなどのタイプなど、ビジネス コンセプトに関連します。

View オブジェクトは、通常、Button、Textarea などのタイプになります。

コントローラーは、ビジネス ロジックである Model オブジェクト間の対話を呼び出すためのインターフェイスを提供します。

従来、View オブジェクトは Model オブジェクトと直接通信して、表示情報を収集することができました。

于 2012-10-19T09:35:11.947 に答える