iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
MVCのモデルは、実際の値を持っているデータ構造と、それを抽象的に見せるインタフェースから成り立っていると考えている。ビジネス・ロジックは、このインタフェース部分で実装されると考えていて、このインタフェース部分を私はDocumentというクラスで実装している。
HMDT木下誠さんの著書『iOS開発におけるパターンによるオートマティズム』で、モデルレイヤ設計パターンとして、モデルオブジェクトクラスとモデルマネージャクラスが解説されているが、ほぼ、同様なものと考えられる。
モデルの実装方法が決まったら、それをどうアクセスするかが問題となる。オッティモの小池邦人さんが、MOSADeNで説明されていたサンプルでは、アプリケーションのデリゲートクラスのインスタンス変数として持つ方法。
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
MyViewController *viewController;
MyDocument *document;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MyViewController *viewController;
@property (nonatomic, retain) MyDocument *document;
@end
こうすれば、アプリケーションのインスタンスを取得すれば、documentインスタンス変数にアクセスできる。
AppDelegate *appl = nil;
appl = (AppDelegate *)[[UIApplication sharedApplication] delegate];
先ほどの、木下さんの著書では、シングルトンのパターンで実装されていた。
static MyDataManager *_sharedInstance = nil;
+ (MyDataManager *)sharedManager
{
if (!_sharedInstance) {
_sharedInstance = [[MyDataManager alloc] init];
}
return _sharedInstance;
}
好みの問題だと思われるが、私はデリゲートのインスタンス変数とする実装が好みだ。