编程中的卫语句

什么是卫语句在《阿里巴巴Java开发手册》中提到,多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。那么,什么是卫语句呢?在中文维基百科中是这样介绍的在计算机程序设计中,卫(guard)是布尔表达式,其结果必须为真,程序才能执行下去。卫语句(guardcode或guardclause)用于检查先决条件。卫语句的用途,例如:引用(reference)使用前检查是否为空引用;处置模式使用一个布尔域,使得释放资源操作成为幂等运算,即多次释放资源等效于只释放一次。卫语句可用于子进程的提前

大家好,又见面了,我是你们的朋友全栈君。

什么是卫语句

在《阿里巴巴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);
}

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

总结

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126473.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 使用腾讯云直播开发直播功能违法吗_腾讯云直播插件

    使用腾讯云直播开发直播功能违法吗_腾讯云直播插件前言:最近公司开发app直播功能,我是后端,使用java开发,经过考虑选择使用腾讯的云直播功能,主要是考虑到腾讯在这方面可以说是很有实力的了。然后就是选择产品的问题,腾讯提供了几种直播的解决方案,最完整的是互动直播,这是一套比较完善的直播解决方案,但是费用比较贵,所以。。。我们选择了云直播和云通信(IM)组合,主要是因为本来app中就集成云通信,也就是云直播用来做视频交互,云通信用来做弹幕和直…

    2022年9月15日
  • SNAP7 C++ 通讯

    SNAP7 C++ 通讯 静态调用的dll的一个实例2017年11月17日09:49:18 净无邪 阅读数:334版权声明:本文为博主原创文章,欢迎各位朋友转载。转载时,保留链接地址!https://blog.csdn.net/naibozhuan3744/article/details/78557761本实例主要分为三部分。第一部分:vs2013的配置,第二部分:snap7的dll常用函数何功能的介…

    2022年11月3日
  • 单核苷酸多态性(SNP)_单核苷酸多态性分析

    单核苷酸多态性(SNP)_单核苷酸多态性分析定义主要指基因组水平上由单个核苷酸的变异所引起的DNA序列多态性。在基因组水平上由单个核苷酸的变异所引起的DNA"序列多态性"。即:在不同个体的同一条染色体或同一位点的

    2022年8月4日
  • mysql语句大全及例子_SQL语句大全实例教程.pdf[通俗易懂]

    mysql语句大全及例子_SQL语句大全实例教程.pdf[通俗易懂]SQL语句大全实例教程无论您是一位SQL的新手,或是一位只是需要对SQL复习一下的资料仓储业界老将,您就来对地方了。这个SQL教材网站列出常用的SQL指令,包含以下几个部分:♦SQL指令:SQL如何被用来储存、读取、以及处理数据库之中的资料。♦表格处理:SQL如何被用来处理数据库中的表格。♦进阶SQL:介绍SQL进阶概念,以…

    2022年5月20日
  • TiKV 性能参数调优[通俗易懂]

    TiKV 性能参数调优[通俗易懂]2019独角兽企业重金招聘Python工程师标准>>>…

    2022年9月23日
  • 虚拟机的桥接模式和NAT模式[通俗易懂]

    虚拟机的桥接模式和NAT模式[通俗易懂]1.桥接模式桥接模式:直接连接物理网络,也就是连的你交换机的网络和你主机的IP在一个网段上将虚拟机出来的计算机,直接连入当前的网络环境中,并且独占IP.特点:在当前网络中的全部计算机,都可以访问虚拟机.弊端:1.Ip地址可能会发生变化192.150.1.100/192.168.1.1012.如果这时传递文件时需要依靠交换机/路由器2.NAT模式说明:相当于在windows系…

    2022年6月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号