简化条件表达式之移除控制标记(Remove Control Flag)

在一系列布尔表达式中,某个变量带有“控制标记’的作用。以break或return语句取代控制标记。

动机:在一系列条件表达式中,常常会看到用以判断何时停止条件检查的控制标记。这样的标记带来的麻烦超过了它所带来的便利。人们之所以会使用这样的控制标记,因为结构化编程原则告诉他们:每个子程序只能有一个入口和出口。“单一出口“原则会让你在代码中加入让人讨厌的控制标记,大大降低条件表达式的可读性。这就是编程语言提供break和continue语句的原因:用它们跳出复杂的条件语句。去掉控制标记所产生的效果往往让你大吃一惊:条件语句真正的用途会清晰得多。

做法:1、对控制标记的处理,最显而易见的办法就是使用break或continue语句。

2、找出让你跳出这段逻辑的控制标记值。

3、找出对标记变量赋值的语句,代以恰当的break或continue语句。

4、每次替换后,编译并测试

范例:以break 取代简单的控制标记

void checkSecurity(String[] people) {

      boolean found = false;

      for (int i = 0; i < people.length; i++) {

          if (! found) {

             if (people[i].equals ("Don")){

               sendAlert();

               found = true;

             }

             if (people[i].equals ("John")){

               sendAlert();

               found = true;

             }

          }

      }

  }

这种情况下很容易找出控制标记:当变量found 被赋予true 时,搜索就结束。我可以逐一引入break 语句:

void checkSecurity(String[] people) {

      boolean found = false;

      for (int i = 0; i < people.length; i++) {

          if (! found) {

             if (people[i].equals ("Don")){

               sendAlert();

            break;

             }

             if (people[i].equals ("John")){

               sendAlert();

               found = true;

             }

          }

      }

  }

处理后的代码

void checkSecurity(String[] people) {

      boolean found = false;

      for (int i = 0; i < people.length; i++) {

          if (! found) {

             if (people[i].equals ("Don")){

               sendAlert();

               break;

             }

             if (people[i].equals ("John")){

               sendAlert();

               break;

             }

          }

      }

最后可以把对控制标记的所有引用去掉:

 void checkSecurity(String[] people) {

      for (int i = 0; i < people.length; i++) {

          if (people[i].equals ("Don")){

             sendAlert();

             break;

          }

          if (people[i].equals ("John")){

             sendAlert();

             break;

          }

      }

  }

范例:以return 返回控制标记

本项重构的另一种形式将使用return 语句。为了阐述这种用法,我把前面的例子稍加修改,以控制标记记录搜索结果:

 void checkSecurity(String[] people) {

      String found = "";

      for (int i = 0; i < people.length; i++) {

          if (found.equals("")) {

             if (people[i].equals ("Don")){

               sendAlert();

               found = "Don";

             }

             if (people[i].equals ("John")){

               sendAlert();

               found = "John";

             }

          }

      }

      someLaterCode(found);

  }

在这里,变量found 做了两件事:它既是控制标记,也是运算结果。遇到这种情况,我喜欢先把计算found 变量的代码提炼到一个独立函数中:

 void checkSecurity(String[] people) {

      String found = foundMiscreant(people);

      someLaterCode(found);

  }

  String foundMiscreant(String[] people){

      String found = "";

      for (int i = 0; i < people.length; i++) {

          if (found.equals("")) {

             if (people[i].equals ("Don")){

               sendAlert();

               found = "Don";

             }

             if (people[i].equals ("John")){

               sendAlert();

               found = "John";

             }

          }

      }

      return found;

  }

然后以return 语句取代控制标记:

String foundMiscreant(String[] people){

      String found = "";

      for (int i = 0; i < people.length; i++) {

          if (found.equals("")) {

             if (people[i].equals ("Don")){

               sendAlert();

              return "Don";

             }

             if (people[i].equals ("John")){

               sendAlert();

               found = "John";

             }

          }

      }

      return found;

  }

最后完全去掉控制标记:

 String foundMiscreant(String[] people){

      for (int i = 0; i < people.length; i++) {

          if (people[i].equals ("Don")){

             sendAlert();

             return "Don";

          }

          if (people[i].equals ("John")){

             sendAlert();

             return "John";

          }

      }

      return "";

  }

即使不需要返回某值,你也可以使用语句来取代控制标记。这时候你只需 要一个空的return 语句就行了。

当然,如果以此办法去处理带有副作用(连带影响)的函数,会有一些问题。所以我需要先以 Separate Query from Modifier 将函数副作用分离出去。稍后你会看到这方面的例子。

原文地址:https://www.cnblogs.com/newbee0101/p/11981976.html

时间: 2024-11-08 13:02:14

简化条件表达式之移除控制标记(Remove Control Flag)的相关文章

4.4 移除控制标记

[1]原代码 1 // 重构前 2 QString foundPerson(QStringList people) 3 { 4 QString found = QString(); 5 for (int i = 0; i < people.size(); ++i) 6 { 7 if (people[i].compare("Don") == 0) 8 { 9 found = "Don"; 10 } 11 12 if (people[i].compare(&quo

重构摘要9_简化条件表达式

<重构-改善既有代码的设计>Martin Fowler 摘要: 第九章 简化条件表达式 Decompose Conditinal 分解条件表达式 你有一个复杂的条件(if-then-else)语句 从三个段落中分别提炼出独立函数 Consolidate Conditional Expression 合并条件表达式 你有一系列条件测试,都得到相同结果 将这些测试合并成为一个条件表达式,并将这个条件表达式提炼成为一个独立函数 检查用意更清晰,有时也不用这么做 Consolidate Duplica

【重构.改善既有代码的设计】9、简化条件表达式

简化条件表达式 Decompose Conditional(分解条件式) 你有一个复杂的条件(if-then-else)语句. 从if.then.else 三个段落中分别提炼出独立函数. 分解为多个独立函数,根据每个小块代码的用 途,为分解而得的新函数命名,并将原函数中对应的代码替换成「对新建函数的调用」,从而更清楚地表达自己的意图. 对于条件逻辑,[将每个分支条件分解,形成新函数」还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因. Consolida

Simplifying Conditional Expressions(简化条件表达式)

1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expressions(合并条件表达式) 3.Consolidate Duplicate Conditional Fragments(合并重复的条件片段) 4.Remove Control Flag(移除控制标记) 5.Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式) 6.Replace Conditiona

简化条件表达式

1.分解条件表达式:a.将判断条件独立函数:b.将分支段落独立函数: 2.合并条件表达式:a.使用逻辑或/与:b.三元表达式 3.合并重复的代码片段 4.移除控制标记:a.找出对标记变量赋值的语句,代之break或continue:b.extract method,以return返回控制标记 5.以卫语句取代嵌套条件表达式: 精髓:给某一条分支以特别的重视 比较:if-then-else则是同等重要 方式:将条件反转,最后考虑去除零时变量 6.以多态取代条件表达式: a.extract meth

重构改善既有代码的设计--简化条件表达式

一 简化条件表达式 这个是几乎所有的工程都会存在的问题,不当的条件表达式造成代码的冗余. 下面我们列出普遍的问题,并给出一般的应对方法. [1]条件判断过长,表达不清晰. if((i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0])) { .... } 解决办法:将很长的判断式子封装成函数或者定义成宏.并以一个清晰表达意图的名字命名,这种做法在现代oop语言中很常见,比如 java c#

学习重构(5)-简化条件表达式

1.Decompose Conditional (分解条件表达式)应用场景:你有一个复杂的条件(if-then-else)语句.从if.then.else三个段落中分别提炼出独立函数.示例:if (date.before(SUMMER_START) || date.after(SUMMER_END)) { charge = quantity * mWinterRate + mWinterServiceCharge;} else { charge = quantity * mSummerRate;

简化条件表达式之以卫语句取代嵌套条件表达式(Replace Nested Conditional With Guard Clauses)

函数中的条件逻辑使人难以看清正常的执行途径.使用卫语句表现所有特殊情况. 动机:条件表达式通常有2种表现形式.第一:所有分支都属于正常行为.第二:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况. 这2类条件表达式有不同的用途.如果2条分支都是正常行为,就应该使用形如if…..else…..的条件表达式:如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回.这样的单独检查常常被称为“卫语句”. Replace Nested Conditional with

重构手法之简化条件表达式【1】

返回总目录 本小节目录 Decompose Conditional(分解条件表达式) Consolidate Conditional Expression(合并条件表达式) 1Decompose Conditional(分解条件表达式) 概要 你有一个复杂的条件(if-else if-else)语句. 从if.else if.else三个段落中分别提炼出独立函数. 动机 复杂的条件逻辑往往会导致程序复杂度上升.编写代码来检查不同的条件分支.根据不同的分支做不同的事往往又会导致函数过长. 将条件表