写在前面
代码结构混乱不堪, 控制语句复杂,阅读难以理解,是每一个程序员在初学阶段都有所经历过的. 代码如何写出相对较优美的代码呢? 我们可以从控制结构开始说起.
留空白
空白:空白能增强可读性(包括空格,制表符,换行,空行,缩进)
// 拥挤不堪的代码
for(int index=count;index<numLength;index++)
// 修改
for(int index = count; index < numLength; index++)
equals
所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较
将实际想对比的数据,放在equals 前面,因为equals里才能能校空
static String getName(){
return null;
}
// 例子
if ( "set".equals( getName() ) ) {
return true;
} else {
return false;
}
// 说明: 这样即使getName是null 的返回结果是 false
// 反例
if ( getName().equals("set") ){
return true;
} else {
return false;
}
// 这样null 是不能进行equals 比较的,系统会抛出异常
实际使用中还要去除魔法值
private static final String person = "eva";
if ( getName().equals( person ) ){
return true;
} else {
return false;
条件语句
除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句
//方法一:将复杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。
boolean existed = (file.open(fileName, "w") != null) && (...) ;
if (existed) {
...
}
// 方法二:将负责的逻辑判断结果放在新的函数里面,提高可读性
if ( isSuccess() && young() ){
...
}
boolean isSuccess(){
return name != null && "".equals(name.trim())
}
int young (){
return ( age + briday ) < 5;
}
卫语句
对多层的 if else-if : 使用卫语句
反例:
if(){
if(){
if(){
// 基本每一个初学者,会写出这样的代码,风格很难看,阅读难度大
}
}else if(){
}
}
卫语句 (风格清晰)
if (){
return ;
}
if(){
return ;
}
if(){
....
}
移除控制标志
移除控制标志:使用break continue return 跳出,
// 使用了控制标志的例子(当然我们不要这么做)
boolean flag = true;
while ( flag ){
if(....){
flag = false;
}
}
// 使用break continue return 跳出
while ( true ){
if(....){
break;
}
}
大于号 小于号
按照数轴顺序编写数值表达式:
最好是从小到大排列
原来 : MAX >= i && MIN <= i
区间一 : MIN <= i && i <= MAX
区间二 : i<= MIN || MAX <= i
条件反转
在深度嵌套的条件语句里,我们很难使用卫语句
// 反例
if( capital <0 ) {
if( num >= sum) {
// doSomethings
}
}
// 将条件语句的符号反转,再转成用卫语句
if( capital >= 0 ) {
return ;
}
if( num >= sum) {
return ;
}
// doSomethings
等同判断
利用代数恒等式:减少判断次数
sqrt(x) < sqrt(y)
换为 x < y ;
!a && !b
换为 !(a && b)
将null 值变成null对象:
// 原来
List<String> list = null ;
// 替换
List<String> list = new ArrayList<>();
哨兵值:
一个循环常用的值,可以使用一个中间值去表示
for(int i = 0; i< len;i++){
for(int j = 0 ; j < leng ;j++){
rate[j] = rate[j] * dis[i];
//这里的dis[i] 在内层每一次都要去访问
}
}
//转换为
int disSave = 0;
for(int i =0; i< len;i++){
//在java 里 这样能提速不少
disSave = dis[i];
for(int j = 0 ; j < leng ;j++){
rate[j] = rate[j] * disSave;
}
}
补充一
计算括号的方法, 从零开始计数 遇到”(” 就自己加一 ,遇到”)”,就自己减一
补充二
按照执行的频率排列 控制子句(作用不大,因为你的控制子句并不多,如果多可以考虑用驱动表去 或者 oop 的思想去规避)
对照表
驯服危险的深层嵌套:
第一种,卫语句
第二种,把嵌套的if 装换成 it ..else if 语句
第三种, 将if 创换成case语句,
第四种,将深层嵌套抽出来放到子函数中
第五种, 在面向对象中,使用多态的方式去创建
最后,重新设计深层嵌套的代码
循环语句的优化:
合并: 将两个队相同一组元素进行操作的循环合并在一起
放内层: 把最忙的循环放在最内层