之前我的博客中写过关于组件化
的东西,其实组件化
一个项目离不开架构
的思想,一般组件化一个已经开发了一段时间的项目首先就是要进行重构
,拆分模块
。
在拆分的过程中就会十分头痛,因为在一份代码里面做各种模块的开发,避免不了产生耦合
,比如模块与模块之间的通信
采用了耦合性很强的方式,这就导致拆分一个模块的时候,这个模块里面参杂了很多别的模块的东西,比如业务模块里面参杂了基础模块的部分代码,基础模块里面又写入了关于业务的东西。
最近读了戴老师的架构设计,对架构又有了一个新的认识,做一个笔记,加深印象,戴老师说他们的开发团队多达上百人,很多同事还在不同的地区办公,大家共用了一个仓库来进行开发,一旦有人提交的代码出错,所有人都需要等代码修复之后才能更新代码,而且在测试的时候极其的不方便,代码耦合严重
,归属不清楚,这都会大大增加沟通的时间。
因此重构代码
是一个必经之路,也会产生相应的阵痛期,这个就需要时间来进行完善,将功能之间完全解耦
,每一个功能都生成一个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
进行封装,方便使用。
好了,这篇笔记到此就结束了,我只写了一些大概的东西,更多的内容还是推荐大家去极客时间
观看原博客,写的更加详细,评论中也会有很多大神提供宝贵意见。
网友评论