系列博客

1. 改善代码设计 —— 优化函数的构成(Composing Methods)

2. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)

3. 改善代码设计 —— 组织好你的数据(Composing Data)

4. 改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)

5. 改善代码设计 —— 简化函数调用(Making Method Calls Simpler)

6. 改善代码设计 —— 处理概括关系(Dealing with Generalization)

  1. Decompose Conditional (分解条件式)

  解释:

"复杂的条件逻辑" 是导致复杂性上升最常见的地方, "条件表达式中堆积的计算过程", "条件式表达得不简洁"等等都是造成复杂的原因. Decompose Conditional 用于将这些复杂的元素从条件表达式中分离出去, 仅在条件表达式中调用简洁的函数.

这样做带来的直接好处是减少重复, 而且代码的可读性提高了.

  冲动前:

if (date.After(SUMMER_START) && date.Before(SUMMER_END))
charge = days * _price + _summerServiceTip;
else
charge = days * _price;

  冲动后:

if (date.IsSummer())
charge = SummerCharge(days);
else
charge = WinterCharge(days);

  2. Consolidate Conditional Expression (合并条件式)

  解释:

如果代码中有一连串的 if 检查语句, 检查语句中的条件不相同, 但最终的行为都是一样的. 对于这样的情况, 应该使用 "逻辑与" 和 "逻辑或" 将它们合并成一个条件表达式, 如果嫌这个合并条件后的表达式太罗嗦, 你还可以将这个表达式提取成一个函数.

  冲动前:

if (computer.CPU != "T6670")
return false;
if (computer.RAM != "1.00GB")
return false;
if (computer.SytemType != "32-bit Operating System")
return false;
//other compution

  冲动后:

if ((computer.CPU != "T6670") || (computer.RAM != "1.00GB") || (computer.SytemType != "32-bit Operating System"))
return false;
//other compution

你还可以将 if 里长长的条件表达式提取成一个方法, 如 bool IsStandard(Computer computer), 这样在原来的 if 语句中只需要调用这个方法即可

  3. Consolidate Duplicate Conditional Fragments (合并重复的条件片段)

  解释:

如果条件式的每个分支上都有同样一段代码, 如果这段代码对条件分支在执行这段代码后执行后面的代码没有影响,  请将这段代码移到条件式的外面.

  冲动前:

if (date.IsSummer())
{
charge = days * _price + _summerServiceTip;
PrintDetail();
}
else
{
charge = days * _price;
PrintDetail();
}
//other compution

  冲动后:

charge = days * _price;

if (date.IsSummer())
charge += _summerServiceTip;

PrintDetail();
//other compution

  4. Remove Control Flag (移除控制标志)

  解释:

很多代码里执行一个 for 或者 while 循环用于寻找一个数组里特点的元素, 很多时候在循环开头就执行控制标志的检查, 满足检查条件就继续执行循环查找元素. 如果这一次查找到了想要的元素, 就更改控制标志的值, 让它下次被检查出不符合条件, 从而循环结束.

这并不是一个很好的做法, 使用诸如 break, continue, return 语句会让你的代码意图更加直接, 更加明显.

  冲动前:

for (int i = 0; i < suspects.Length; i++)
{
if (!found)
{
if (suspects[i].Name == guessName)
{
sendAlert();
found = true;
}
}
}

  冲动后:

for (int i = 0; i < suspects.Length; i++)
{
if (suspects[i].Name == guessName)
{
sendAlert();
break;
}
}

  5. Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件式)

  解释:

许多程序员觉得函数应该只有一个出口 (return), 结果导致函数中的条件逻辑 (Conditional Logic) 本来完全可以终止下面的代码继续执行 (因为没有必要), 结果却只在函数最后 return, 使人难以看清程序的执行路径.

Replace Nested Conditional with Guard Clauses 用来解决这个问题, 它能带给代码可读性的提高, 还有性能上一点点的优化.

  冲动前:

double charge;

if (IsSummer(date))
{
//...
SummerCharge(charge);
}
else
{
//...
WinterCharge(charge);
}

return charge;

  冲动后:

double charge;

if (IsSummer(date))
{
//...
SummerCharge(charge);
return charge;
}
else
{
//...
WinterCharge(charge);
return charge;
}

  6. Replace Conditional with Polymorphism (以多态取代条件)

  解释:

这条重构手法常常用于消除函数中长长的 switch-case 语句. 虽然写一个个的子类比较繁琐, 但随着项目的进行, 好处会体现出来的.

  冲动前:

public double Salary(Employee employee)
{
switch(employee.Type):
{
case Employee.Engineer
{
//...
}
case Employee.Salesman:
{
//...
}
//...
default:
{
//...
}
}
}

  冲动后:

public abstract double Salary(Employee employee);

class Engineer : Employee
{
public override double Salary(Employee employee)
{
//...
}
}
class Salesman : Employee
{
public override double Salary(Employee employee)
{
//...
}
}

  7. Introduce Null Object (引入 Null 对象)

  解释:

如果代码中出现很多判断某值是不是为 null , 诸如 if (XXX != null) {//...} else {//...} 这样的情况, 可以考虑使用 Introduce Null Object 重构手段. 这个手段其实并不难以理解, 可以简单理解成为某一个物件在为空状态下设定默认的值域和行为, 可以建立一个子类, 继承父类中需要对 "为空" 情况下做出响应的虚函数或者值域. 它是 Null Object 设计模式里的最基础最常见的手段.

  8. Introduce Assertion (引入断言)

  解释:

严格上说, 引入断言并不是为了简化条件表达式, 它主要是为了代替条件表达式上面的注释, 通常这样的注释用来解释下面的条件表达式是基于什么样的假设之上的. 通常经过一系列的测试, 发现所写的断言在任何情况下都是正确的, 在系统发布的时候可以把它们全部删除掉.

在 C# 中引入断言使用 Debug.Assert() 方法, 如果一切假设都是正确的, 则代码会顺利的进行.

  冲动前:

//index should between 0 to 10
return (customers[index] == "James") ? true : false;

  冲动后:

Debug.Assert((index>=0)&&(index <= 10), "Error", "index should between 0 to 10");
return (customers[index] == "James") ? true : false;

  如果断言错误, 在运行的时候会有一个消息框给予错误信息的提示.

转载于:https://www.cnblogs.com/waw/archive/2011/10/13/2210618.html

改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)相关推荐

  1. 改善代码设计 —— 总结篇(Summary)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  2. 改善代码设计 —— 组织好你的数“.NET研究”据(Composing Data)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  3. 重构-改善既有代码的设计:简化条件表达式(七)

    简化条件表达式 1.Decompose Conditional 分解条件表达式 你有一个复杂的条件语句.从if.then.else三个段落中分别提炼出独立函数. 程序之中,复杂的条件逻辑是最常导致复杂 ...

  4. 改善代码设计 —— 优化函数的构成(Composing Methods)

    1. Extract Method (提炼函数) 解释: 如果发现一个函数的代码很长, 很可能的一种情况是这个函数做了很多事情, 找找看函数中有没有注释, 往往注释都是为了解释下面一块代码做的什么事情 ...

  5. 改善代码设计 —— 处理概括关系(Dealing with Generalization)

    1. Pull Up Field (提升值域) 解释: 如果发现每个子类都拥有相同的某个值域, 那么使用 Pull Up Field 将这个值域提升到父类中去. 冲动前: 冲动后: 2. Pull U ...

  6. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)

    1. Move Method (函数搬家) 解释: 如果 ClassA 的某个函数对 ClassB 有过多的依赖, 可以考虑将这个函数搬到 ClassB 中, 在 ClassA 的这个函数中直接调用 ...

  7. 重构改善既有代码设计

    目录 一.什么是重构 二.重构的目的和时机 2.1 目的 2.1.1 改进软件的设计 2.2.2 使软件更容易理解 2.2.3 帮助找到 BUG 2.2.4 提高编程速度 2.2 重构的时机 2.3 ...

  8. 重构与模式:改善代码三部曲中的第三部

    一.改善代码的三部曲 <设计模式>-> <重构>-> <重构与模式>.也就是设计->重构->重构出新设计. <设计模式>主要详细 ...

  9. 代码重构(四):条件表达式重构规则

    继续更新有关重构的博客,前三篇是关于类.函数和数据的重构的博客,内容还算比较 充实吧.今天继续更新,本篇博客的主题是关于条件表达式的重构规则.有时候在实现比较复杂的业务逻辑时,各种条件各种嵌套.如果处 ...

最新文章

  1. OpenYurt 深度解读|开启边缘设备的云原生管理能力
  2. 优秀的服务器托管服务商的必备要素
  3. Adreno GPU Profiler
  4. pyecharts第十节、地图(二、中国地图)
  5. go 结构体排序的几种方法
  6. 7000更换控制器电源步骤_开关电源控制环路(初级篇:上)
  7. php转化为2位小数的数字,学习猿地-php 转化为两位小数的方法
  8. ubuntu 英伟达显卡驱动异常
  9. (转载)网络互联参考模型(详解)
  10. 303.区域和检索-数组不可变
  11. springboot毕设项目北理珠青协志愿素拓系统eaa9n(java+VUE+Mybatis+Maven+Mysql)
  12. 汽车之家网站为例-爬虫的编写,爬取图片
  13. matlab空间杜宾模型命令,空间计量模型,包括空间滞后模型、空间误差模型、空间杜宾模型的matlab代码...
  14. 吴恩达机器学习python实现8 异常检测及推荐系统
  15. 海思芯片固件修改工具_魔百盒九联代工M301H海思Hi3798MV310芯片红外蓝牙语音遥控免拆卡刷固件及刷机教程202009版...
  16. OOM Killer机制
  17. java解析加密excel,java poi 打开加密 excel?该怎么处理
  18. HP 打印机遇到各错误类型故障大全解释
  19. Xilinx RFSOC GEN1 ADC和DAC简单测试
  20. 小白服务器编程指北(2)——用Docker编配你的服务器环境

热门文章

  1. 文件上传的实现(C#)
  2. 《Apache Kafka》学习笔记
  3. 【C++】google glog详解
  4. 【Qt】QtCreator中的单例编程(以ActionManager为例)
  5. Travis CI : 最小的分布式系统(三)
  6. mp4 android自动播放,Android 使用VideoView播放MP4的简单实现
  7. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
  8. 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能
  9. java不能对什么类型进行转换_关于java:“不兼容类型:void无法转换为…”是什么意思?...
  10. 【js】实现分页查询操作的步骤