问题:
当我们在写业务逻辑时候,不知不觉已经把代码嵌套了好几次:
if (true){
if (true){
if (true){
for (){
if (true){
业务代码
}
}
}
}
}
在有比较复杂的判断和需要遍历处理业务时候,经常会出现上面这种情况,这些代码在执行起来是没问题。但是这样的代码是一次性代码,过一段时间,可能自己都不敢动这里的逻辑了,更何况下一个接盘侠呢。
这样的代码很难弄明白每个条件的作用和执行的流程,当你读到最里面一层的时候,估计你已经记不起来当初是为什么走进这个if的了,对代码的执行流程完全不可控了。因为执行你预期的流程并不明显,为了简化这种情况,需要将特殊情况隔离到立即结束执行的单独条件中。
这样就能把箭头代码给拉平.
if (false){
}
if (false){
}
if (false){
}
for (){
if (false){
continue;
}
业务代码
}
这是其中一类,可以将失败前置。只要有一个条件不通过,就快速返回失败,如果到了最后一行,说明所有判断都通过,剩下的就是你预期的结果。而不是一直查成功。
在重构法则上,这种叫Guard Clause法则,卫语句。
还有一种重构方式,就是将复杂的业务逻辑从if块中抽取为一个业务方法,即使这个方法只被使用一次。这种常常用在循环块中,或者多个if...else块中。
开发中要深刻的理解到函数的作用,是代码的封装或者抽象。将复杂的业务逻辑进行封装抽象,让我们从业务接口解耦,不需要关注具体实现,从而简化我们的代码,使得复杂的业务逻辑读起来也有条不紊。
在我们使用if...else...语句时,判断是否是错误的情况出现嵌套,可以是用guard clause语句,让失败前置。如果if过多,可能出现多个失败code导致客户端解析困难,我们可以将所有错误结果包装为一个异常状态即可。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。