meituan/WMRouter

某一个页面或者module对外暴露的方法,如何约束调用者?

Closed this issue · 1 comments

比如:A Module调用B Module的方法,B Module的方法有2个参数,但是调用者不小心传了3个或者1个参数,这显然是B Module不希望的,如果能以某种方式在编译期预处理,调用的时候有编译器提示就好了,请问作者对这方面有什么好的实现思路吗?

你提的两个问题本质上是一样的,都是接口的管理。确实是个头疼问题,没有特别好的解决办法,提供一点参考意见。

首先是A、B两个模块之间的方法调用应该不会很多,如果存在过多方法调用,说明两者耦合度很高,就需要思考,模块拆分是不是不够合理。

然后这个问题大概有几种思路:

1、最简单的方法,下沉接口到底层(方法调用就是interface,key就是字符串常量,或者封装Utils),直接在底层利用语法进行约束,但是可能会有频繁改动不便管理的问题。

2、完全使用文档管理,所有的人按照API文档来处理,就像客户端和后台之间的文档一样。但是这样花费精力会比较多,容易出错,文档更新不及时等等。

3、在1的基础上,可以考虑根据实际情况把接口层拆分成多个库,例如用户登录这类基础接口变动很少,作为一个单独的库,再根据不同的业务场景,还能拆出不同的接口库,接口库根据业务交给不同的人负责维护。

4、结合上面几种方法,变动少的用底层接口,变动多的直接用字符串+可变参数。

5、可以借鉴一下微信团队提出的方案。大概可以这么理解,在每个模块中定义.api文件,本地开发时用gradle插件自动复制所有模块的api文件到一个临时底层库,其他库就可以直接调用这个临时底层库中的代码了,起到语法约束作用,而api文件是在各个库中定义的,职责也比较清晰。但是这种办法也有问题,实现复杂(本地编译和CI打包都有点复杂),对于开发者存在学习成本,更头疼的可能是改api接口的时候,IDE是没法正常关联代码的,所以重构工具不能用,需要手动改所有调用的地方。

微信Android模块化架构重构实践
https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=2649286672&idx=1&sn=4d9db00c496fcafd1d3e01d69af083f9