iOS开发记录iOS学习开发

iOS开发之组件化

2019-02-26  本文已影响11人  程序员_秃头怪

近几年组件化大家吵的沸沸扬扬的,它其实也不是什么黄金圣衣,穿上立马让你的小宇宙提升几个档次,也不是海皇的三叉戟,入手就能呼风唤雨,它不过就是一种app的架构思路。其实真的很简单,如果你的项目从发布之初就是用组件化,那么在开发的过程当中势必会少很多麻烦,难点其实是对我们庞大古老的工程进行组件化的改造。

一.下面我们来谈谈组件化到底是什么

其实组件化说白了就是将一个单一的工程分解为各个独立的组件,然后按照某种方式任意组织成为一个拥有完整业务逻辑的工程。

举个例子大家就明白了,一辆完整的汽车从来都不是由一个工厂将所有的零部件生产完成的,而是轮胎厂生产轮胎,发动机厂生产发动机,玻璃厂生产玻璃等等,然后再组装成为一辆完整的汽车。我们的各个组件或者说模块就是汽车的各个零部件,我们的整个工程我们也把它叫做宿主工程就是我们的汽车,我们按照一定的规则把他们拼装起来就是一个业务逻辑完整的工程。

二.组件化产生的原因

那么组件化为何应运而生,其实在我们的开发过程中,如果本身项目的规模不大,业务线比较少,人员也比较少,我们使用一般的单一开发模式就好了。但是随着我们的项目不断的迭代更新,业务线越来越多,发开人员也组件增多,这个时候就会暴露各种各样的问题

从这张图我们能看到我们在发开完毕我们自己的模块之后,我们需要对自己的模块进行测试,但是主工程里面的其他模块存在一个bug,导致我们的工程编译不了,那么我们开发的模块势必也是测试不了的,真的很尴尬。

假设说我们的设计模式按照模块划分的话,我们没法使用MVC去套用我们的MVVM,这样我们除了去学习MVVM之外别无他法,可关键是你真的有足够的时间在短时间内上手吗?
当然如果我们按照功能模块来划分的话,我们的MVC倒是可以套用我们的MVVM,但是你能保证不出问题吗?

三.组件化的优势

那么我们使用组件化之后到底能达到什么样的效果呢?

四.组件化应该考虑的问题

功能组件:
包含控件(弹幕、轮播器、选项菜单、图文菜单等)、功能(断点续传、音频处理等)

业务组件:
业务线一(子业务线一,子业务线二.....)
业务线二(子业务线一,子业务线二.....)

从这张图我们可以看出来,我们三大组件类,其实是有层级关系的,我们的业务组件既要使用我们的基础组件也要使用我们的功能组件,它属于我们基础组件和功能组件的上一层,而我们的基础组件和功能组件属于同一层级,他们之间是不能互相产生依赖关系的。

如果说我们的功能组件的弹幕需要使用到基础组件中的有关布局View的分类,我们这个时候最好的做法并不是将让我们的功能组件依赖于我们的基础组件,这样的话别人要使用我们的弹幕却要将我们整个基础组件都下载下来,那么我们的组件化就失去了原有的意义。我们在这里推荐的做法是讲我们所需要的那块代码直接拷贝到我们的功能组件当中去,这样做的好处在于我们的功能组件不需要依赖我们的基础组件。

同样在我们三大组件类的内部,组件之间也不能产生依赖关系,好比我们的弹幕不能依赖于我们的播放器,总不能别人要使用我们的弹幕还得把播放器给下载下来把,这样也是不合理的,对我们业务组件也是一样的,我们要增加或者删除某个业务线,结果导致其他的业务线没法正常的使用了,这都是不可取的。
但是某些时候我们确实需要使用其他组件里面的内容,但是他们之间又不能产生依赖关系,这个时候我们就要使用到组件间的通讯,这个在后面会讲到组件间如何通讯。

这张图我们可以看到,我们的业务组件是可以依赖我们的基础组件和我们的功能组件的,而我们的业务组件都是以pod库的形式借助我们Cocoapod安装到我们宿主工程中去,我们的宿主工程面向的都是我们的业务组件。

在这里我们看到我们组件都是通过中间件来进行交互的,组件将内部发生的变化告诉给中间件,中间件在通知其他组件。我们组件把各自的服务给中间件,需要对应服务的组件就会去找中间件拿,这样的话我们组件之间不会产生依赖关系,同时又能进行通讯。

五.分离组件的难点--解耦

一般在组件化的分离各个组件的时候,解耦这个话题我们是回避不了的,但是其实我们一般会遇到两种情况
1.组件里面依赖其他公共功能
2.组件内部需要对接某个服务

组件里面依赖其他公共功能
对于这种情况,我们一般最快的方式就是直接copy代码,虽然这个过程比较恶心,但是好处就是不会有额外的依赖,对于一些不重要的工具方法,我们都可以拷贝到内部来使用。
举个例子大家都明白了,我们使用获取屏幕尺寸的方法,而这个方法我们一般写成宏定义放在我们的基础组件中,我们的业务组件中要用到这个方法没这个时候我们没必要把我们基础组件也整个下载下来,我们直接复制粘贴这短代码就好了。
我们也可以把组件依赖的代码先做成一个pod库,然后依赖这个pod库就好了,这样我们的问题就迎刃而解了。

组件内部需要对接某个服务
比如我们控件的内部涉及到加载网络图片,我们一般会用到我们的SDWebImage的框架,虽然我们可以在使用远程私有索引库的时候添加依赖,那么我们在下载我们的私有库里面组件的时候我们可以将SDWebImage一并集成到我们的宿主工程中。如果开发过程中,公司用得不是SDWebImage不是会很尴尬吗?
所以我们使用的方式就是使用block或者代理把这部分职责丢出去,那么我们就可以自用的选择我们所需要使用的第三方框架或者公司内部写的框架,不用再纠结了。

小编给大家推荐一个iOS技术交流群:923910776!群内提供数据结构与算法、底层进阶、swift、逆向、整合面试题等免费资料!
上一篇 下一篇

猜你喜欢

热点阅读