• 让代码更优雅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 "";
        }

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

  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    codevs 1501 二叉树最大宽度和高度x
  • 原文地址:https://www.cnblogs.com/alala666888/p/2601344.html
Copyright © 2020-2023  润新知