探讨三种方式哪种效率高、可读性、可维护性好: if-else、switch、和另外一种

2019 年 8 月 15 日
 stevenkang

我们现在有一个参数 type,需要根据 type 进行相应的代码处理( type 大概有 20+ 种情况),用题目中的三种方式如下

if-else 方式

if (type == 'type1') {
    // todo something
} else if (type == 'type2') {
    // todo something
}
...
else if (type == 'typeN') {
    // todo something
} else {
    // otherwise
}

switch 方式

swtich(type) {
    case 'type1': /* todo something */ break;
    case 'type2': /* todo something */ break;
    ...
    case 'typeN': /* todo something */ break;
    default: /* otherwise */ break;
}

另外一种(我不知道这叫什么方式)

static {
    // 这里的 put 可以通过别的方式装载,可以一次性写好了之后,需要扩展时主动添加到 map 里面(也可以用注解注入等方式)
    map.put('type1', new Type1Process())
    map.put('type2', new Type2Process())
    ...
    map.put('typeN', new TypeNProcess())
    map.put('default', new DefaultProcess())
}
proc = map.containsKey(type) ? map.get(type) : map.get('default')
proc.exec()

从执行效率、可读性、可维护性等多个方面来看,哪种方式综合评分更高?

4731 次点击
所在节点    问与答
24 条回复
z42514
2019 年 8 月 15 日
我选三
TomVista
2019 年 8 月 15 日
20 种 type 可以排除 if else 了吧
mara1
2019 年 8 月 15 日
放到字典里,差不多就是 3
hmellochan
2019 年 8 月 15 日
那么多类型,明显三好。
Vegetable
2019 年 8 月 15 日
2 和 3 在底层差不多是一样的吧,条件这么多我选 3.
672795574
2019 年 8 月 15 日
1,2 我选 1,踩过忘记加 break 的坑(自己的问题)
3 应该是抽象过了,看着也有点符合开闭原则
因此理论上新加一个 type 和 Processor 不需要测试原来的逻辑。
fuxiao11
2019 年 8 月 15 日
3 其实是责任链模式的一种变形实现
kkkkkrua
2019 年 8 月 15 日
spring 直接 getBean("xxx_TYPE1").exec()不更好么,
其他方式直接 new 对应的实例,不用 if..
Justin13
2019 年 8 月 15 日
当然是第三种字典啦。
zael
2019 年 8 月 15 日
性能上哪个最高呢
ohmycodeape
2019 年 8 月 15 日
没看出来是什么语言,但是确定第三种方法是在 get 时才去实例化的吗?看着写法有点担心 put 时直接 new 了.
autoxbc
2019 年 8 月 15 日
2 好,switch 故意不写 break 也是一种写法

语句由上而下叠加执行,在需要共享一部分处理逻辑时有奇效。当然要防止别人打你
ianva
2019 年 8 月 15 日
表驱动
jadec0der
2019 年 8 月 15 日
第三种在代码大全 18 章叫「 表驱动法」
Leammin
2019 年 8 月 15 日
少的时候 2,多的时候 3
murmur
2019 年 8 月 15 日
我投 gotoy 一票
ywcjxf1515
2019 年 8 月 15 日
谷歌搜 if 策略模式 map v2ex,或者搜 if 状态模式 map v2ex。
zw1one
2019 年 8 月 15 日
如果你 if 里的条件全长这个样子,那肯定 3 好。如果 if 条件会突然多两个奇怪的判断,用 3 就不好改。
pastgift
2019 年 8 月 15 日
2 到 5 个分支用,每个分支代码量中等( 20 行以内) if-else
3 到 10 个分支,每个分支代码量很少( 10 行以内) switch-case
2 个分支以上,每个分支代码量很多,表驱动方式

具体操作按个人喜好,项目要求,统一性洁癖,美观等因素调整
写代码不要太死板
geelaw
2019 年 8 月 15 日
第三种叫做 branch/jump table。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/592201

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX