0

現在、Objective-C (iPhone 用) でゲームを作成しています。

このため、パフォーマンス/複雑さの理由から MVC を少し壊し、ビュー (レンダラー) にモデルへの直接参照を与えています。これは、60 fps で実行されることが想定されており、モデルの状態に基づいて常に更新されているためです。

モデルの他のクラスがそれらにアクセスして設定する必要があるため、モデルのヘッダー ファイルに読み書き可能なプロパティがあります。しかし、それらは私の見解では読み取り専用として機能するはずです。したがって、パブリック/プライベート メソッドを分離する必要があるという問題があります。

これに対する典型的なアプローチは、ビューがインポートする通常の「Xh」ヘッダーと、他のモデルクラスが内部で使用するための別の「X_private.h」を持つことだと思います。

私の Java 開発者の友人は、プロトコルを使用した別のアプローチを提案しました。

彼は、ビューが参照するパブリック メソッドを含む「IX.h」のような NSObject のプロトコルを作成することを提案しました。次に、クラス (Xh/Xm) のヘッダーに (モデル全体に​​関して) プライベート メソッドを設定し、そのクラスにプロトコルを実装させるだけです。

抽象化のレイヤーをさらに追加するので、これはかなりクールに思えます。基になるモデル クラスとその動作を変更することにした場合でも、パブリック プロトコルを実装している限り変更できます。ビューは、モデルが実際にどのクラスを下で使用しているかさえ知りません。

このアプローチの明らかな欠点は見当たりませんが、Objective-C で以前に行ったことはありません。

これは良いアプローチですか、それとも何か不足していますか?

この問題に対する他の良いアプローチはありますか?

4

1 に答える 1

2

あなたの友人が提案したことはまったく問題ありません。ただし、モデルの読み取り/書き込みプロパティは引き続きアクセス可能であり、誤って使用される可能性があります。

私が考えることができるより良いアプローチは、クラス拡張/匿名カテゴリを使用することです。このアプローチでは、モデル クラスのデフォルト インターフェイスに読み取りアクセサーのみが含まれます。

モデル

@interface Model:NSObject

-(NSNumber *)readProperty1;
-(NSString *)readProperty2;

@end  

モデル+ReadWrite.h

@interface Model()

@property(strong) NSString *property1;
@property(strong) NSString *property2;

@end

Model+ReadWrite.hModel.m または必要な他のモデルにインポートすることで、モデルの一般的なインターフェイスが readonly メソッドのみを公開している間に、すべてのプロパティにアクセスできます。

于 2013-10-23T06:57:12.840 に答える