重构条件-Decompose Conditional分解条件式一

1.分解条件式

1.1.使用场景

你有一个复杂的条件(if-then-else)语句。从if、then、else三个段落中分别提炼出独立函数

程序之中,复杂的条件逻辑是最常导致复杂度上升的地点之一。你必须编写代码来检查不同的条件分支、根据不同的分支做不同的事,然后,你很快就会得到一个相当长的函数。

大型函数自身就会使代码的可读性下降,而条件逻辑则会使代码更难阅读。在带有复杂条件逻辑的函数中,代码(包括检查条件分支的代码和真正实现功能的代码)会告诉你发生的事,但常常让你弄不清楚为什么会发生这样的事,这就说明代码的可读性的确大大降低了。

和任何大块头代码一样,你可以将它分解为多个独立函数,根据每个小块代码的用途,为分解而得的新函数命名,并将原函数中对应的代码改为调用新建函数,从而更清楚地表达自己的意图

对于条件逻辑,将每个分支条件分解成新函数还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。

1.2.如何做

  • 将if段落提炼出来,构成一个独立函数。
  • 将then段落和else段落都提炼出来,各自构成一个独立函数。
  • 如果发现嵌套的条件逻辑,我通常会先观察是否可以使用Replace Nested Conditional with Guard Clauses (250)。如果不行,才开始分解其中的每个条件。

1.3.示例

假设我要计算购买某样商品的总价(总价=数量×单价),而这个商品在冬季和夏季的单价是不同的:

if (date.before(SUMMER_START) || date.after(SUMMER_END)) {charge = quantity * _winterRate + _winterServiceCharge;
} else {charge = quantity * _summerRate;
}

我把每个分支的判断条件都提炼到一个独立函数中,如下所示

// 分解条件表达式
if (notSummer(date)) {charge = winterCharge(quantity);
} else {charge = summerCharge(quantity);
}// 为条件定义函数
private boolean notSummer (Date date){return date.before(SUMMER_START) || date.after(SUMMER_END);
}
private double summerCharge ( int quantity){return quantity * _summerRate;
}
private double winterCharge ( int quantity){return quantity * _winterRate + _winterServiceCharge;
}

通过这段代码可以看出整个重构带来的清晰性。实际工作中,我会逐步进行每一次提炼,并在每次提炼之后编译并测试。

像这样的情况下,许多程序员都不会去提炼分支条件。因为这些分支条件往往非常短,看上去似乎没有提炼的必要。但是,尽管这些条件往往很短,在代码意图和代码自身之间往往存在不小的差距。
哪怕在上面这样一个小小例子中, notSummer(date)这个语句也能够比原本的代码更好地表达自己的用途。对于原来的代码,我必须看着它,想一想,才能说出其作用。当然,在这个简单的例子中,这并不困难。不过,即使如此,提炼出来的函数可读性也更高一些——它看上去就像一段注释那样清楚而明白。

重构条件-Decompose Conditional分解条件式一相关推荐

  1. 读【重构】(3)——感悟重构——Decompose Conditional(分解条件式)

    有些代码会觉得读起来很费劲,自己的或者别人的,但是从未思考过到底是哪里丑陋.看了重构书中的一些方法,才恍然:原来代码可以这样写的! Docompose Conditional就是其中一例. if (u ...

  2. 重构——34分解条件表达式(Decompose Conditional)

    分解条件表达式(Decompose Conditional) 你有一个复杂的条件语句:从if,then,else三个段落中分别提炼出独立函数 一.动机 1.提高代码可读性 2.突出条件逻辑,更清楚的表 ...

  3. CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率

    CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率 当场景中有比较复杂的模型时,条件渲染能够加速对复杂模型的渲染. 条件渲染(Conditio ...

  4. 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  5. Decompose Conditional(分解条件表达式)

    有一个复杂的 if-else 语句 if (date.before(SUMMER_START) || date.after(SUMMER_END)) {charge = quantity * wint ...

  6. Spring Boot 条件注解@Conditional介绍

    一.概述 Spring Boot 是自以为是的,当 Spring Boot 在classpath中找到相关依赖项时,它会为模块提供默认(自动)配置. 举例,Spring Boot 提供了: 如 cla ...

  7. java 按条件注解_Spring 条件注解 @Conditional

    Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解. 下面的示例将以不同的操作系统作为条件,我们将通过实现Condition接口,并重写其matches ...

  8. 深入理解条件过滤Conditional

    在分析AutoConfigurationImportSelector的源码时,会先扫描spring-autoconfiguration-metadata.properties文件,最后在扫描sprin ...

  9. 重构第12天 分解依赖(Break Dependencies)

    理解:"分解依赖" 是指对部分不满足我们要求的类和方法进行依赖分解,通过装饰器来达到我们需要的功能. 详解:今天我们所讲的这个重构方法对于单元测试是非常有用的.如果你要在你的代码中 ...

最新文章

  1. 你了解 Performance Timeline Level 2 吗?
  2. 分库分表 vs NewSQL数据库
  3. 软件开发需要重视对异常的处理
  4. [WPF]获取控件间的相对位置
  5. 京东开通数字人民币“硬件钱包”线上消费功能
  6. vue 指令 v-once
  7. 【面试】iOS 开发面试题(二)
  8. ConcurrentHashMapK, V的实现
  9. tensorflow学习5----GAN模型初探
  10. 转载:Futurice-Android 开发最佳实践
  11. [置顶] 63行代码完美实现html5 贪吃蛇游戏
  12. 解决SVG animation 在IE中不起作用
  13. 关于Chrome浏览器(Chrome Stable、 Chrome Canary 、Chromium)
  14. android 代码混淆原理,Android 代码混淆
  15. ★RFC标准库_目录链接
  16. 计算机word表格ppt,计算机应用基础-04-WORD表格.ppt
  17. ARM9开发板实验笔记(1)
  18. C#使用SHA256哈希算法实现简单用户注册与验证
  19. 小程序拨打电话功能,微信小程序点击手机号,拨打电话~!
  20. Apk脱壳圣战之---脱掉“梆梆加固”的保护壳

热门文章

  1. 【智商都是硬伤】数学能力测试题+分析逻辑推理题
  2. Alpha-go论文分享
  3. 乐视宣布举行智能生态发布会
  4. tomcat服务器的搭建
  5. 可以测试流放之路伤害的软件,《流放之路》增伤机制介绍 伤害怎么计算
  6. 拉伯证券|突然崩了!传闻空袭,2000亿“果链”巨头暴跌
  7. [转] 英文论文写作中respectively的用法
  8. 网络调试 adb tcpip 开启方法
  9. 百度HTTPS一直认证不通过最有效的解决办法!前提是确认自己网站已经全部可以https访问了。
  10. html文件转换为PDF文档