最近在做代码规范,也看了几本书,发现代码要想写的简单、漂亮并且可读性强其实不是一件容易的事情。于是开始研究如何将常用的一些代码结构书写的更优雅一些,今天先分享第一个。
我们在写一块逻辑或者编写一个函数(方法)的时候,为了代码的健壮性,通常需要添加一些容错处理。容错处理是很重要的一个环节,如果考虑的不够周详,很容易产生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 ""; }
今天先到这里,以后有其他想法了继续。