“如果尿布臭了,就换掉它。”

——Beck奶奶,论保持小孩清洁的哲学


代码的坏味道这一章集中论述该何时重构。具体的重构方法在后面的章节。

“没有任何度量规矩比得上见识广博者的直觉。你必须培养自己的判断力,学会判断一个类中有多少实例变量才算太大,一个函数内有多少代码才不算太长。”

​ ——Martin Flower

3.1 改名

深思熟虑给函数,模块,变量和类命名,使其清晰的表明自己的功能和用法。

重构手法之一:改名(改变函数声明,变量改名,字段改名)

3.2 消除重复代码——提炼函数

同一个类的两个函数含有相同的表达式——提炼函数。

重复的代码段位于同一个超类的不同子类中——函数上移。

3.3 拆分过长函数

“活的最长,最好的程序往往都比较短”

“函数越长,就越难理解”

3.4 过长参数列表

  • 如果发现几项参数经常出现,可通过引入参数对象将其合并为一个对象。(封装)
  • 如果发现从现有的数据结构抽出很多数据项作为参数,不如直接传递完整的对象
  • 以查询替代参数:可以像某个参数查询获得另一个参数的值。

3.5 全局变量

全局变量的问题:代码库的任何一个角落都可以修改,且无法探测。(代码病毒)

处理方法:封装变量。用函数封装起来,再搬到类或模块里,控制其访问权限。

3.6 发散式变化与霰弹式修改

发散式变化:遇到变化时固定修改某一部分代码。

霰弹式修改:代码的坏味道其中一种,遇到变化需要修改很多地方。

减小模块的耦合,实现模块的独立。在添加修改功能时实现代码变更的独立。

3.7 依恋情节

模块化:最大化区域的内部交互,最小化的跨区域交互。

依恋情节:一个函数和另一个模块的函数或者数据交流格外频繁,远胜于在自己内部的交流。

3.8 数据泥团

"两个类中相同的字段,许多函数签名中相同的参数...."

在必要时提炼类。引入参数对象,保持对象完整使之参数列表较短。

语义和形式的权衡。

3.9 使用多态替换switch

3.10 循环语句

以管道取代循环。

3.11 冗赘的元素

随着重构类变得越来越小,适时庄严赴义。

3.12 夸夸其谈通用性

如果用不到,就不值得。用不上的装置只会挡路。

3.13 中间人

封装往往伴随着委托。

委托应当适度,过度委托就会变成冗余。

3.14 过大的类

造成重复代码。

提炼类,提炼超类。

3.15 注释

“当你感觉需要写注释时,请先尝试重构。”

注释的应用场景:

  • 这段代码做了什么
  • 记录将来的打算
  • 为什么做

Chapter 3 :代码的坏味道的更多相关文章

  1. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  2. Bad Smell (代码的坏味道)

    sourcemaking 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹.正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 "代码异味" ...

  3. 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  4. Refactoring之——代码的坏味道(一)过长方法

    1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...

  5. 消灭 Java 代码的“坏味道”

    消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...

  6. 代码的坏味道(22)——不完美的库类(Incomplete Library Class)

    坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

  7. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  8. 代码的坏味道(20)——过度耦合的消息链(Message Chains)

    坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...

  9. 代码的坏味道(21)——中间人(Middle Man)

    坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...

随机推荐

  1. 力扣(LeetCode)删除排序链表中的重复元素 个人题解

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 这题思路比较简单,同样是快慢针的思路. 用一个整数类型val对应最新的只出现过一次的那个值, 如果节点的下一个节点的值和这个对应则不做别 ...

  2. 开始逆向objc基础准备(二)我的平台是simulator-x86_64

    建项目运行中断调试,lldb中显示寄存器看到有rax-r15, stm0-stm7, xmm0-xmm15, ymm0-ymm15,即为x64体系支持sse4. 再在lldb中查看寄存器别名得到以下对 ...

  3. MATLAB相机标定转XMl代码

    function writeXML(cameraParams,file) %writeXML(cameraParams,file) %功能:将相机校正的参数保存为xml文件 %输入: %cameraP ...

  4. [ch02-01] 线性反向传播

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 2.1 线性反向传播 2.1.1 正向计算的实例 假设我 ...

  5. 【集训Day3 单调队列】【2018寒假集训Day 5更新】最大子序列和

    最大子序列和(maxsum) [问题描述] 输入一个长度为n的整数序列(A1,A2,……,An),从中找出一段连续的长度不超过M的子序列,使得这个序列的和最大. 例如: 序列 1, -3, 5, 1, ...

  6. python核心编程笔记(转)

    解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗 ...

  7. Python使用场景和应用领域

    Python特点 1.Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型. 2.Python具有很强的面向对象特性,而且简化了面向对象的实现.它消除了保护类型.抽象类.接 ...

  8. EntityFramework Core 3.0查询

    前言 随着.NET Core 3.0的发布,EF Core 3.0也随之正式发布,关于这一块最近一段时间也没太多去关注,陆续会去对比之前版本有什么变化没有,本节我们来看下两个查询. 分组 我们知道在E ...

  9. Lua和C交互的简易教程

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52458051 本文出自: [HansChen的博客] Lua栈 要理解Lua和C++ ...

  10. Django中间件部分源码分析

    中间件源码分析 中间件简介 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的 ...