卫语句

今天在群里看大佬们闲聊,提到了卫语句的相关内容,发现挺有意思,整理如下:

1.使用卫语句取代嵌套表达式

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

动机:条件表达式通常有2种表现形式。第一:所有分支都属于正常行为。第二:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况。

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

​ Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件表达式)的精髓是:给某个分支以特别的重视。它告诉阅读者:这种情况很罕见,如果它真的发生了,请做一些必要的整理工作,然后退出。

​ “每个函数只能有一个入口和一个出口”的观念,根深蒂固于某些程序员的脑海里。现今的编程语言都会强制保证每个函数只有一个入口,至于“单一出口”规则,其实不是那么有用。保持代码清晰才是最关键的:如果单一出口能使这个函数更清晰易读,那么就使用单一出口;否则就不必这么做。

做法:1、对于每个检查,放进一个卫语句。卫语句要不就从函数返回,要不就抛出一个异常。

​ 2、每次将条件检查替换成卫语句后,编译并测试。如果所有卫语句都导致相同的结果,请使用 Consolidate Conditional Expression (合并条件表达式)。

2.卫语句就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套了好几层的if - then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句.

3有时候条件式可能出现在嵌套n次才能真正执行,其他分支只是简单报错返回的情况,对于这种情况,应该单独检查报错返回的分支,当条件为真时立即返回,这样的单独检查就是卫语句(guard clauses).卫语句可以把我们的视线从异常处理中解放出来,集中精力到正常处理的代码中。

简单举例:

void func(void)  
{  
    if(IsWorkDay())  
   {  
       printf("Error,is work day");  
   }  
    else  
   {  
       if(IsWorkTime())  
      {  
        printf("Error ,is work time");  
       }  
       else  
      {  
          rest();  
       }  
    }  
}

使用卫语句替换以后:

void func()  
{   
   if(IsWorkDay())  
   {  
      printf("Error,is work day");  
      return;  
   }  
   if(IsWorkTime())  
  {  
      printf("Error,is work time");  
      return ;  
  }  
  rest();  
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Scala守卫语句的集中用法

    相比于JAVA,Scala的if增加了两项强大的功能,一是可以直接作为赋值语句,另一种功能是作为守卫语句,不仅远远超过JAVA,甚至也将PYTHON抛在身后。

    Spark学习技巧
  • 什么是卫语句?更优雅的代码方式

    不知你有没有被多层嵌套的 if-else 语句所折磨过,就像下面这种 “横放着的金字塔”:

    BigYoung小站
  • python语句--条件语句

    >>> print(2,3,4)    //python2.x (2, 3, 4) >>>

    py3study
  • if语句与while语句

    • if语句首先计算判断条件:如果得到True,就执行这组语句,否则,不执行开大。

    陆勤_数据人网
  • C++学习笔记15——跳转语句(break语句,continue语句,goto语句)

    作用:用于跳转选择结构和循环结构 break使用的时机: 1.出现在switch中,作用是终止case并跳出switch 2.出现在循环语句中,作用是跳出当前循...

    用户7886150
  • JavaScript重构技巧-降低函数复杂度

    JavaScript 是一种易于学习的编程语言,编写运行并执行某些操作的程序很容易。然而,要编写一段干净的JavaScript 代码是很困难的。

    前端小智@大迁世界
  • JavaScript语句-流程控制语句

    JavaScript定义了一组语句,语句通常用于执行一定的任务。语句可以很简单,也可以很复杂。 选择结构,可以在程序中创建交叉结构来指定程序流的可能方向。Jav...

    水击三千
  • 判断语句和循环语句

    your_wife = input("你老婆去么------")   #去或者不去

    用户7886150
  • 条件语句与查询语句

    到目前为止我们所使用的语句操作几乎都是对每一行都进行操作,那么能不能但对某一行,或者某几行进行操作呢?这个时候就需要使用到条件语句关键字WHERE,介绍一下关系...

    端碗吹水
  • python 条件语句、循环语句

    if (n>0and n<5) or (n>10andn<15) ()优选级运算符

    py3study
  • 循环语句For each...next语句

    大家好,前面已经介绍过循环结构的for..next和do...loop系列语句。还有一种用于处理对象集合的循环语句,即for each...next语句,在本节...

    无言之月
  • 【Python3】条件语句与循环语句

    py3study
  • HQL 语句

    import java.util.Iterator; import java.util.List; import java.util.Map;

    Hongten
  • switch语句

    多级elseif 显然是用于那些可能需要进行多级判断的情况。如果$a,正好是大于10,只需判断一次,但如果$a小于10那就必须经过“是不是大于10?,是不是等于...

    C4rpeDime
  • sql语句

    参考以下 SQL> select * from test; ID MC ---------- ------------- 1 11111 1 22...

    阿新
  • try语句...

    #include<stdio.h> #include<iostream> using namespace std; int main( ) { try { ...

    Gxjun
  • if语句

    endswith,startswith 分别判断字符串是不是以制定字符结尾或开始,返回布尔值

    py3study
  • Python语句

    >>> range(1, 11, 2) #起始写了表示从起始开始,后面的11不包含,2表示步长值

    py3study
  • if语句

    每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试。条件测试的值为True,就执行紧跟在if语句后面的代码;如果为False,...

    清菡

扫码关注云+社区

领取腾讯云代金券