起因
这两天看项目代码,发现一个路由类是由when is
去做分发的,类似于Java
中的switch case
, 伪代码如下
when (message) {
is ClassA -> handlerA.handleSomething(...)
is ClassB -> handlerB.handleBlabla(...) // 一个 Handler 存在多个路由
is ClassC -> handlerB.handleBiliBili(...) // 一个 Handler 存在多个路由
...
is ClassZ -> handlerZ.handleGaoBili(...)
}
这段代码反编译之后的 Java 代码差不多是这样的:
if (message instanceof ClassA) {
handlerA.handleSomething(...)
} else if (message instanceof ClassB) {
handlerB.handleBlabla(...)
} else if (message instanceof ClassC) {
handlerB.handleBiliBili(...)
}else if (message instanceof ClassZ) {
handlerZ.handleGaoBili(...)
}
这段代码加起来差不多 700 行,反编译之后的 Java 代码差不多 2000 行,像if else if
这种判断时间复杂度最好的情况是 O(1),最差是 O(n)。其实分发到指定 Handler 的时候是可以做到 O(1)
初步想法
以下是我的初步想法:
- 自定义一个注解,将路由信息注解在业务 Handler 上,启动的时候扫描注解,用
HashMap
做路由表 - 新建一个父类 Handler ,再让众多业务 Handler 去实现它的方法,分发的时候从路由表取出指定 Handler, 然后调用 handle() 方法,这样分发的时候就是 O(1) 了 伪代码如下:
annotation class HandlerAnnotation(vararg val clazz: KClass<*>) // 注解到众多业务 Handler 上,参数为 Class(什么都行,举个栗子)
abstract class Handler {
abstract fun handle(message: Any) // 分发到指定 handler 时,只需 hashMap[ClassA].handle(...)
}
领悟
我把我的想法和老大说了下(入职没多久,不能搞事情,得慎重),老大一番话,加上我自己的理解,让我悟出一句话
不要为了解决问题而制造问题
什么意思呢!其实,现在这样的代码除了看起来比较掉价,运行起来是没什么问题的。我的方案虽然可以美观代码,让代码结构清晰合理(私以为),但是没有带来实质性的提升(性能,维护便利【别人可能会认为"我现在用也挺方便啊!加一行代码的事!"】),索性我就也放弃“优化了”,算是无用的优化吧!