-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
iOS开发架构的探索——不再是MVC #1
Comments
我虽然是以iOS App为例来讲解的,但是架构是适用于任何方向的,所以各个方向的同学们都来围观一下~里面用到了一些iOS开发的专用术语,如果不懂可以自行google,还不懂就直接comment~ |
MVC这个词,大家想必对它再熟悉不过了,尤其是开发iOS App的童鞋们。不过,大家都知道MVC可以解读为Model-View-Controller,大家可还知道它还可以被解读为Massive ViewController(重量级视图控制器)?让我们先从这个梗的来历说起。 1、MV*架构 MVVM(Model-View-ViewModel) 在MVVM中,除了ViewModel比Controller做了更少的事情之外,各个模块之间的耦合也没有MVC里那么紧密的耦合。在MVVM中,View持有ViewModel,ViewModel持有Model。但是ViewModel没有反过来持有View,Model也没有反过来持有ViewModel。那么这两个方向的通信如何进行呢?更直接一点来说,我如何能让ViewModel告诉View它该更新了(以及以何种方式更新),又如何能让Model告诉ViewModel它(Model)发生了变化呢?对于后者,我们仍然可以采用KVC或者KVO的方式来进行通信。而对于前者,我们推荐使用一种通过发射信号(Signal)的方式来进行通信。在这方面有许多第三方库做得非常好,其中应用最为广泛的当属ReactiveCocoa。ReactiveCocoa是一个非常棒的通信框架,但我这里不打算详细介绍,请大家自行Google使用方法。 2、VIPER(View-Interactor-Presenter-Entity-Router) 通过对VIPER中各个模块分工的介绍我们可以发现,VIPER实际上是对MVVM的各个部分进行了进一步的细化,但又不仅仅是对MVVM进行了更细致的分割:View和Presenter是对MVVM中的View的进一步细化,同时Presenter又包揽了一部分ViewModel的工作(例如presentation logic的处理);I和E是对Model的细化,但Interactor又包含了一部分ViewModel的工作(例如根据用户的操作来更新Model/Entity);Router则又分担了View的一部分工作。所以VIPER相比MVVM是更为细致的划分,同时两者的各个模块又有着功能上的交叉。 讲到这里,我们这次对iOS开发架构的探索就告一段落啦~我虽然是以iOS应用为例来讲解这些架构的,但实际上这些架构可以用在其他各种客户端的开发上。Any idea or suggestion is welcome~ 推荐文章:
|
MV* 其实就是把 MVC 中的 C 不断的拆分 |
MVC 中的一个问题是在于数据流的流向不统一,C 需要不断的处理来自 V 的数据(用户的输入等)以及 M 的数据(API返回的数据等),并需要维护 V 和 M 的状态(更新界面,网络请求,修改数据库等等),维护的状态越多,代码就越复杂,并且这种代码一定是偏向于命令式而不是声明式的。这样的话,代码的维护成本就会大大提升,也给了 bug 可乘之机。后来提出的 MVVM,函数响应式编程(FRP),常和react 一起用的 flux 以及 redux 等等,强调的都是单向数据流动以及数据绑定,来减少需要维护的状态的数量,并且使用数据绑定等机制来减少命令式的修改状态的代码。 MVC 中另一个问题在于 C 很容易堆积过多的代码,最初引入 C 的一个重要目的是为了达到表现(V)与数据(M)的分离,然而随着业务的增长,很容易就将各种代码堆到 C 中了,毕竟 C 通常是持有(own) V 和 M 的,最终 MVC 就成了 “Massive ViewController”。。。 这明显是有违单一职责原则(SRP)的。VIPER 就是根据这一点,细分了 C 的职责。 |
最后说一下 iOS 中的 ViewController,其实这个虽然我们通常把它当作 C,但是它和 V 的关系更紧密一些。因为 iOS 客户端中,ViewController 其实一个主要的任务是要管理 V 的生命周期的(想想 viewDidiLoad,viewWillAppear,viewWillDisappear 等等)。 然而在 web 框架中,Controller 并不需要管理 V 的生命周期,因为生成的 HTML、CSS、JS 等等直接就丢给客户端了。。。 |
客户端开发属于 C/S 架构,Web 开发属于 B/S 架构,导致有一些区别。
P.S. Angular 属于 MV* 框架,以下摘自 README
当然,用上 Two-way Data Binding,这个 * 更接近是 ViewModel。 |
作為一個巨硬粉,我想說 MVVM 這等好東西是巨硬工程師為 WPF 設計的,MSDN 上面有非常多非常好的資源可以理解 MVVM,比如:https://blogs.msdn.microsoft.com/msgulfcommunity/2013/03/13/understanding-the-basics-of-mvvm-design-pattern/ |
iOS开发架构的探索——不再是MVC.pdf
The text was updated successfully, but these errors were encountered: