学习总结以及项目中的运用二:分层模型与协同开发

上篇写的一个View对应着一个ViewContorller

情景二:多个View对应一个ViewContorller

这里还是用发帖子做例子:

发布的帖子类型可能有多种:搞笑类、文学类、短文类、日记类、交友类、活动类等

这种情况下,显然一个类型建立一个ViewContorller是不实际的,多余文件增加app体积不说,重复多余代码毫无效率。


那么还是用MVC框架来实现

将每个Model里都共用的方法与属性提取出来,建立一个胖Model

/*———————————————————————————————————
• 什么叫胖Model?
胖Model包含了部分弱业务逻辑。胖Model要达到的目的是,Controller从胖Model这里拿到数据之后,不用额外做操作或者只要做非常少的操作,就能够将数据直接应用在View上
———————————————————————————————————-*/


胖Model中含有一些重复出现频率很高的业务,有很高的复用性,如果这部分写在别的地方,一旦弱业务有修改,就会改很多处地方。把一些弱业务交给胖Model做,从而给Controller瘦身,Controller只需要关注强业务代码就行了,很好的解决的上面的问题。



然后每个分类对应一个Model以及View,这里的每个Model是负责每一个View上面的业务数据表达,也就是常说的瘦Model。

/*———————————————————————————————————
• 什么叫瘦Model?
瘦Model只负责业务数据的表达,所有业务无论强弱一律扔到Controller。瘦Model要达到的目的是,尽一切可能去编写细粒度Model,然后配套各种helper类或方法来对弱业务做抽象,强业务依旧交给Controller。
———————————————————————————————————-*/



View要和VC进行交互的,也就是数据的输入与输出,每一个View有相同的功能(选择发送照片,地理信息定位等),但是也有不同的(每个View的信息输入源数量不同,有的2个TextField,有的可能有6个等)。

所以,将每个View共同有的功能放入ViewController 内,每个View自己独有的功能则写在View本身。View中的数据通信直接与Model进行,VC与Model的数据通信在iOS中有很多种来实现:KVO、Notification、block、delegate和target-actiond ,这里就不做过多的描述。

 


根据上面的铺垫,分层模型基本搭建完成了,这里要说的呢是分层模型对协作开发的好处,因为上面已经根据业务类型分解给了View和ViewController,所以这两块业务上互不相干可以由两个人同时进行,分工更明确,开发效率更高。


首先做View-Model的人可以根据业务类型定义两个协议:

(ModelProtocol和ViewProtocol)

ModelProtocol:负责和模型相关的一些业务(例如:数值的有效性,以及数值的对外传递)

ViewProtocol:负责View的一些业务(刷新View布局、回收键盘)


和做ViewController的人商量好对外开放的方法名称即可,ViewController只需在对应的地方调用需要调用的protocol中含有的方法得到想要的数据或者效果即可,不必关心View和Model中做了哪些事情,而View-Model的人不必需要VC中有哪些业务逻辑,只需要在自己负责的View-Model层完成对应的协议方法业务即可。



多个View对应着一个ViewController,在ViewController中难免会遇见判断代码块,过多的判断代码块会使代码整体非常的难看,应该减少判断次数:

因为每个类型界面都会涉及到Model与VC的通信、View与VC的通信,以及VC对Model的数据输入,

所以利用成员变量 全局性分别建立


id<ModelProtocol>_delegateModelProtocol;  //代替Model中的代理
id<ViewProtocol>_delegateViewProtocol; //代替View中的代理
PostModel * _postModel;   //代替View.model   


这里只需要在界面的初始化判断一次,并在初始化后将对应的数据进行成员变量赋值即可  _delegateViewProtocol = _ funnyPostView;

_delegateModelProtocol = _ funnyPostView.consultingModel;
_postModel = _ funnyPostView. funnyModel;


在后面,VC的交互只需要对_postModel进行数据交互,在对应的地方分别调用_delegateViewProtocol、以及_delegateModelProtocol  的方法就行:

例如:

[_delegateViewProtocol getTheUserInput];
[_delegateModelProtocol isDataAvailable];




到这里差不多就写完了,感觉比较抽象,不太好上代码块,所以只是说一了一下逻辑上的东西,以及这次迭代工作中与同事协作开发的的一些心得体会。




参考资料:

http://mdsa.51cto.com/art/201505/477731_3.htm   



你可能感兴趣的:(设计模式,ios,delegate,协同开发,项目心得总结)