不管是模块化还是组件化,都不是一个新的设计思想,它们很早就已经被提出了。但是早期的移动应用由于相对简单,本身逻辑功能也不多,所以在移动端的应用反而没那么广泛。

模块化 or 组件化

  • 从上面的概述来看其实组件化跟模块化没有明显的区别;
  • 一个登录功能可以是一个模块也可以是一个组件,一个日期选择控件可以是一个模块,也可以是一个组件;
  • 因为不管是模块化还是组件化,它们都有一个共同的目标:将一个大的软件系统细化成一个个模块或者组件,都是为了重用和解耦
  • 因此没有一个明确的界线去区分它们,只是 组件化较模块化粒度更小

区别

  • 模块:侧重于功能,与业务无关,比如自定义控件、网络请求库、图片加载库等
  • 组件:侧重于业务,可编译成单独的app,一般只负责单一业务,具备自身的生命周期(通常包含Android四大组件的一个或多个,所以称之为组件也更加贴切)

组件化框架

面向接口
  • 并不能真正的解耦;
  • 内部生成映射表,这个映射表的数据结构通常是一个Map,Key是一个字符串,Value是一个类或者是类的路径名称;
  • 用于通过反射进行类的实例化
面向通信协议
  • 可以真正的实现隔离;
  • 基于事件总线的方式实现组件之间的通信,这些框架会在内部建立跨进程通信的连接(也就是事件总线),这条事件总线负责分发路由请求以及返回执行结果。
  • 只支持基本类型参数的转发。

组件化演变过程

  • 从单工程项目过度到多模块的阶段;
  • 从多模块过度到多组件的阶段;
  • 多组件独立进程的阶段。

    而目前大多数应用其实都是在第二个阶段或者介于第二和第三个阶段之间,所以对于这样的项目,选择一个既支持类查找方式,又支持事件总线的组件化框架是最合适的。