客户端组件化

1,368 阅读3分钟

为什么要组件化模块化

目前项目中存在的问题

  1. 组件之间依赖很严重 耦合严重 例如GMBase GMPhobos
  2. 编译慢,效率低
  3. 业务开发分工不明确,开发人员要关心非业务的代码
  4. 改代码时,可能会影响其他业务,牵一发动全身
  5. 代码结构不清晰,架构不够稳定,也不便于扩展和组件复用

优点

  1. 架构更清晰,解耦 2.加快编译速度 3.业务分工明确,开发人员仅专注与自己的业务,提高开发效率 4.组件、业务独立更新版本,可回滚,持续集成 5.客户端所有页面 支持协议跳转 支持运营 配置跳转到客户端各页面

组件的定义

组件是构成业务或者功能模块的基本单位。原则上,组件与组件之间互不依赖。

模块,module

例如,我们的社区,是一个业务,可以叫“社区模块”。它可以拆分更小的组件:搜索、签到、评论等 我们的交易金融,是一个业务,可以叫“社区模块”。它可以拆分更小的组件:搜索、签到、评论等

两者关系

从上面的阐述可以得出,一个工程,由多个模块组成,每个模块由多个组件构成。但很多时候,两者界限还是相当模糊。例如“日志组件”称为“日志模块”,也没有违和感。 组件从业务角度上不能继续拆分,可替换,可复用; 模块的定义比较笼统,可以是一个Business业务,可以是技术架构中一个业务,也可以是几个组件构成的小功能

组件化和解耦

大家不妨先思考两个问题:

为何要进行组件化开发?

各个组件之间是否一定需要解耦?

采用组件化,是为了组件能单独开发,能单独开发App就能快速集成,所以单独开发是结果。要让组件能单独开发,组件必须职责单一,对于代码中已有模块,就需要用到重构和解耦的技术,所以重构和解耦是过程。那解耦是否是必须的过程?不一定。比如UIKit,我们用这个系统组件并没有使用任何解耦手段。问题来了,UIKit苹果可以独立开发,我们使用它为什么没用解耦手段?答案很简单,UIKit没有依赖我们的代码所以不用解耦。

PS:可以不纠结组件、服务、模块、框架的概念,只关心一件事,这一部分代码能否独立开发,能就叫组件,不能我管你叫什么

我们之所以要解耦才能独立开发,通常是出现了循环依赖。这时候当然可以无脑的用路由把两个组件的耦合解开,也可以独立开发。然而,这样做只是把强引用改成了弱引用,代码还是烂代码。站在重构的角度来说,A、B组件循环依赖就是设计有问题,要么应该重构A、B让依赖单向;要么应该抽离一个共用组件C,让A、B组件都只依赖于C。 如果我们每个组件都只是单向依赖其他组件,各个组件之间也就没有必要解耦。再换个角度说,如果一个组件职责不单一,即使跟其他组件解耦了,组件依然不能很好的工作。如何解耦只是重构过程中可选手段,代码设计的原则如依赖倒置、接口隔离、里氏替换,都可以指导我们写出好的组件。 所以在组件化中重要的是让组件职责单一,职责单一的重要标志之一就是没有组件间的循环依赖