正如卫文是什么?《阿里巴巴Java开发手册》所述,多层条件语句建议用卫文、战略模式、状态模式等进行重构。
那么,卫语句是什么呢?
中文维基百科是这样介绍的
在计算机编程中,保护(guard )是布尔表达式,如果结果为真,则不运行程序。 保护语句(guard code或guard clause )用于检查先决条件。 防护语句的用途。 示例:
引用在使用前检查是否为空引用;
处置模式使用布尔值域,以使释放资源的操作为幂运算。 也就是说,多次释放资源等同于只释放一次。
保护语句可用于提前终止子进程(early exit )。 这是结构化编程的常见脱离,可以删除嵌套以使代码平坦。 ifguard )…)为if not guard: return;
英语维基百科上有这样一句话
是regardlessofwhichprogramminglanguageisused,guard clause,guard code,or guard statement,is a check of integrity preconditions used to avoid errors during execution.
重点关注avoid errors during execution。 它表示什么是guard,可以理解为代码中的防卫者,起到检查边界、保护代码的作用。 虽然介绍有点绕圈子,但可以看到保护语句不是Java特有的。 这和编程思想很相似。 让我们来看两个例子。
示例double GetPayAmount () { double result; if(isdead () ) { result=DeadAmount ); }else{if(isseparated () ) { result=SeparatedAmount ); }else{if(isretired () ) { result=RetiredPayAmount ); } else { result=NormalPayAmount (; } }返回结果; }虽然上面的代码已经尽最大努力做到简洁明了,但是使用保护语句可以获得不同的效果。
double getPayAmount () if (isdead ) ) {返回延迟}; }if(isseparated () ) { return separatedPayAmount ); }if(isretired () ) { return retiredPayAmount ); } return normalPayAmount (; }逻辑不是更明确了吗?
再来看看另一个例子
if-else语句一般在for循环中使用,用于分支控制。 例如,如果你要的问题在100以内是3、4、5的倍数,我们就像主题所说的那样,诚实地判断出与倍数相符的情况,就会变成这样。 (
for(intI=1; i=100; I ) if(I%3==0) if ) I%4==0) if ) I%5==0) system.out.println ) I; }}}这就是前面提到的“放在一边的金字塔”,反过来说,这是3、4、5的倍数,也就是说,如果不是3、4、5的倍数,那么排除这些情况,结束这次循环,继续寻找下一个数这样可以防止多层嵌套:
for(intI=1; i=100; I(if ) I%3!=0) { continue; (if ) I%4!=0) { continue; (if ) I%5!=0) { continue; }system.out.println(I; }只有在以上三个条件都不成立时,才能进行最后一步输出的语句。 也就是说,排除不符合条件的东西,剩下的自然符合条件。 希望通过这个小例子,让你明白什么是卫文。
如果总结函数中的条件逻辑,则很难看到正常的分支执行路径。 使用卫文表达一切特殊情况。
卫文是指,如果某个条件极为罕见,就应该单独检查该条件,如果该条件为真,就应该立即从函数中返回。 这种单独检查常常被称为“卫语句”。
直观的感受是,使用保护语句可以使代码逻辑更加清晰,代码不会变得太庞大。
但是,实际上应该充分利用这些所谓的原则,就像这里与另一个编程原则“单一出口原则”相矛盾一样。