次のクラスがあるとします。
意見
@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@end
モデル
@interface Article : NSObject
@property NSString *title;
@property NSString *body;
@end
コントローラ
@interface ArticleViewController : UIViewController
@property Article *myArticle;
@property ArticleView *myArticleView;
- (void)displayArticle;
@end
@implementation
- (void)displayArticle {
// OPTION 1
myArticleView.titleLabel.text = myArticle.title;
myArticleView.bodyLabel.text = myArticle.body;
// ... or ...
// OPTION 2
myArticleView.article = myArticle;
}
@end
オプション1
- PRO:ビューとモデルの両方が互いに結合されていません。
- CON:コントローラーは、モデルとビューの両方の詳細を知る必要があります。
オプション 2
- PRO:コントローラー コードは軽量で柔軟です (ビューまたはモデルが変更されても、コントローラー コードは変わりません。
- 短所:ビューとモデルが結合されているため、再利用性が低くなります。
オプション 2 では、モデルへの参照を保持するように ArticleView を変更する必要があります。
@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@property Article *article;
@end
次のように、アーティクル セッターを上書きして、それに応じてビューを更新できます。
- (void)setArticle:(Article *)newArticle {
_article = newArticle;
self.titleLabel.text = _article.title;
self.bodyLabel.text = _article.body;
}
私の質問は、OO と iOS/MVC のベスト プラクティスに関して、これら 2 つのオプションのどちらが最適かということです。
私は確かに両方が使用されているのを見てきました。UITableViewCell サブクラスで一般的に使用される OPTION 2 を見てきました。
また、ビューとモデルは再利用可能で、何にも依存しないように設計する必要があることも読みましたが、ビューコントローラーは再利用可能性が最も低いことを意図しています。
私の直感は、ビューコントローラーがモデルをビューにバインドするという汚い仕事をして、モデルとビューを独立させ、お互いを認識させないという単純な理由で、OPTION 1 を使用することです。しかし、一部のビューは 1 つのことだけを行うように設計されているため、それらを特定のモデルに直接関連付けることはおそらくそれほど悪くはありません。
これについてのご意見をお待ちしております。