一、尽量使用卫语句

卫语句概念

条件表达式通常有两种表现形式,第一种形式是:所有分支都属于正常行为;第二种形式则是:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况。这两类条件表达式有不同的用途,这一点应该通过代码表现出来。

如果两条分支都是正常行为,就应该使用形如if...else...的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”(guard clauses)

1.条件检查替换

这是一个计算员工薪资的方法,其中以特殊规则处理驻外员工和退休员工的薪资。这些情况不常有,但的确会偶尔出现。

public double getSalary() {
double result;
if (this.isSeparated) {//驻外员工
result = this.separatedSalary();
} else {
if (this.isRetired) {//退休员工
result = this.retiredSalary();
} else {//正常员工
result = this.normalSalary();
}
}
return result;
}

这段代码中,非正常情况的检查掩盖了正常情况的检查,所以应该用卫语句来取代这些条件检查,以提高程序清晰度。对于每个检查,放进一个卫语句。卫语句要不就从函数中返回,要不就抛出一个异常。

public double getSalary() {
if (this.isSeparated) {//卫语句
return this.separatedSalary();
}
if (this.isRetired) {//卫语句
return this.retiredSalary();
}
return this.normalSalary();
}

2.反转条件替换

这是一个已知长宽高求长方体体积的方法,但有个特殊的需求:高大于0时,打印万猫学社。(惊不惊喜?意不意外?突不突兀?变不变态?是的,有时候我们接到的需求就是这样的。)代码是这样的:

public double getVolume(double length, double width, double height) {
double result = 0.0;
if (height > 0.0) {
System.out.println("万猫学社");
if (length > 0.0 && width > 0.0) {
result = length * width * height;
}
}
return result;
}

还是用卫语句替换条件检查,但是我们需要将相应的条件反转过来,也就是做逻辑非运算。

public double getVolume(double length, double width, double height) {
if (height <= 0.0) {//卫语句,!(height > 0)
return 0.0;
}
System.out.println("万猫学社");
if (length <= 0.0 || width <= 0.0) {//卫语句,!(length > 0 && width > 0)
return 0.0;
}
return length * width * height;
}

为什么要使用卫语句?

卫语句的精髓是:给某一条分支以特别的重视。如果使用if...else...结构,你对if分支和else分支的重视是同等的。这样的代码结构传递给阅读者的消息就是:各个分支有同样的重要性。

卫语句就不同了,它告诉阅读者:“这种情况很罕见,如果它真的发生了,请做一些必要的整理工作,然后退出。”如果对方法剩余部分不再有兴趣,当然应该立刻退出。引导代码的阅读者去看一个没有用的else区段,只会妨碍他们的理解。用了卫语句以后,代码更容易被理解,被维护。

部分转载于:https://www.cnblogs.com/heihaozi/p/11818042.html

最新文章

  1. iOS程序上传流程 2014年9月最新版
  2. hadoop输入分片计算(Map Task个数的确定)
  3. SQL Server数据类型转换
  4. Cube Processing Options
  5. 攻城狮在路上(叁)Linux(二十四)--- linux设置开机挂载及镜像文件挂载
  6. td 的colspan属性
  7. oracle:case when 语句的区间用法
  8. Windows 2012 装 Remote Desktop Organizer 无法连接到其他远程服务器
  9. Hadoop InputFormat浅析
  10. hdu 1217 利用flord算法求 有环图 2点之间最大值
  11. spring管理事务需要注意的
  12. CentOS7快速配置nginx node mysql8.0
  13. 全屏slider--swiper
  14. BigData_Jia
  15. 原来你离BAT只有一步之遥
  16. POJ 2112-Optimal Milking-二分答案+二分图匹配
  17. Android “Command” from work summary
  18. python---冒泡和短冒泡排序
  19. CentOS 7.4安装nodejs &amp; nginx &amp; pm2
  20. cygwin下切换到其他磁盘

热门文章

  1. Window Server 2019 配置篇(6)- 利用组策略实现域内自动安装软件
  2. 洛谷 P2049 魔术棋子(vector)
  3. Elasticsearch常用的设置
  4. PHP开发-模板的使用
  5. 168-PHP 输出系统当前时间
  6. 第二阶段scrum-5
  7. Java交换数据为何不起作用原因分析
  8. CentOS下的安装命令 安装Nginx 更新yum源 kali系统当中的软件管理命令(第五天)
  9. POJ 1426:Find The Multiple
  10. Arduino -- functions