一种低侵入性的组件化方案 之 APP组件化简介

github开源地址 github.com/beyondxia/m…git

1 、什么是组件化

    在谈什么是组件化以前,咱们须要先了解什么是业务模块。那什么是业务模块呢,从研发角度来说,说白了,就是APP中一些功能相对较独立的,又一个或一波人维护的,有独立业务形态的代码集合。配一张图感觉一下^_^,购物模块,会员模块,电影模块,酒店模块等通常就能够理解为一个业务模块。github

    其实咱们的组件化就是针对业务模块开展的,每一个业务都能成为一个独立的组件,能够独立开发,独立编译(甚至独立运行和测试)。业务之间经过一系列的接口或协议做用通讯的桥梁,除此以后,你们互不关心,各业务独立彻底隔离。架构

2 、为何要组件化

    因为每一个业务模块的开发人员每每是不一样的,试想一下,若是全部的模块代码都位于一个代码仓,全部的模块代码都是耦合在一块儿,没有组件的概念,那么:app

  1. 开发效率必然会比较低,定位问题比较难
  2. 代码修改风险高,一个模块代码的修改,可能会应用其余模块。
  3. 编译时间久,哪怕只是一个模块的修改,必须编译整个应用。
  4. 代码结构不清晰,架构不够稳定,也不便于扩展和组件复用
  5. 等等

三、组件化开发步骤

    要实现组件化开发,主要要作两件事:1. 首先须要业务间代码解耦。2. 组件间通讯框架

四、实现方案

4.一、解耦

    按照组件化开发步骤,实现组件化首先要实现的是代码间解耦,解耦的目的是让业务间没有任何代码依赖,没有代码交叉调用,可是又要能作到解耦后的正常通讯和数据传输。
    针对解耦,目前传统的作法是接口暴露方式:业务模块以接口或协议的方式暴露该模块的方法和功能,主app启动时(或适当的时机)注册各个业务暴露的方法和功能,咱们也采用了相似的作法,架构图以下:函数

每一个业务模块以service的方式暴露本身的功能和接口给到中间服务层(位于业务层之下),服务层收集各个业务暴露的方法和接口,在应用启动时(或适当的时机)注册,其余业务模块向服务层获取各个模块暴露的服务, 如图中红色部分。 服务层维护一个HashMap存放虽有的服务,以下:组件化

并提供注册和获取服务的方法:

建议每一个业务模块注册一个服务,固然,能够根据业务的,一个模块也能够注册多个服务:post

其余业务模块根据服务名获取服务并调用服务暴露的方法:

至此,咱们能够经过增长中间服务层的方式,达到代码解耦的目的。这也是目前业界解耦的经常使用方法。测试

4.二、通讯方式

业务隔离后,就须要一套通讯方式,使各业务能够进行方便高效的通讯,其实通讯方式,莫过于如下三种:3d

  • call(模块间函数调用):每一个独立的业务模块暴露Service接口,供外界调用,如:
  • notify/publish(模块间通知):每一个业务模块注册全局的感兴趣的事件,事件产生后通知 ,可使用rxbus,通知,路由等方式,本文赞不对该项进行讨论:
  • router(模块间页面跳转):UI跳转 ,统一使用路由方式,三端统一路由可使用Arouter,ActivityRouter等开源框架,本文暂不作讨论.

至此,通讯方案介绍完成。

下一篇:一种低侵入性的组件化方案 之 组件化须要考虑的几个问题

相关文章
相关标签/搜索