1
28Sv0ngQfIE7Yloe 2021-11-22 11:19:38 +08:00
1.策略工厂
2.模板方法 3.责任链 |
2
ysc3839 2021-11-22 11:22:43 +08:00
x 比较连续的话直接用数组,复杂度就是 O(1) 了。
|
3
ipwx 2021-11-22 11:28:43 +08:00
如果是整数,可以用 switch 。编译器可能帮你直接转换成跳表(查表),也是 O(1) 的。
|
4
zxlzy 2021-11-22 11:35:38 +08:00 1
map 的时间复杂度是 1
|
5
Jooooooooo 2021-11-22 11:35:59 +08:00 4
这...除非是有上万个, 一般不考虑这种性能损耗.
从可读性的角度出发优化吧. |
6
shijieheping 2021-11-22 11:50:09 +08:00
表驱动,逻辑与数据分离
|
7
linquan OP @zxlzy 这个我也挺懵逼的,在 c++好像是 hashmap 复杂度 1 ,直接用哈希函数实现; map 用红黑树,复杂度 logn
|
8
villivateur 2021-11-22 12:13:36 +08:00 via Android
如果是 c 的话,可以考虑结构体数组+函数指针。
C#应该可以直接用字典实现吧? |
9
DTCPSS 2021-11-22 12:20:09 +08:00
|
10
fregie 2021-11-22 12:20:14 +08:00 3
逻辑清楚和简单才是一个中大型软件工程最高优先级,没必要的高效率和低代码量只会徒增项目的维护成本。
|
11
DTCPSS 2021-11-22 12:29:19 +08:00 1
```
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; } ``` |
12
telung 2021-11-22 12:32:05 +08:00
重构 if else 并不能提高代码运行速度
|
13
BeautifulSoap 2021-11-22 12:41:56 +08:00 via Android
lz 你这想法不就是表驱动吗,这么做没问题的
|
14
lightjiao 2021-11-22 13:54:02 +08:00
别搞那么多抽象,求求了,我们项目代码七八层 OOP 看吐了
只要不是那种低效率或者完全没有拆分函数的 if else ,没啥毛病啊,阅读起来简单,好维护,运行效率有保证,还要啥自行车 |
15
Cloutain 2021-11-22 15:12:21 +08:00
switch 不就行了 还用啥 map ,switch 下要么变跳转表,要变索引表,要么变树,充分利用编译器的特性 不要自己折腾
|
16
wizzer 2021-11-22 15:25:08 +08:00
好好优化业务实现,不比优化掉 if else 更能提升性能?
|
17
OysterQAQ 2021-11-22 16:00:53 +08:00
if else 比你说的什么 map 快多了,不是一个量级,==在汇编就一句话 对应机器级别的一条二进制指令 然后根据结果无条件跳转 提升运行速度是不可能的
|
19
OysterQAQ 2021-11-22 16:04:40 +08:00
基本任何对于工程性的优化都不会提高运行速度,例如 magic 数,立即数肯定是比其他寻址方式快得多的。多 if else 需要考虑对于工程性上的优化,代码的可读性 可维护性
|
21
MatDK 2021-11-22 16:55:17 +08:00
你可以做 1 个 functionarray[n]={func0,func1,..../}
然后按直接 functionarray[x](params)就行了.... |
22
PiersSoCool 2021-11-22 16:59:10 +08:00
刚工作:不知道
工作 1 年:策略模式 工作 N 年:只要能看懂,写起来不麻烦就行 |
23
kisshere 2021-11-22 17:17:25 +08:00
[Imgur]( https://imgur.com/eG6Je61)
|
24
DrakeXiang 2021-11-22 17:48:27 +08:00
不考虑性能,几十个 if else 我看着也受不了。。
|
25
tool2d 2021-11-22 18:26:32 +08:00
函数里光是多个 if ,代码也挺好理解的。
就是 else 必须少用。 C++会把大型 switch case 优化成二分查找,相当于 map 的 logn ,但是恕我直言,这对性能压根不重要。除非代码是自动生成的几百几千个 IF ,那另说。 |
26
c0xt30a 2021-11-22 23:20:59 +08:00
对我来讲,这样直白的代码
``` int func( int i ) { return i == 1 ? func1( i ) : i == 2 ? func2( i ) : i == 3 ? func3( i ) : i == 4 ? func4( i ) : i == 5 ? func5( i ) : 0; } ``` 比逻辑与数据分离的表驱动代码更好一点。 |