Скажем, мы имеем следующие классы:
Просмотр
@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@end
Model
@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: Код контроллера является легким и гибким (если вид или модель меняются, код контроллера остается прежним.
- CON: Вид и модель связаны и, следовательно, менее пригодны для повторного использования.
В OPTION 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?
Я, конечно, видел, как оба используются. Я видел OPTION 2, обычно используемый в подклассах UITableViewCell.
Я также прочитал, что представления и модели должны быть спроектированы так, чтобы их можно было повторно использовать и не зависели от чего-либо, в то время как контроллеры представлений должны быть наименее повторными для группы.
Чувство моей кишки состоит в том, чтобы использовать OPTION 1 просто потому, что я предпочел бы, чтобы диспетчер представлений выполнял грязную работу по привязке модели к представлению, и пусть модель и вид остаются независимыми и не знают друг о друге. Но так как некоторые взгляды предназначены для того, чтобы делать только одно, то, возможно, не так уж плохо, если бы они были привязаны к конкретной модели напрямую.
Я хотел бы услышать ваше мнение по этому поводу.