随便谈谈组件化~

作者: dylanhuang88 | 来源:发表于2018-03-06 13:37 被阅读73次

    前言

    最近事情好多,好久没动笔了,不过最重要还是自己懒了。人一但有了惰性,就真的是一拖再拖。好了,说了几句废话,来说说今天要写的主题--组件化开发

    组件化定义

    相信组件化开发大家都有接触,所谓组件化开发就是把功能尽可能的独立出来,组件间解耦,这样更利于团队协作及后期改造。那这和模块化有什么区别?其实没什么区别,我个人理解都是为了逻辑重用和解耦,但要说区别,组件化比模块化更彻底一些,模块化更像是一个项目中的,就像在项目中建立了多个Module,逻辑上区分了多个模块,但在代码里是直接依赖的。组件化则每一个组件单独成一个项目,单独编译运行,也就是项目对组件的依赖是aar或jar级别的,编译后的依赖,而模块化是代码直接依赖。这只是我个人理解,不喜勿喷。

    为什么要组件化

    以前开发一个App都是直接起一个项目,在里面玩命加功能,结果特别臃肿,后面改bug加功能都十分痛苦,牵一发而动全身,相信初始阶段大家都有过类似的经历。特别是去到一个公司,公司里有大量「祖传代码」并且没有好好规划代码结构时,那真的是怎一个『苦』字了得。

    总结一下组件化好处:

    1. 可以分小组并行开发不同的组件,因为组件间解耦,提高开发效率;
    2. 组件可单独运行、单独测试,修改组件不会轻易引起其它组件的问题,项目质量也会有所提高;
    3. 最终的App只是选择组装各个组件,按需加载,对于产品化的公司很有好处,可随时根据需求快速发布多款App。

    组件化实践

    组件化首先肯定是要将功能模块化的,在模块化的基础上再好好分层,解耦。

    刚开始做模块化,会把功能单独好,但是依赖关系会比较乱,最后可能会变成网状的依赖,导致无法把每个功能单独出来运行。

    整理后应该是这样的(层次清晰,上层依赖下层,同层之间不相互依赖):


    APP架构.png

    Github上已经有很多关于组件化的开源实现,比如 ModularizationArchitectureARouter等等。核心原理就是增加一个路由层,由路由去帮各个组件跑腿通信,这样可以实现组件间解耦,只对路由进行依赖。大家细看会发现,由于要完全解耦,所有开源的组件化框架都是基于一个Action,也就是一个字符串来进行通信的。这就要求每个组件把它的功能Action写成文档提供出来,把所有Action对应的功能参数写出来,因为参数也是通过一个Map进行传递的,这样会导致要调用其它组件时,需要去看文档找到对应Action才能调用,而且对于阅读代码的人来说,也不知道这个Action代表什么意思,没有办法自解释。

    我这里提出了一个理念,也在项目中实践了,在解耦和方便之间取了一个折中。大家都知道,调用方最希望的就是可以直接调用,不需要调用一个就看一次文档,可以直接在代码中由IDE提示这个组件能提供什么功能,而且参数是什么类型,多少个参数。要做到IDE提示,那就需要涉及API调用了。我的项目中是这么实现的:

    同样定义一个通信用的路由,另外定义了一个组件功能定义模块,所有组件都要依赖路由和功能定义模块,这样组件间调用时可以通过路由去直接通过API去调用了。
    比如定义一个设置组件功能:


    功能定义.png

    对于组件功能定义模块,也定义为一个组件,每次增加组件或更新组件对外提供的功能时,就需要修改这个组件功能定义模块。劣势就是每次增加组件,都要在这里添加一个接口定义,好处就是调用者可以很方便地知道每个组件提供哪些功能,接口参数是什么,是在代码中自解释的,不需要去查看每个组件的文档了。

    其它组件调用时就可以方便时由IDE提示了:


    111.png

    总结

    这里主要提出了一个区别于网上组件化框架的点,避免使用字符串去进行组件间交互,这样会不好理解也容易出错。替换方案就是使用接口定义,方便在IDE中提示并且代码自解释。目前我的项目在实践中,还没有发现什么坑,有坑就填吧,毕竟是自己挖的!!如果有其它好的方案欢迎拍砖~

    相关文章

      网友评论

      • 勤息嘻嘻嘻:不明觉厉 高大上~
      • 三也视界:有么有demo提供:grin:
        dylanhuang88:@三也视界 目前是直接用在项目中,没有准备demo,现在还在完善阶段,如果实践的效果不错,也稳定了,会考虑放到github上去

      本文标题:随便谈谈组件化~

      本文链接:https://www.haomeiwen.com/subject/wtylfftx.html