分享以前,想说一下为何选择了“架构”这个主题,其实初衷有两个:html
第一,“架构”对于咱们来讲实在是过重要了,我们虽然没有架构师这个职位,可是在开发的时候,都须要先有个很好的设计,但愿咱们的代码是易维护的,而“设计”每每都会落到“架构”上。因此但愿此次分享可以对于你们在架构设计上有一点帮助。react
第二,即使“架构”如此的重要,你们再聊到“架构”这个话题的时候,仍是感受到有点“虚”。想一想缘由,多是由于每一个人对于“架构”的理解可能都不太同样,一我的在不一样阶段对于“架构”的理解也会不同,架构设计还很依赖于实践和经验,不少设计细节(取舍)都是在实践中不停的迭代、改进,进而反思才能获得价值观的升级。因此我借此次机会,也将我本身以前零散的架构方面的理解,总结一下,争取能造成一点体系上的认识。但愿你们聊起架构时,能稍微不那么“虚”。ios
为了避免那么枯燥,今天分享形式,我选了3个架构的案例,来进行分析,来试图讲清楚我对于架构的认识,以及怎么样设计出一个好的架构,固然这个话题太大了,我今天先给你们开个头,但愿先能有一点感受就好。面试
最后但愿你们带着批判的精神来听,欢迎多交流。算法
第一个案例,举一个咱们本身的,放在第一个来说,也是想强调“懂业务”对于设计出好的架构来讲,是很是重要的,这也是一些人每每会忽略的点。数据库
不少同窗确定想,在项目的一开始,就设计一个完美的架构,之后能 hold 住各类变化。其实这是不可能的,架构必定是随着业务的变化,而不停的演化和进化的,在有的阶段还可能对于以前架构作比较大的调整。react-native
你们都知道,咱们同时维护了几个App,好比小豹、小雅、锤子等,这些上层App,都要依赖于底层的一些framework,好比设计模式
在早些的时候,咱们对于 SDK 的拆分粒度比较细,好比一个“找手机”技能,都会作成一个 framework。当时的 framework,应该在20个左右,各个 framework(组件) 的依赖关系图以下:服务器
咱们这么作当时的缘由很简单,但愿可以解耦各个组件,将组件尽可能拆细,而后App方想使用什么功能均可以作到热插拔,很少也很多,多好~网络
理想和现实每每会出现矛盾,到实际应用的时候,这样的设计就给咱们带来了问题。若是对每一个 framework 进行编号,好比1到20,那么咱们理想中是这样的:
可是现实实际上是这样的:
对比两张图的含义就是,实现中咱们各个App,使用的 framework 大致相同,咱们即使把业务拆的很细,若干个被拆分的 framework 其实还老是绑在一块儿使用。而且,还给咱们维护带来了巨大的问题,光每次打Git tag,都要折腾一会,会感受精力都花在了一块儿辅助工做上。
针对这个问题,咱们专门优化了 framework 的个数,将类似业务的 framework 进行了合并,最终 framework 的数量减小到了10个一下,组件之间的依赖图变成这样:
优化以后效果也很明显,咱们对于各个framework的维护,变得简单多了。
另外在优化的过程,有两个值得一提的是:
咱们谈”架构“的时候,说的最多的就是”取舍“,什么叫”取舍“,就是说你不能很简单的就判别出哪一个是好的,哪一个是很差的,老是以为有点左右为难。而如何取舍?业务就是很是重要的一个标杆,只有结合业务,才能判断出哪一个是最适合本身的。咱们结合了业务,对本身的 framework 的数量进行了精简,固然也可能会根据业务的变化,在将来某天,须要将现有的framework拆分的更细。
你作的项目,技术架构是怎么样的?
几乎全部人在被面试或者面试别人的的时候,都会(被)问到这个问题,不少人会回答,咱们架构是MVC(MVVM),少数人还会使用MVP或者VIPER,咱们姑且都称为MV(X),可是真的架构仅仅就是MV(X)吗?其实我以为MV(X)虽然是架构中比较重要的部分,可是仍是远远不能说架构 = MV(X)。
为何呢?带着这个问题,咱们来看第二个例子,在这个案例中,咱们关注下面几点:
文章地址:
饿了么移动APP的架构演进
https://www.jianshu.com/p/2141fb0dc62c
”饿了么“的架构经历了4个阶段的演化:
这个古老而经典的模式,不用多说。它是一个软件”从无到有“,”短平快“开发的首选。也是大部分规模比较小的 App 几乎大部分时间精力都会与之打交道的一个架构,以致于人们提架构比弹MVC。
固然这个架构随着业务的剧增,很快就会出现弊端,朝着Massive-View-Controller的方向奔去。
随着代码量不断增长,功能模块愈来愈多,无论是分工开发协做,仍是已有模块的复用和维护,组件化都成了这个阶段的重点。组件化有个两个关键:
对于第一个问题,”饿了么“采用的方案,基本是业界广为使用的分类方案,将组件分为共有组件和业务组件,
对于两种组件的管理:
而在具体某个业务组件内部,则能够根据不一样开发人员,不一样队伍的偏好,来实现不一样的代码架构,好比MVC、MVVM、MVP等,也都不会影响总体系统架构。
这时的架构图,看上去长这样:
咱们能够看到,MV(X) 已经不是关注的所有了,不少模块已经和 MV(X) 不怎么搭边了。
因此说,架构不等于 MV(X),其实 MV(X) 关注的只是”应用层“的部分。
关于分层:
通常的,能够将App分为三层:应用层、service层、data access层。
- 应用层 是直接和用户打交道的部分,咱们经常使用到的 UIViewController,Android的 Activity,负责了数据的展现、流向、用户交互的处理。
- service 层 是在应用层的下面,为应用层服务器的,对于应用层来讲就像一个API调用延迟为0ms的Server API。通常会放在应用层的代码:网络接口调用、公共系统服务API(GPS定位、隐私权限访问)、一些 UTil 代码(因此我以为好比一个 UIViewController 的一些私有方法和一些提工具性质的category,其实应该算serveice 层)。
- data access 提供和对于数据的”增删改查“的接口层。
业务的变化又来啦,当用户规模达到比较大的数量,此次不只仅是功能的增长,每两周一版已经知足不了产品、运营躁动的心了;同时,用纯 Native 代码编写的 App,若是上线后有错误,只能等下一次提交市场。在现在互联网竞争如此激烈的时代,一次线上错误有时也会带来很大的影响。因此这时候,不少纯粹展现性的模块会使用 H5 的方式来实现。
可是这种方式也有它的弊端:
对于这个问题,也有不少方案能够权衡,好比能够提早将网页打包好,以减小网络传输的时间,同时提供一系列的插件来访问本地的硬件设备。
“饿了么”这里的作法是,综合了 Native 和 H5 的优缺点,将页面作了一个划分,纯粹展现性的模块使用 H5;而更多的数据操做、动画渲染性的模块使用 Native。
架构图长成这样子:
业务再一次再架构的演化中扮演了重要的角色。
又要频繁迭代,又要用户体验,这时就考虑到了RN;另外,饿了么这个阶段用户已通过亿,线上一个小 bug 均可能影响几万人的使用,因此这个阶段,重点在于 RN 模块的引入,以及 Hot Patch 热修复功能的引入。
在 RN 的使用方面,依然有一个取舍,要回答下面的问题:
“饿了么”的作法是:对于20%最重要的页面,作了一个 RN 的镜像,也就是一个备份,而后经过服务器的配置,来切换Native 仍是 RN,这样若是 Native 页面出现问题的时候,先经过开关将线上的页面切换成 RN,先保证线上正常使用,而后使用 Hot Patch 完成修补后,再切换回 Native App 原生页面。
这时的架构图:
不得不说,这种作法不必定适合别的团队,毕竟一个页面,要写 Native 、 RN 两套代码,而且要一直维护,花的代价都有点大,不是每一个团队都有精力去这么搞的。其实这点,也正说明了,你须要根据本身业务,设计出一个最适合本身项目的架构。
小结一下:
第三个案例咱们回归 MV(X),毕竟它确实是咱们平常开发接触比较多的一部分。
对了这个案例,想关注的“点”是
文章地址:
猿题库 iOS 客户端架构设计
http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/
优势:
缺点:
其实对于上面这个缺点,唐巧也在一篇文章中写道,这个问题其实也不能说是 MVC 的缺点,是咱们没有拆分好代码。能够看看唐巧的《被误解的 MVC 和被神化的 MVVM》,提出了一些如何解决 Controler 臃肿的解决办法,而后也表达了对于 MVVM 的质疑,具体的作法能够去读这篇文章。这也正说明了你们对于架构的理解和态度真的是有区别的。
具体关于MVVM的概念能够参考 Objc 的《MVVM 介绍》,这里就不具体说 MVVM 的概念了。
不了解MVVM的同窗,知道这几点就行:
优势:
缺点:
来看下 Lancy 的设计,是如何将二者综合,规避缺点,保留优势的,先上图:
对于上图的说明:
结合产品 UI,再按照数据流的方式阐述,如下面的 CollectionView 为例。
这么方式的优缺点:
优势:
缺点:
针对这个案例,我以为最应该咱们思考的就是,做者 Lancy,在设计架构的时候的思路是怎么样的?为何要那么设计?是怎么取舍的?总结一下:
基于对这个案例的分析,最应该思考的是,设计一个架构的思路,换言之,你要内心明白,怎样才是一个好的架构。
总结一下,今天说的这三个案例,其实就是为了说明一下几点:
其实“架构”真的是个很大的话题,不少知识均可以拿出来单独学习和分享。
但愿之后能陆续的为你们分享,擅长哪一个方向,或者对哪一个方向感兴趣的小伙伴也能够给你们分享一下,让你们的设计能力一点点提升上来。
MVVM 介绍
https://objccn.io/issue-13-1/
被误解的 MVC 和被神化的 MVVM
http://blog.devtang.com/2015/11/02/mvc-and-mvvm/
iOS应用架构谈系列
https://casatwy.com/iosying-yong-jia-gou-tan-kai-pian.html
猿题库 iOS 客户端架构设计
http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/
饿了么移动APP的架构演进
https://www.jianshu.com/p/2141fb0dc62c
iOS应用层架构之CDD
http://mrpeak.cn/blog/cdd/
iOS应用架构现状分析
http://mrpeak.cn/blog/ios-arch/
iOS 架构模式–解密 MVC,MVP,MVVM以及VIPER架构
http://www.cocoachina.com/ios/20160108/14916.html