优雅的组织方法的控制流

作者: 刘硕jessie | 来源:发表于2017-07-30 17:34 被阅读968次

    一、通过提前返回来减少方法的嵌套

    在方法中通过提前返回的方式不仅可以简化方法的逻辑判断,还可以使方法中的嵌套关系更加简洁。优先处理异常,简单的情况并返回,将复杂的情况或主要逻辑最后处理。
    如果函数返回之前需要执行相关的清理操作,不同的语言提供了不同的清理机制。java中可以通过try finally 机制实现。
    示例1:复杂的逻辑判断和嵌套关系导致代码不可读

            if (user_result == SUCCESS) {
                if (permission_result != SUCCESS) {
                    reply.writeErrors("error reading permissions");
                    reply.done();
                    return;
                }
                reply.writeErrors("");
            } else {
                reply.writeErrors(user_result);
            }
            reply.done();
    

    示例1应用提前返回,格式化的代码可读性更高,更优雅:

            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();
    

    二、安排if/else语句块的顺序

    在写if/else语句时,你通常可以自由地变换语句块的顺序。例如,你即可以写成:
    
            if (a == b) {
                //case one
            } else {
                //case two
            }
    

    也可以写成:

            if (a != b) {
                //case two
            } else {
                //case one
            }
    
    那么到底应该如何安排语句块的顺序才是最优,可读性更高的方案呢。实践证明,首先处理控制流的正逻辑而不是负逻辑会使代码更容易理解。例如,用
    

    if (debug) 而不是if (!debug) 。

    三、安排条件语句中参数的顺序

    对于如何安排条件语句中参数的顺序,有如下原则:
    

    比较的左侧:"被问询的" 表达式,它更倾向于不断变化。
    比较的右侧:比较的标的表达式,它的值更倾向于稳定

    举几个例子,体会下哪种方案更易读:
    示例1:

    if ( length >= 10 ) 
    还是
    if ( 10<=length )
    

    示例2:

    while ( bytes_received < bytes_expected ) 
    还是
    while ( bytes_expected > bytes_received )
    

    四、使用三目运算符的原则

    将三目运算符用于从两个简单的值中做出选择的情况会使代码更加紧凑,易读,切记只能将其用于从两个简单的值中做出选择的情况,其他情况需要使用if/else 等条件选择语句。
    下面举几个例子,体会一下,哪种方案更易读:
    

    示例1:

    time_str += (hour >= 12) ? "pm" : "am" ; 
    还是
    if (hour >= 12) {
        time_str += "pm" ;
    } else {
        time_str += "am";
    }
    

    示例2:

    return exponent >= 0 ?
               mantissa * (1 << exponent) : 
               maintissa /(1 << -exponent); 
    还是
    if (exponent >=0){
        return mantissa * (1 << exponent );
    } else {
        return mantissa / (1 << -exponent);
    }
    
    

    如果想了解更多信息或者对开源项目感兴,请加我的微信公众号,我在那里等你

    小熊的开源社区.jpg

    相关文章

      网友评论

        本文标题:优雅的组织方法的控制流

        本文链接:https://www.haomeiwen.com/subject/atghlxtx.html