代码规范 : 控制逻辑

写在前面

这里写图片描述

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


留空白

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

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

循环语句的优化:

    合并: 将两个队相同一组元素进行操作的循环合并在一起
    放内层: 把最忙的循环放在最内层
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值