大家好,又见面了,我是你们的朋友全栈君。
什么是卫语句
在《阿里巴巴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);
}
只有在上面三个条件都不成立的情况下,才会走到最后一步输出的语句。也就是排除那些不符合条件的情况,剩下的自然就是符合条件的了。希望通过这个小例子能让你明白到底什么是卫语句。
总结
函数中的条件逻辑使人难以看清正常的分支执行路径。使用卫语句表现所有特殊情况。
所谓卫语句,如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”。
一个直观的感受是,使用卫语句后能够让代码的逻辑更清晰且代码没那么臃肿。
但是这里仿佛又与另一个编程原则“单一出口原则”产生了冲突,实际在使用中这些所谓的原则应该灵活使用。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126473.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...