卫语句的基本应用

条件表达式通常有两种表现形式。

  • 第一:所有分支都属于正常行为。
  • 第二:条件表达式提供的答案中只有一种是正常行为(关键代码),其他都是不常见的情况。

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

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

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

把复杂的条件表达式拆分成多个条件表达式

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

有时候条件式可能出现在嵌套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(); // 核心语句
}
发布了70 篇原创文章 · 获赞 1 · 访问量 2252

猜你喜欢

转载自blog.csdn.net/caozp913/article/details/103812595