关于if-else代码的优化
if-else分支代码在我们日常开发中基本上是最常用的逻辑,但是,经常在if-else代码过多的情况下,代码会变得特别臃肿,并且代码的可扩展性会变得不好,所以,优化if-else代码逻辑是很有必要的。以下介绍几种我在日常工作中比较常用的优化手段
1.通过switch-case优化
这是最简单的优化方式,基本上每一个程序员都能运用。下面举个例子:
1 int value = this.getValue();
2 if(value==1) {
3 // TODO somethings
4 } else if(value==2) {
5 // TODO somethings
6 } else if(value==3) {
7 // TODO somethings
8 } else {
9 // TODO somethings
10 }
上面的代码,可以优化为:
1 int value = this.getValue();
2 switch (value) {
3 case 1:
4 // TODO somethings
5 break;
6 case 2:
7 // TODO somethings
8 break;
9 case 3:
10 // TODO somethings
11 break;
12 default:
13 // TODO somethings
14 }
这种优化,除了代码性能上有极小的优化之外,基本是换汤不换药,代码依然是很臃肿,可扩展性一样不好,所以,不建议用这种优化方式
2.使用条件三目运算符
条件三目运算符基本上每一个程序员也都知道,但是,应用在日常开发上的人很少,这玩意儿经常会被人所忽略。
比如下面代码:
1 int value = 0;
2 if(condition) {
3 value=1;
4 } else {
5 value=2;
6 }
可以优化成:
1 int value = condition ? 1 : 2;
经过这样优化,代码立刻变得清晰明了
3.异常/return/continue/break 语句前置
例如代码:
if(condition) {
// TODO somethings
} else {
return;
} if(condition) {
// TODO somethings
} else {
throw new Exception();
} while(condition1) {
if(condition2) {
// TODO somethings
} else {
continue; // or break
}
}
可以分别优化成
1 if(!condition) {
2 return;
3 }
4 // TODO somethings
5
6 if(!condition) {
7 throw new Exception();
8 }
9 // TODO somethings
10
11 while(condition1) {
12 if(!condition2) {
13 continue; // or break
14 }
15 // TODO somethings
16 }
4.使用表驱动法优化if-else分支
这是优化if-else的利器,也是我在日常工作中最经常使用的一种优化方法。使用了这种方法,真正做到了把if-else变成配置化。表驱动法优化也很简单,我们看下面一段代码:
1 int key = this.getKey();
2 int value = 0;
3 if(key==1) {
4 value = 1;
5 } else if(key==2) {
6 value = 2;
7 } else if(key==3) {
8 value = 3;
9 } else {
10 throw new Exception();
11 }
这段代码可以优化成:
1 Map map = new HashMap();
2 map.put(1,1);
3 map.put(2,2);
4 map.put(3,3);
5
6 int key = this.getKey();
7 if(!map.containsKey(key)) {
8 throw new Exception();
9 }
10
11 int value = map.get(key);
这种优化方法,基本把if-else逻辑消灭了。当增加另一个值时,直接修改map,而不需要再增加分支
需要注意的是,这种方法不仅仅适合单个值赋值,里面的value还可以是方法名,利用反射进行调用
5.抽象出另一个方法,优化该方法的if-else逻辑
例如:
1 public void fun1() {
2
3 if(condition1) {
4 // TODO sometings1
5 if(condition2) {
6 // TODO something2
7 if(condition3) {
8 // TODO something3
9 }
10 }
11 }
12
13 // TODO something4
14
15 }
这段代码,if的逻辑很深,让阅读代码的人很难进行下去。下面我们抽象出另一个方法,进行优化
1 public void fun1() {
2
3 this.fun2();
4
5 // TODO something4
6
7 }
8
9 private void fun2() {
10 if(!condition1) {
11 return;
12 }
13 // TODO sometings1
14
15 if(!condition2) {
16 return;
17 }
18 // TODO something2
19
20 if(!condition3) {
21 return;
22 }
23 // TODO something3
24 }
6.用设计模式优化if-else逻辑
例如用工厂模式、模板方法模式(就是多态)进行优化,这类方法网上有很多讲解,我就不班门弄斧了
以上是我在工作中经常使用的优化if-else的方法,如果有错误或者还有其他的方法,还望大家不吝赐教
关于if-else代码的优化的更多相关文章
- Java开发代码性能优化总结
代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...
- Java开发中程序和代码性能优化
现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- Android代码内存优化建议-OnTrimMemory优化
原文 http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...
- JAVA_eclipse 保留Java文件时自动格式化代码和优化Import
Eclipse 保存Java文件时自动格式化代码和优化Import Eclipse中format代码的快捷方式是ctrl+shift+F,如果大家想保存 java文件的时候 自动就格式化代码+消除不必 ...
- JavaScript代码性能优化总结
JavaScript 代码性能优化总结 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢.浏览器已经实现的方法,就不要再去实现一遍了.另外,浏览器已经实现的方法在算法方面 ...
- Html代码seo优化最佳布局实例讲解
搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. 1.<!–木庄网络博客–> 这个东西是些页面注释的,可以在这里加我的& ...
- 利用封装、继承对Java代码进行优化
注:本文实例分别可以在oldcastle(未优化的代码)和newcastle(优化后的代码)中查看,网址见文末 城堡游戏: 城堡中有多个房间,用户通过输入north, south, east, wes ...
- java代码之美(11)---java代码的优化
java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...
- 嵌入式程序设计中C/C++代码的优化
虽然使软件正确是一个工程合乎逻辑的最后一个步骤,但是在嵌入式的系统开发中,情况并不总是这样的.出于对低价产品的需求,硬件的设计者需要提供刚好足够的存储器和完成工作的处理能力.所以在嵌入式软件设计的最后 ...
随机推荐
- 推荐系统实践 0x0b 矩阵分解
前言 推荐系统实践那本书基本上就更新到上一篇了,之后的内容会把各个算法拿来当专题进行讲解.在这一篇,我们将会介绍矩阵分解这一方法.一般来说,协同过滤算法(基于用户.基于物品)会有一个比较严重的问题,那 ...
- 一千行MySQL命令
基本操作 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_p ...
- Python妙用re.sub分析正则表达式匹配过程
声明:本文所使用方法为老猿自行研究并编码,相关代码版权为老猿所有,禁止转载文章,代码禁止用于商业用途! 在<第11.23节 Python 中re模块的搜索替换功能:sub及subn函数>介 ...
- java课堂作业--异常处理
一. 运行结果: 二. 结果: ArrayIndexOutOfBoundsException/内层try-catch 发生ArithmeticException 三. 结果: ArrayIndexOu ...
- Oracle表操作-创建及增删改查
数据类型: 1.CHAR:定长字符类型,默认长度是1,最长不超过2000字节. 2.CARCHAR2(length):可变字符类型,默认长度是1,最长不超过4000字符. 3.NUMBER(P,S): ...
- Windows下MySQL无法启动万能解决方案
MySQL启动报错 window10上安装了MySQL之前使用都是执行net start mysql 启动,执行net stop mysql关闭. 某天开始启动报错"MySQL 服务无法启动 ...
- CSS基础-字体
字体变化设置 改变字体颜色 color 改变字体大小 font-size 改变字体粗细 font-weight 改变字体样式 font-family 改变字间距 letter-spacing 改变字体 ...
- 题解-CF101D Castle
题面 CF101D Castle 给一棵 \(n\) 个节点的带权树,求一种遍历方案,从 \(1\) 出发,每条边走两次,走过所有点,第一次经过每个节点的平均时间最小.输出这个平均时间. 数据范围:\ ...
- 题解-TJOI2015 弦论
TJOI2015 弦论 字符串 \(s\) 和 \(t\) 和 \(k\).如果 \(t=0\),不同位置的相同子串算 \(1\) 个:如果 \(t=1\),不同位置的相同子串算多个.求 \(k\) ...
- Android Studio中SVN的使用
1.忽略文件 1)这种方式,每次新建一个项目都要添加,并不是全局的. .idea文件夹 .gradle文件夹 所有的build文件夹 所有的.iml文件 local.properties文件 2)使用 ...