2014年6月11日水曜日

MVVM

MVVM = Model-View-ViewModel パターンの紹介。モデルの表示用変換(フォーマット)を ControllerやModelではなく専用のViewModelで行う例が紹介されている。


イメージ


メリットは
・ViewController のコードを減らせる
・テストがし易い


例えばモデルのフォーマットのありがちな例として ViewControllerにコードが記述されている。
- (void)viewDidLoad {
    [super viewDidLoad];
    
    if (self.model.salutation.length > 0) {
        self.nameLabel.text = [NSString stringWithFormat:@"%@ %@ %@", self.model.salutation, self.model.firstName, self.model.lastName];
    } else {
        self.nameLabel.text = [NSString stringWithFormat:@"%@ %@", self.model.firstName, self.model.lastName];
    }
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"EEEE MMMM d, yyyy"];
    self.birthdateLabel.text = [dateFormatter stringFromDate:model.birthdate];
}

そこでViewModelなクラスを一つ用意してその中にフォーマットコードを入れてしまう。
@interface PersonViewModel : NSObject

- (instancetype)initWithPerson:(Person *)person;

@property (nonatomic, readonly) Person *person;

@property (nonatomic, readonly) NSString *nameText;
@property (nonatomic, readonly) NSString *birthdateText;

@end

すると ViewControllerがすっきり。
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.nameLabel.text = self.viewModel.nameText;
    self.birthdateLabel.text = self.viewModel.birthdateText;
}

フォーマットのロジックがViewControllerから離れるのでそこのテストコードも書きやすい、とのこと。

- - - -
悪くないと思うがObjective-Cの場合クラスファイル(.h/.m)が増えていくのが難点で、フォーマッタはついついモデルとかに書いてしまう。
Swiftになるとヘッダファイルが無くなってファイル数が半減するのでいいかもしれない。


1 件のコメント: