代码规范 : 控制逻辑

来源:互联网 发布:怎样做数据分析表 编辑:程序博客网 时间:2024/04/30 02:25

写在前面

这里写图片描述

代码结构混乱不堪, 控制语句复杂,阅读难以理解,是每一个程序员在初学阶段都有所经历过的. 代码如何写出相对较优美的代码呢? 我们可以从控制结构开始说起.


留空白

空白:空白能增强可读性(包括空格,制表符,换行,空行,缩进)

    // 拥挤不堪的代码    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语句,    第四种,将深层嵌套抽出来放到子函数中    第五种, 在面向对象中,使用多态的方式去创建    最后,重新设计深层嵌套的代码

循环语句的优化:

    合并: 将两个队相同一组元素进行操作的循环合并在一起    放内层: 把最忙的循环放在最内层
原创粉丝点击