编程中的卫语句

什么是卫语句

在《阿里巴巴Java开发手册》中提到,多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。

那么,什么是卫语句呢?

在中文维基百科中是这样介绍的

在计算机程序设计中,卫(guard)是布尔表达式,其结果必须为真,程序才能执行下去。卫语句(guard code或guard clause)用于检查先决条件。卫语句的用途,例如:
引用(reference)使用前检查是否为空引用;
处置模式使用一个布尔域,使得释放资源操作成为幂等运算,即多次释放资源等效于只释放一次。
卫语句可用于子进程的提前退出(early exit),这是结构化程序设计的一种常见偏离,可删除一层嵌套使得代码更扁平:把if guard { … }替代为:if not guard: return; …

而在英文维基百科中有这样一段话

Regardless of which programming language is used, 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();
           }
       }
   }
   return result;
}

以上代码已经尽力做到简洁和清晰了,但是如果我们使用卫语句,将带来另一种效果:

double getPayAmount()
{
    if (isDead())
    {
        return deadPayAmount();
    }
    if (isSeparated())
    {
        return separatedPayAmount();
    }
    if (isRetired())
    {
        return retiredPayAmount();
    }

    return normalPayAmount();
}

是不是逻辑更清晰明了了?

再看一个例子
if-else 语句一般在 for 循环里面使用,用于分支控制,如求 100 以内同时是 3、4、5 的倍数的题,如果我们根据题目所说的老老实实地判断符合倍数的情况,将会写成这样(假设每个 if 语句只判断一个条件):

for (int i = 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 (int i = 1; i <= 100; i++) {
	if (i%3 != 0){
	    continue;
	}
	if (i%4 != 0){
	    continue;
	}
	if (i%5 != 0){
	    continue;
	}
	System.out.println(i);
}

只有在上面三个条件都不成立的情况下,才会走到最后一步输出的语句。也就是排除那些不符合条件的情况,剩下的自然就是符合条件的了。希望通过这个小例子能让你明白到底什么是卫语句。

总结

函数中的条件逻辑使人难以看清正常的分支执行路径。使用卫语句表现所有特殊情况。

所谓卫语句,如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”。

一个直观的感受是,使用卫语句后能够让代码的逻辑更清晰且代码没那么臃肿。

但是这里仿佛又与另一个编程原则“单一出口原则”产生了冲突,实际在使用中这些所谓的原则应该灵活使用。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值