美文网首页
iOS高手开发课读书笔记:架构的设计

iOS高手开发课读书笔记:架构的设计

作者: MichealXXX | 来源:发表于2019-06-20 13:39 被阅读0次

    之前我的博客中写过关于组件化的东西,其实组件化一个项目离不开架构的思想,一般组件化一个已经开发了一段时间的项目首先就是要进行重构拆分模块

    在拆分的过程中就会十分头痛,因为在一份代码里面做各种模块的开发,避免不了产生耦合,比如模块与模块之间的通信采用了耦合性很强的方式,这就导致拆分一个模块的时候,这个模块里面参杂了很多别的模块的东西,比如业务模块里面参杂了基础模块的部分代码,基础模块里面又写入了关于业务的东西。

    最近读了戴老师的架构设计,对架构又有了一个新的认识,做一个笔记,加深印象,戴老师说他们的开发团队多达上百人,很多同事还在不同的地区办公,大家共用了一个仓库来进行开发,一旦有人提交的代码出错,所有人都需要等代码修复之后才能更新代码,而且在测试的时候极其的不方便,代码耦合严重,归属不清楚,这都会大大增加沟通的时间。

    因此重构代码是一个必经之路,也会产生相应的阵痛期,这个就需要时间来进行完善,将功能之间完全解耦,每一个功能都生成一个git仓库,通过cocoapods进行管理,这就是组件化的思想,具体的实施可以看我之前的组件化文章,因此重构越早越好,当然我个人的建议是专门抽出来一段时间来进行重构,不然一边迭代一边重构真的问题特别多,用戴老师的话说就是在给一个正在飞行的飞机换引擎。

    iOS中大家可能用的见到的听到的最多的就是MVC,由此衍生出来很多架构模式比如MVVM,MVP等,如果项目团队人数较少,项目不算大那么这些模式就完全够用,但是一旦项目的业务扩张,人数变多,那么这种模式可能就稍显“力不从心”。

    一个大的功能模块可能会由多个小的功能模块组成,每个功能都变成了一个独立的业务,这时候仅仅靠视图,模型,控制器的方式显然不能完美的对项目进行支持,这时我们就要对项目进行一个划分,那么应该按照怎样的模块粒度进行划分呢?

    项目变大以后,模块的划分必须遵守一定的原则,不然还是会导致代码的耦合性严重,加大重构的难度。对于iOS这种面向对象的编程语言来说,SOLID原则是十分适用的。

    单一功能原则:对象功能要单一,不要在一个对象里面添加太多的功能。

    开闭原则:扩展是开放的,修改是封闭的。

    里氏替换原则:子类对象可以替代基类对象。

    接口隔离原则:接口的用途要单一,不要一个接口根据不同的参数实现不同的功能。

    依赖反转原则:方法应该依赖抽象,而不是依赖实例,iOS就是高层方法依赖于协议。

    遵守以上这些原则的架构就比较容易维护,易于扩展,最后我们针对项目要根据合适的粒度进行划分,粒度过大过小都不合适,组件应该是可组装的独立的业务单元,具有高内聚低耦合的特性。采用组件的模式来改造APP,对于代码的逻辑,模块间通信改动都不大,按照功能对模块进行划分,相同类型的放到同一个文件夹下面,使用cocoapods进行管理。

    但是仅仅做到这些还是不够的,因为模块之间还是存在着较大的耦合,如果不能解决这个问题,那么模块间是无法做到各自独立的,因此要对各个功能模块进行梳理,并不是说模块间一点耦合都不可以有,模块之间当然可以有耦合,很多组件之间都会设置上下依赖关系,只要划分好这种上下层关系就会易于维护和管理。

    一般在开发中会将APP划分为三层,不要太多,不然会显得特别冗杂:

    1.底层:底层的一些基础组件,比如网络,缓存等等,和业务毫无关联的东西。

    2.通用业务层:一些通用的模块,比如支付,埋点,账号等。

    3.业务层:更新迭代特别频繁的模块

    这样划分出来的架构就会特别清晰,而且我们分离出来的模块可以供给别的团队进行复用,减少了很多重复造轮子的时间,不建议把所有功能模块都分离出来,只有经常会用到的模块我们将它分离出来就可以了。

    那么一个好的架构是怎样的呢?现在的组件化形式有很多的调度形式,比较出名的就是协议式中间者模式,我个人使用的更多的是中间者模式,casatwy之前开发出来了一套解耦化中间者模式CTMediator,大家可以去下载casatwy的Demo来看它相关的原理,我个人所开发的组件化项目也都用到了这个框架。

    这个框架的原理其实很好理解,它使用硬编码,通过iOS底层的运行时来生成对应的来进行模块间的通信,这样我们在进行模块间通信的时候就无需引入另一个模块的,通过一个中间者进行交流。

    不过这种方法有利也有弊,好处就是真的实现了解耦,将业务完全的独立了出来。弊端就是使用硬编码进行开发带来了一定量的不方便,刚开始上手的时候经常会遇到字符串和对应的类名写错,导致无法进行跳转。

    不过什么事情都是有两面性的,我个人认为如果可以让我的APP解耦,即使出现了一些硬编码也是可以接受的,我自己写了一个简单的Demo
    ,使用了cocoaPods进行模块的管理,CTMediator进行模块间传值以及回调,大家可以下载下来看一下简单的使用方法。大家也可以根据自己的需求对CTMediator进行封装,方便使用。

    好了,这篇笔记到此就结束了,我只写了一些大概的东西,更多的内容还是推荐大家去极客时间观看原博客,写的更加详细,评论中也会有很多大神提供宝贵意见。

    原博客链接:https://time.geekbang.org/column/article/86522

    相关文章

      网友评论

          本文标题:iOS高手开发课读书笔记:架构的设计

          本文链接:https://www.haomeiwen.com/subject/evdkfctx.html