一笑的编程思想:不要为了解决问题而制造问题

260 阅读2分钟

起因

这两天看项目代码,发现一个路由类是由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(...)
}

领悟

我把我的想法和老大说了下(入职没多久,不能搞事情,得慎重),老大一番话,加上我自己的理解,让我悟出一句话

不要为了解决问题而制造问题

什么意思呢!其实,现在这样的代码除了看起来比较掉价,运行起来是没什么问题的。我的方案虽然可以美观代码,让代码结构清晰合理(私以为),但是没有带来实质性的提升(性能,维护便利【别人可能会认为"我现在用也挺方便啊!加一行代码的事!"】),索性我就也放弃“优化了”,算是无用的优化吧!