针对 if-else 的各种不同优化方案。

消灭if-else嵌套

参考出处1:使用设计模式中的策略模式来优化针对不同条件进行不同操作的需求。

参考出处2:优化大量的if else 的不同方法

1
2
3
4
5
6
7
8
9
10
11
12
13
if (true) {
if (true) {
if (true) {
if (true) {
if (true) {
if (true) {
...
}
}
}
}
}
}

if-else一般不建议嵌套超过三层,如果一段代码存在过多的if-else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。

多条件判断时的if-else选择与排序

参考出处

原则

if/else 语句块的顺序

  • 首先处理正逻辑而不是负逻辑
  • 先处理简单的情况
  • 先处理有趣的或者是可疑的情况

通过提早返回减少嵌套

总结变量

  • 用一个短很多的名字来代替一大块代码,这就是总结变量。
  • 使用德摩根定理,分解复制的判断逻辑
  • 拆分巨大的语句,让语句更容易快速阅读

分析函数(或代码块)画出逻辑树

逻辑树是为了理清复杂if语句逻辑二产生的,结构与哈夫曼树类似:

逻辑树规则:(模块的定义:每一个if/else的分支即为一个模块)

1.每个模块都是一个根结点,每一个根结点都会结束函数运行。

2.同等级的模块(即if语句的正反两面),无子模块的模块(内部无if语句)优先级高于拥有子模块的模块(内部嵌套if语句)

3.同等级和同条件(两个模块都拥有子模块或者都没有子模块)的情况下,使用率高的模块优先级高于使用率低的

4.若模块中包含子模块,子模块的优先级高于父模块。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 1
if(user_result == SUCCESS ){
// 2
  if( permission_result != SUCCESS){
// 3
    reply.WriteErrors("error reading permissions");
    reply.Done();
    return;
// 2
  }
  reply.WriteErrors("");
// 1
}else{
// 4
  reply.WriteErrors(user_result);

}

// 共有
reply.Done();
return;

根据原则优化:

  1. 2、4两个属于同等级模块,但是由于红色模块中包含一个子模块,所以红色模块优先级低于紫色模块

  2. 3模块属于2模块子模块,所以3模块优先级高于2模块

  3. 函数的优先级排列由高到低为:4 > 3 > 2

得:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(user_result != SUCCESS){
  reply.WriteErrors(user_result);
  reply.Done();
  return;
}


if(permission_result != SUCCESS){
  reply.WriteErrors(permission_result);
  reply.Done();
  return;
}

reply.WriteErrors("");

reply.Done();
return;

哈夫曼树在多重判定程序中的运用

参考论文

哈夫曼

小技巧

多个「或」等值判断

参考出处

reg.equals(“1”) || reg.equals(“2”) || reg.equals(“3”)||…省去n个

可以借助map或set来进行判断,因为hashmap是一个hash桶,查找的效率是比较快的,不管判断任何值,查询效率基本很稳定。

推荐指定hashmap的长度和需要判断的元素一样多,这样就避免对某一个桶内衍生出多余链表了。

Java逻辑条件多个「或」判断时,性能优化小技巧,值得一试

Java逻辑条件多个「或」判断时,性能优化小技巧,值得一试

提前判断返回

如下语句

1
2
3
4
5
6
if(condition){
//dost
}else{
return ;
}
12345

改为

1
2
3
4
5
if(!condition){
return ;
}
//dost
1234

避免一些不必要的分支,让代码更精炼。

留言

⬆︎TOP