编程中的卫语句

什么是卫语句在《阿里巴巴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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • treetable怎么带参数_好用的TreeTable插件

    treetable怎么带参数_好用的TreeTable插件插件描述:实现layui的树形表格treeTable,对layui数据表格进行扩展。注:加载了外部json数据文件,本地预览会有跨域问题,需要在服务端运行。treetable-lay实现layui的树形表格treeTable1.简介在layui数据表格之上进行扩展实现。2.使用方法2.1.引入模块下载module/treetable-lay整个文件夹,放在你的项目里面,然后使用模块加载的方式使用:…

    2022年5月29日
    45
  • 会员 数据库表设计[通俗易懂]

    会员 数据库表设计[通俗易懂]http://www.cnblogs.com/wuhuacong/p/3957428.html

    2022年6月20日
    52
  • 大数据管理与分析技术(1)[通俗易懂]

    大数据管理与分析技术(1)[通俗易懂]一、大数据的基本概念摘要:大数据基本概念考点:大数据的4V特征、类型(结构化与非结构化大数据)、核心技术(分布式存储和分布式处理)、大数据计算模式(批处理计算、流计算、图计算、查询分析计算)、每类计算模式典型的代表产品。大数据的4V特征规模性(volume)、多样性(variety)、价值密度(value)和高速性(velocity)大数据的类型结构化大数据:能够用数据或统一的结构加以表示的,如数字、符号。传统的关系数据模型,行数据,存储于数据库,可用二维表结构表示。非结构化大数据:是指其字段

    2022年5月1日
    65
  • Idea激活码最新教程2021.1.2版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2021.1.2版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2021 1 2 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2021 1 2 成功激活

    2025年5月22日
    3
  • 激活码2021。3【在线注册码/序列号/破解码】

    激活码2021。3【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    89
  • mysql左连接查询慢[通俗易懂]

    mysql左连接查询慢[通俗易懂]之前一直用的Oracle,今天用mysql查询一个很普通的左连接的时候,发现速度很慢。selectx.fid,x.isbirt,x.fscoresum,x.fsystemscore,x.feffectivescorefromtableaxleftjointablebhonx.fitemid=h.fidwhereh.fprojectid=’’这个sql耗时:2s多。我有点吓到了,后来我百度后发现然后我换了表的位置selectx.fid,x.isbirt,x.fsc

    2022年5月22日
    56

发表回复

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

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