编程中的卫语句

什么是卫语句在《阿里巴巴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);
}

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

总结

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

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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java中StringBuilder类「建议收藏」

    Java中StringBuilder类「建议收藏」提要大家要知道字符串(String)在进行拼接操作时,每一次拼接,都会构建一个新的String对象这样耗时又浪费内存解决方法就是StringBuilder类,就可以解决这个问题StringBuilder类中方法和String类基本一样我举例几个使用最多的方法创建//创建StringBuilderStringBuildersb=newStringBuilder(“老八”);System.out.println(sb);//输出如果括号里不填默认是空字符串

  • android桌面快捷方式跳转到指定activity

    android桌面快捷方式跳转到指定activity

  • FastCGI 介绍

    FastCGI 介绍本文主要介绍FastCGI的相关知识。首先简要看一下CGI(百科)CGI(通用网关接口)CGI是Web服务器运行时外部程序的规范, 按CGI编写的程序可以扩展服务器功能。CGI应用程序能与浏览器进行交互,还可通过数据库API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。…

  • micropython 中socket中的非阻塞 报错 Error->: [Errno 119] EINPROGRESS

    micropython 中socket中的非阻塞 报错 Error->: [Errno 119] EINPROGRESS之前的连接方式的如下:sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)addr=socket.getaddrinfo(host,port)[0][-1]sock.setblocking(False)#非阻塞sock.connect(addr)

  • mac电脑 datagrip 激活码_通用破解码

    mac电脑 datagrip 激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • clion激活码(JetBrains全家桶)「建议收藏」

    (clion激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlMLZPB5EL5Q-eyJsaWN…

发表回复

您的电子邮箱地址不会被公开。

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