微信号:gh_183a769668a5

介绍:记录在工作学习中的笔记,专注于分享移动开发领域高质量文章,努力做一个徘徊于牛A和牛C之间的人,

iOS 架构模式导论

2016-04-18 15:09 DemonHunter
序言


之前看了一篇国外大牛Bohdan Orlov写的关于 iOS 架构模式的文章,内容涉及目前 iOS 端诸多主流的模式,个人感觉文章写的很不错,收获匪浅,希望能够通过翻译原文的方式更好的体会一下,也分享给更多的人参考。原文地址在这里(https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52#.1wbocr7db),并附上相关PPT(http://slides.com/borlov/arch/fullscreen#/),浏览原文可能需要科学上网。


正文


在 iOS 开发中使用 MVC 是否感觉很怪异?对 MVVM 感到有疑问?听说过 VIPER,但是又不确定它是否有价值?继续阅读本文,你将会找到这些问题的答案,如果没有找到满意的答案,请在评论中随便吐槽吧。本文将帮助你建立起关于 iOS 端架构模式的知识体系。我们先来简要地回顾一些主流的架构,并且从理论和一些小例子的实践上进行比较。


注意:
学习设计模式是进阶阶段,因此在阅读本文之前,假设你已有一定的基础,不会再询问如下的问题:
1、谁应该持有网络请求,Model 还是 Controller?
2、如何给View的ViewModel传递Model?
3、谁能创建一个VIPER模块:Router 还是 Presenter?

为什么要关心选择什么样的架构


如果不关心架构,想象某天你调试一个巨大的类,里面有着数十个不同关联东西,你会发现几乎不可能定位问题点并修复bug。当然,你也很难去随心所欲地使用这个类,因为不了解类其中的一些重要细节。如果你在项目中已经遇到了这种场景,它可能是像这样的:


1、这个类是UIViewController的子类
2、数据直接存储在UIViewController中
3、视图View没有任何操作
4、Model的数据结构设计很糟糕
5、没有单元测试覆盖


即使你遵循了苹果指导意见并实现了苹果的 MVC 模式,这种情况还是可能会发生,不必觉得很难过。苹果的 MVC 有点问题,我们回头再说这件事情。让我们来定义一个好架构应该有的特征:


1、严格划分,均衡分配实体间的角色和职责
2、可测性通常是第一特性(不要担心:好架构一定具有可测性)
3、便于使用,且维护成本低

为什么要划分


当试图了解程序如何运行时,角色和职责划分能够让我们保持思路清晰。如果你的开发能力越强,你就越能理解复杂的事物。但是这种能力并不是线性增长的,会很快达到极限。因此降低复杂性的最简单办法是遵循单一责任原则,划分多个实体之间的职责。


为什么要可测性


对于那些由于添加新特性,或者一些正在重构中的错综复杂的类来说,开发人员应该感激出现失败的单元测试,因为这些失败的单元测试可以帮助开发人员尽快定位运行中出现的bug,而这些bug可能出现在用户的设备上,甚至需要花费数周才能修复。


为什么要易用


这不需要回答,但值得一提的是,最好的代码就是不用写代码,因此写的越少越不容易出错。这意味着想写少量代码的想法不仅仅是因为开发者的懒惰,而且你也不应当被一个更灵巧的解决方案所蒙蔽,而忽略了维护它的成本。


MV(X)系列导论


现在当我们要做架构设计时有很多种模式选择:

  • MVC

  • MVP

  • MVVM

  • VIPER

前三者采用的都是把App中实体划分成3类:

  • Models - 负责持有数据,进行数据处理的数据访问层。设想一下PersonPersonDataProvider类。

  • Views - 负责数据展现层(Graphical User Interface),在iOS端可认为所有以UI前缀的类。

  • Controller/Presenter/ViewModel - 负责协调处理ModelsViews之间的交互。

通常用户操作视图会触发数据更新,数据的变更又会引起视图更新。这样的划分实体能让我们:

  • 更好的理解他们是如何工作的

  • 复用他们(通常可复用的是ViewsModels

  • 单独测试他们

让我们开始学习MV(X)模式,稍后再说VIPER

↓点击下方“阅读原文”查看更多

 
DemonHunter 更多文章 唤醒APP的那些事 iOS优化实践方案 GMTC-2016所感 Git工作流指南 CocoaPods私有库配置笔记
猜您喜欢 如何使KVM虚拟机的CPU和物理CPU一模一样? 【Cocos开发者大会】触控CEO陈昊芝:收入最高的80%游戏均由Cocos开发 使用Go代替Ruby,将服务器数量从30降到2 覆盖equals时请遵守通用约定 038 | 家酿计算机俱乐部40周年:苹果从这里开机,启动并接入