您的位置:首页 > 编程语言

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

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

我们在写一块逻辑或者编写一个函数(方法)的时候,为了代码的健壮性,通常需要添加一些容错处理。容错处理是很重要的一个环节,如果考虑的不够周详,很容易产生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 "";
}


今天先到这里,以后有其他想法了继续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: