最基本的,Model 应该包含应用所需的数据,常见的是这样:
@interface Book : NSObject
@property(nonatomic, copy) NSString *name;
@end
一个Model应该表示某一领域专门的知识,它不仅提供这一领域的数据访问,还应该提供处理这类数据的方法,比如Book需要一个出版日期:
@interface Book : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic) NSDate *date;
@end
而需求将日期显示为“当天发布”、“2天前发布”等自然语言,应该在Book添加:
@interface Book : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic) NSDate *date;
@property(nonatomic, readonly) NSString *formatDateString;
@end
不良的做法是将转换日期的工作放到一个View对象中,可以想象一下如果一个TableView,和书籍详情页都被要求按同样的格式显示日期这样显而易见的需求。
Model 的设计应该满足“同一领域”数据被要求时,可以立即被重用。为了达到这个要求,Model对象不应该包含任何界面等呈现相关的功能,比如UIAlertView 的代码绝对不该出现在Model中。
设计一个Model,关键就是划分“问题领域”,我常看见诸如BookModel这样的类名,显然这有点为了Model而Model,而更可怕的是同时会出现BookModel 和 BookInfoModel,甚至还有BookDetailModel,这样的设计,仔细查看原因,大多是为了配合服务端Api接口,为每个接口定义了不同的“Model”,这违背了Model 的本意,并将Model“贫血化”了,而正如《重构》一书中指出:
如果一个类除了保存值外,什么都没干,应该重新考虑其存在的价值。
不应该出现只是用来传值的“对象”,应该构造Book对象,用来包含关于一本书相关的所有数据,及对这些数据的处理,包括持久化和数据库存储。因此,如果从服务端确实有BookInfo和BookDetail,可以将这两者作为Book对象的成员变量,而将这两者结合的值开放为新的属性。