大量 if-else 的函数重构

2021-11-22 11:16:33 +08:00
 linquan
语言是 c#,代码中有很多 if-else 的判断语句,就像这样:if (x==1) then func1... if (x==2) then func2... ...像这样有几十个。虽然看起来还算清楚,但是想用一种更加高效率的方式完成,能够减少代码量,或者提高运行速度。目前想到的是做一个 x 和 func 的映射,例如 map 等,然后这样时间复杂度就变成了 logn 。请问有没有更好的方法?
3809 次点击
所在节点    问与答
26 条回复
28Sv0ngQfIE7Yloe
2021-11-22 11:19:38 +08:00
1.策略工厂
2.模板方法
3.责任链
ysc3839
2021-11-22 11:22:43 +08:00
x 比较连续的话直接用数组,复杂度就是 O(1) 了。
ipwx
2021-11-22 11:28:43 +08:00
如果是整数,可以用 switch 。编译器可能帮你直接转换成跳表(查表),也是 O(1) 的。
zxlzy
2021-11-22 11:35:38 +08:00
map 的时间复杂度是 1
Jooooooooo
2021-11-22 11:35:59 +08:00
这...除非是有上万个, 一般不考虑这种性能损耗.

从可读性的角度出发优化吧.
shijieheping
2021-11-22 11:50:09 +08:00
表驱动,逻辑与数据分离
linquan
2021-11-22 11:58:24 +08:00
@zxlzy 这个我也挺懵逼的,在 c++好像是 hashmap 复杂度 1 ,直接用哈希函数实现; map 用红黑树,复杂度 logn
villivateur
2021-11-22 12:13:36 +08:00
如果是 c 的话,可以考虑结构体数组+函数指针。
C#应该可以直接用字典实现吧?
DTCPSS
2021-11-22 12:20:09 +08:00
fregie
2021-11-22 12:20:14 +08:00
逻辑清楚和简单才是一个中大型软件工程最高优先级,没必要的高效率和低代码量只会徒增项目的维护成本。
DTCPSS
2021-11-22 12:29:19 +08:00
```
async Task DoSomething(Direction direction)
{
Task task = direction switch
{
Direction.Up => GoNorthAsync(),
Direction.Right => GoEastAsync(),
Direction.Down => GoSouthAsync(),
Direction.Left => GoWestAsync(),
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
};
await task;
}
```
telung
2021-11-22 12:32:05 +08:00
重构 if else 并不能提高代码运行速度
BeautifulSoap
2021-11-22 12:41:56 +08:00
lz 你这想法不就是表驱动吗,这么做没问题的
lightjiao
2021-11-22 13:54:02 +08:00
别搞那么多抽象,求求了,我们项目代码七八层 OOP 看吐了
只要不是那种低效率或者完全没有拆分函数的 if else ,没啥毛病啊,阅读起来简单,好维护,运行效率有保证,还要啥自行车
Cloutain
2021-11-22 15:12:21 +08:00
switch 不就行了 还用啥 map ,switch 下要么变跳转表,要变索引表,要么变树,充分利用编译器的特性 不要自己折腾
wizzer
2021-11-22 15:25:08 +08:00
好好优化业务实现,不比优化掉 if else 更能提升性能?
OysterQAQ
2021-11-22 16:00:53 +08:00
if else 比你说的什么 map 快多了,不是一个量级,==在汇编就一句话 对应机器级别的一条二进制指令 然后根据结果无条件跳转 提升运行速度是不可能的
ipwx
2021-11-22 16:02:20 +08:00
@OysterQAQ 你说错了吧,switch-case 才是跳表。。。。if-else 串联 1000 个那还是得慢。
OysterQAQ
2021-11-22 16:04:40 +08:00
基本任何对于工程性的优化都不会提高运行速度,例如 magic 数,立即数肯定是比其他寻址方式快得多的。多 if else 需要考虑对于工程性上的优化,代码的可读性 可维护性
OysterQAQ
2021-11-22 16:08:21 +08:00
@ipwx 你说的对 if 串联是会多次判断,我是说 if/switch 一次判断和 map 一次映射的比较

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

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

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

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

© 2021 V2EX