今年在参加阿里巴巴集团孤尽老师组织的公益培训DIY班,顺带介绍一下DIY班。
DIY班是一种探索引导式的公益培训,涵义有二:
一,Deeply Inspire Yourself 深度激发自己
二,Do It Yourself 实践出真知。
DIY班第五期的作业中有一个题目是,如何解决If-Else多层嵌套的问题。恰好在实际项目中遇到了一个业务逻辑使用了八个If,八个Else,五层嵌套。随尝试进行可读性优化,优化后剩余了五个If,零个Else,零层嵌套。接下来将自己优化的案例分享出来,期望读者在实际开发中,本着代码可读性的原则,尽量优化If-Else的使用。
为了方便大家理解,会将代码贴出来,但是本着保护知识产权的原则,我将代码进行了伪代码处理,并去除了注释,可读性上可能会有所降低,本段代码的开发语言是Pb,语法上面跟Java有点出入,但是基本上类似,相信不妨碍使用任何开发语言的读者理解。原来的五层嵌套代码如下图所示:

相信很多人看到这段代码都会头疼的,嵌套太深,可读性太差了。我决定将这段代码重写,整体上来看,此方法根据不同的条件分别返回不同的值,但是不难看出,返回值只有1和2,我首先想到的是只判断需要返回1的条件,不满足的其他条件自然而然就会返回2。这样就能从数量上来降低条件判断。首先看最外层的参数1的判断,我根据真实业务逻辑得出参数1的判断是多余的,而且通过搜索项目中对此方法调用的代码得出了我的判断是正确的,这样的话,改造后的代码第一行就是判断参数1不等于数值1的时候,直接返回变量1,这样就消除了第一层嵌套。然后,我们再看条件“参数5 = 2 Or ( 参数6 = 3 OR 参数6 = 4 )”,此条件在第一个If内部第二层嵌套的If-Else中同时进行了判断,随即将此条件摘出来单独判断,如果满足此条件,直接返回变量1,然后我们再数一下,需要返回变量1的就只剩三个条件了,将三个条件按照先后顺序进行精简后摘录出来分别是:
“Date(参数2) = Date(参数3) AND NOT IsNull(参数4)”,
“参数5 = 1 AND IsNull(参数4) AND Date(参数2) = Date(参数3)”,
“参数5 = 1 AND Date(参数4) = Date(参数3) AND Time(参数4) > Time(00:00:00)”。
分别用三个If来判断满足这些条件的时候返回变量1,最后我们要做的就是返回变量2了。
最后优化后的代码如下图所示:

只剩了五个If,没有任何Else,没有出现嵌套。可读性上明显有所提升,当然了,真正的产品代码中,对于每个If条件都进行了注释,每个参数的定义也有具体含义,在真正的产品代码中,业务逻辑会一目了然。大大提高了代码的可读性。有一点需要注意,只使用If进行判断,避开If嵌套,If条件出现的循序,后期不能随意调整,因为系统运行到后面的条件,默认前提是前面出现的条件都不满足。




