让代码更优雅1:清晰的错误处理

    最近在做代码规范,也看了几本书,发现代码要想写的简单、漂亮并且可读性强其实不是一件容易的事情。于是开始研究如何将常用的一些代码结构书写的更优雅一些,今天先分享第一个。

 

    我们在写一块逻辑或者编写一个函数(方法)的时候,为了代码的健壮性,通常需要添加一些容错处理。容错处理是很重要的一个环节,如果考虑的不够周详,很容易产生bug,这个在编写后台代码的时候尤其重要,因为后台服务都是要长期运行的,仍和一个小bug都可能导致服务崩溃。但是如果我们给一段逻辑加上容错处理后,经常会发现代码写的很杂乱无章,到处都是容错代码,真正的核心逻辑都不知道跑哪里去了。经常见到的情况是很多层的if嵌套,很难理清楚代码逻辑。下面是个比较简单的例子:
    Java代码:

    public static String Format1(int age, String name, double salary) {
        if(age > 18) {
            if(name != null && name.trim() != "") {
                if(salary > 0) {
                    //核心逻辑
                    String personInfo = String.format("name:%s,age:%d,salary:%lf", name, age, salary);
                    return personInfo;
                } else {
                    System.err.println("Salary must be larger than zero! ");
                }
            } else {
                System.err.println("Name cannot be empty! ");
            }
        } else {
            System.err.println("Age must be larger than 18.");
        }
        
        return "";
    }

    上面的代码因为逻辑不是很复杂,所以看起来还好,但是已经比较难阅读了,if嵌套了三层,核心逻辑缩进的过于厉害,阅读起来已经很吃力了。在真正的项目中,这种情况可能更加突出,嵌套的if极端情况下可能有七八层,那个时候看代码的人肯定会很抓狂。

    我们当然可以简单的把错误处理代码放在最前面,如果有错就return。但是这种编码方式在某些场景下并不适用,或者说会产生很多重复性代码。比如逻辑处理的是几个文件读写的时候,代码结束肯定要关闭这些文件。如果我们在一开始错误处理,有错就return,文件可能不能关闭。当然可以在每个错误处理段落里面尝试关闭所有文件,但这样会产生很多重复代码。当然可以把文件关闭包个函数,但这样就多出了一个很没有存在必要的函数。

    我想了很久,想了一个自认为比较清晰的编码方式。我们可以将每种错误封装一个逻辑变量,然后用错误判断表达式给这些变量赋值。最好用一层if语句处理所有逻辑。第一个if处理正确时候的核心逻辑,其他if分支则处理各种错误。下面是代码:
    Java代码:

public static String Format2(int age, String name, double salary) {

        //1. 逻辑跳转变量定义和计算
        boolean ageLegal = age > 18;
        boolean nameLegal = false;
        boolean salaryLegal = salary > 0;

        //2. 如果有些逻辑变量计算复杂,可以只在代码块1里面定义,下面来计算
        nameLegal = name != null && name.trim() != "";

        //3. if跳转结构
        if(ageLegal && nameLegal && salaryLegal) {
            //核心逻辑
            String personInfo = String.format("name:%s,age:%d,salary:%lf", name, age, salary);
            return personInfo;
        } else if(!ageLegal) {     //错误处理1 
            System.err.println("Age must be larger than 18.");
        } else if(!nameLegal) {   //错误处理2
            System.err.println("Name cannot be empty! ");
        } else if(!salaryLegal) {  //错误处理3
            System.err.println("Salary must be larger than zero! ");
        }

        return "";
    }

 

   今天先到这里,以后有其他想法了继续。

posted @ 2012-07-20 16:29  李土鳖  阅读(458)  评论(0编辑  收藏  举报