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

2019-08-15 17:21:51 +08:00
 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()

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

3238 次点击
所在节点    问与答
24 条回复
woscaizi
2019-08-15 23:36:15 +08:00
第三种是 查表法?
Xbluer
2019-08-15 23:39:13 +08:00
@tomoya92 #10 这里几乎不用考虑性能问题。
stevenkang
2019-08-16 09:59:12 +08:00
@sun2920989 这里应该可以不限语言,各个语言都可以这样写。put 的时候是初始化 type 和处理的映射,可以用多种方式初始化,不一定 new。

@kkkkkrua 对,加上 spring 的一些特性,写出来更优雅。这里没有专门突出 spirng 是方便其他语言的使用者也可以参考、讨论研究。

@jadec0der 表驱动法,优势是不是更方便增、减 type 以及热插拔?
@pastgift 对,灵活应用更重要。这里探讨一下这三种方式也是比较各自的优缺点,方便在使用时灵活应对。

@geelaw C 语言里面的知识吗?
lllllliu
2019-08-16 10:12:19 +08:00
EventBus/Notification Center 可以么。 对于多特性的同一种事件,我大部分用的都是用的 EventBus + Factory,或者干脆都变成一个独立的事件。。

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

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

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

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

© 2021 V2EX