Linux Torvalds 有句名言:
"Bad programmers worry about the code .Good programmers worry about the data structures and their releationships"
通常来说程序员在拿到一个功能的时候,首先想到的是实现逻辑是什么样的.
以iOS来举例,通常情况考虑的更多的是Controller如何实现,动画如何绘制等等.
但是从数据结构的角度来考虑,逻辑优先还是数据优先,这是个争论不休的问题
我个人的见解其实是,先考虑数据层,也就是Model层,对于Model层的设计常见的有两种
1.Simple Model层
Model层只是简单的写几个属性,实现NScoping protocol数据的持久化等等都在presenter层
2.Fat Model层
Model层做很多的业务逻辑工作,包括持久化,甚至网络请求,缓存处理等
我个人认为,从面向对象的角度来看,他应当承担一些行为代码,较好的是Lightweight Model层,是让model层承担少量的与数据紧密相关的业务代码
1.Model层中有属性
2.Model层中实现NSCoping protocol
3.Model层的合法性验证等
比如:
@interface UserModel :NSObject
@property (nonatomic, readonly)NSUInteger userId;
@property (nonatomic, readonly)NSString *nickName;
@property (nonatomic, readonly)NSURL *imgUrl;
-(void)initWithDic:(NSDictionary*)aDictionary;
-(void)initWithNetUserModel:(NetUserModel *)netUserModel;
-(BOOL) isNicknameValid;
-(BOOL) isUserAvatarDownloaded;
@end
可以注意到userId和nickName等,都是用的readonly,这也是相对更稳健的model的书写方式,这里涉及到另外一个model设计思想:immutability.
如果整个项目的code过程中能够一直遵循数据的immutablity,那么项目相对来说非常的稳定,immutability的概念涉及到整个App的架构和数据流动
在这里,说一下我对immutability model的理解:
1.property设计为readonly,用专门的init来初始化对象,对象一旦创建好,即使在多个module中传递使用,也基本不会发生状态的变化
2.如果要改变某个property的值,只能创建一个新的对象,然后再覆盖cache中的旧的model对象
3.在业务比较复杂的时候,为了降低model的耦合度,可以用相似的model来初始化为另外一个model,比如上面例子中的initWithNetUserModel: