1

问题:
当我们在写业务逻辑时候,不知不觉已经把代码嵌套了好几次:

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导致客户端解析困难,我们可以将所有错误结果包装为一个异常状态即可。


郭江江
9 声望1 粉丝

搬过砖的程序员