Android 组件化、模块化、插件化区别详解

1,501 阅读6分钟

前言

组件化模块化已经深入体现到软件开发当中,也是为了让开发者更好的去解决软件上的高耦合、低内聚、无重用的3大代码问题。网上有很多相关内容的介绍文章,各个作者都有自己的一些想法或者总结,看得比较乱,在实践过程中也存在不少疑惑,很多时候不知道选择用组件还是模块,或者有时候根本分不清自己这得是组件还是模块。所以写了下这篇文章,对组件化、模块化、插件化进行一个详细的讲解,希望小伙伴都可以更了解这三者的区别。

单工程模式

再介绍组件化,模块化、插件化之前,我们不得不说下单工程模式,移动开发诞生之初,我们开发移动项目,我相信大多用的是单工程单任务的开发模式,new Project——>分包——>写起。大家应该都经历过这个过程,写起来也比较简单,这种模式不涉及乱七八糟的处理方式, 上手快,开发快,足够敏捷。这是因为Mobile Project 刚起步,项目都偏小,一些附加业务还没绑到App上,而随着后期手机应用的发展,项目越来越大,功能越来越多,随之而产生了组件化和模块化等概念。

后面Android Studio出来了,多出来了一个新的概念,Project, Module… 模块;当时以包的形式分离的公共包common,现在成了AS中的Module。大家都知道,Module包含两种格式: application,library。也就是说,一个Module就是一个小的项目,也是AS概念中的模块。因此我们开始设计common模块common_business模块,甚至db模块。模块的好处是什么? 相比于包来讲,模块更灵活,耦合更低,随意插拔,想引入哪个就引入哪个。根据不同的关注点,将一个项目的可以共享的部分抽取出来,形成独立的Module,就是模块化。模块化不只包含公共部分,当然也可以是业务模块。

组件化

基于组件的软件工程 (CBSE) 也称为基于组件的发展 (CBD),是软件工程的一个分支,它强调在给定软件系统中提供的广泛功能方面的关注点分离。它是一种基于重用的方法,用于定义、实现和组合松散耦合的独立组件到系统中。这种做法旨在为软件本身和赞助此类软件的组织在短期和长期带来同样广泛的利益。

简单来说就是:组件化就是基于可重用为目的的,将一个大的软件系统按照分离关注点的形式,拆分多个独立的组件,减少耦合。

就是“基础库”或者“基础组件",意思是把代码重复的部分提炼出一个个组件供给功能使用
使用:Dialog,各种自定义的UI控件、能在项目或者不同项目重复应用的代码等等
目的:复用,解耦
依赖:组件之间低依赖,比较独立
架构定位:纵向分层(位于架构底层,被其他层所依赖)
特点:从UI界面的角度进行划分,前端的组件化,方便UI组件的重用

模块化

模块化编程是一种软件设计技术,强调将程序的功能分离为独立的可互换模块,因此每个模块都包含仅执行所需功能的一个方面所需的一切。

简单来说就是:模块化是将功能拆分,分成相互独立的模块,以便于每个模块只包含与其自身功能相关的内容。

就是"业务框架"或者“业务模块",也可以理解为“框架”,意思是把功能进行划分,将同一类型的代码整合在一起,所以模块的功能相对复杂,但都同属于一个业务
使用:按照项目功能需求划分成不同类型的业务框架(例如:注册、登录、运动、商城等.....)
目的:隔离/封装 (高内聚)
依赖:模块之间有依赖的关系,可通过路由器进行模块之间的耦合问题
架构定位:横向分块(位于架构业务框架层)
特点:从代码逻辑的角度进行划分,方便代码分层开发,保证每个功能模块的职能单一

插件化

插件化严格意义来讲,其实也算是模块化的观念。将一个完整的工程,按业务划分为不同的插件,都是分治法的一种体现。化整为零,相互配合。越小的模块越容易维护,插件化按理也算是模块化的一种体现,和组件化就不是一个概念了。

组件化的单位是组件(module)
插件化的单位是apk(一个完整的应用)

组件化实现的是解耦加快编译, 隔离不需要关注的部分
插件化实现的也是解耦加快编译,同时实现热插拔也就是热更新

组件化的灵活性在于按加载时机切换,分离出独立的业务组件,比如微信的朋友圈
插件化的灵活性在于是加载apk, 完全可以动态下载,动态更新,比组件化更灵活

组件化能做的只是, 朋友圈已经有了,我想单独调试,维护,和别人不耦合,但是和整个项目还是有关联的
插件化可以说朋友圈就是一个app, 我需要整合了,把它整合进微信这个大的app里面

本来就是一个系统,你把微信分为朋友圈,聊天, 通讯录按意义上划为独立模块,但并不是真正意义上的独立模块
本来就是不同的apk, 你把微信的朋友圈,聊天,通讯录单独做一个完全独立的app, 需要微信的时候插在一起,就是一个大型的app了
插件化的加载是动态的,这点很重要,也是灵活的根源。

总结

组件化是基于重用,减少耦合;
模块化是根据功能模块的不同而拆分的;
插件化是将一个完整的工程,按业务划分为不同的插件。

其实组件相当于库,把一些能在项目里或者不同类型项目中可复用的代码进行工具性的封装。
而模块相应于业务逻辑模块,把同一类型项目里的功能逻辑进行进行需求性的封装。

其实从定义中可以看出,“组件” 更注重于代码的“复用”。 “模块” 更注重与一块业务能力的完整性。

组件、模块其实是从不同的角度来划分一个app。 组件更多的是从自下而上的视角,按照技术实现的思维划分实现代码,并将这些代码组装成一个app。 模块更多的是从自上而下的视角,按照业务划分实现代码。

组件化模块化的目的都是针对复杂app,降低其复杂性,提升开发效率和质量。只是划分的角度略有不同。