iOS组件化、模块化

这篇文章主要谈一下自己对模块化和组件化的理解。

模块化和组件化差别

很多时候模块化、组件化会被大家认为是一个东西。其实我觉得他们是有很大差异的。
组件:按我理解是比较小的功能块,他的拆分粒度相对模块来说要细很多。
模块:按我理解是比较大的功能块,他的拆分粒度相对组件来说要大的多,尤其是一个工程非常庞大的时候,很多公司会拆分成各个业务线,每个业务线负责自己的模块,最后把这些模块集成到一个主工程中。

所以,我认为一个好的工程结构应该合理的对其进行模块化,对于每个模块合理的进行组件化。组件与组件间的交互通过面向对象就能很优雅的处理好,那么模块与模块间又如何优雅的进行交互呢?

模块如何交互

模块与模块交互这个话题,网上讨论最多的两种方案:(注意,网上说的组件其实是我理解的模块的意思,所以我用模块来描述,这个是个人的小洁癖,细节决定成败)

  1. 通过注册url的方式实现模块间交互,蘑菇街Limboy的模块化方案
  2. 利用OC runtime的特性,实现模块间交互,CASA的方案

关于这两种方案的利弊有很多说法,仁者见仁智者见智,总之这两种方案都是能抓到老鼠的好猫,如果你对模块化还没有一定的概念,大脑中没有任何相关的构思,建议先去看看他们的文章,我这篇文章不会介绍具体的知识点,只记录一下自己的理解。

关于这两种方案的总结,我推荐一篇文章给大家,介绍的非常到位,思路清晰,bang神对两种方案的总结与理解,值得看一看

那么针对这两种方案,我个人是偏向CASA的方案的,原因和bang神的看法也大体一致。其实CASA的方案也很简单,就是利用了OC特性,通过runtime,动态的从一个模块往另外一个模块调用,而不是import的方式去调用。为了避免每一个调用的地方都重复的写这种动态的调用代码,CASA对这种重复性代码进行了优化,只要大家遵循一定的规则,那么这种重复性的代码就可以抽取出来了,target-action方案也由此诞生。
CASA的方案CTMediator源码和demo也很简单,建议大家看一看。demo很好的演示了调用流程。
不过个人认为demo中没有很好的展示出mediator中间件由谁来负责开发和维护,于是我建了一个例子,做简要说明,仔细关注一下一下图的文字阐述。

模块交互职责简图

最后双手附上demo

你可能感兴趣的:(iOS组件化、模块化)