坏味道 |
特征 |
情况及处理方式 |
目标 |
|
重复代码 |
1.重复的表达式 |
同一个类的两个函数有相同表达式 |
重复代码提取为方法 |
相同表达式只在一个类的一个方法出现,供其他方法调用 |
兄弟类含有相同表达式 |
重复代码提取为方法 |
|||
不相干类含有相同代码 |
提取为独立类供调用 |
|||
过长函数 |
1.代码前面有注释 |
|
提取方法 |
每个方法只做一件事,方法要定义完善、命名准确 |
过大的类 |
1.一个类中有太多实例变量 |
部分字段之间相关性高 |
相关的字段和方法提取为类 |
每个类负责一组具有内在的相互关联的任务 |
某些字段和方法只被某些实例用到 |
这些字段和方法移到子类中 |
|||
过长参数列 |
1.参数列过长 |
方法可以通过其他方式获取该参数 |
让参数接受者自行获取该参数 |
只需要传给函数足够的、让其可以从中获取自己需要的东西就行了 |
同一对象的若干属性作为参数 |
在不使依赖恶化的情况下,使用整个对象作为参数 |
|||
被调用函数使用了另一个对象的很多属性 |
将方法移动到该对象中 |
|||
某些数据缺乏归属对象 |
首先创建对象 |
|||
发散式变化 |
一个类受多种变化的影响 |
类经常因为不同的原因在不同的方向上发生变化 |
将特定原因造成的所有变化提取为一个新类 |
针对某一外界变化的所有修改,只应发生在单一类中,而这个类中所有的内容都应反映此变化 |
散弹式修改 |
一种变化引发多个类的修改 |
某种变化需要在许多不同的类中做出小修改 |
把所有需要修改的代码放进同一个类中 |
针对某一外界变化的所有修改,只应发生在单一类中,而这个类中所有的内容都应反映此变化 |
依恋情结 |
一个函数使用其他类属性比使用自身类属性还要多 |
某个函数从另一个对象调用了几乎半打的取值函数 |
将依恋代码提取为单独方法,移动到另一对象 |
将数据和对数据的操作行为包装在一起 |
数据泥团 |
同时使用的相关数据并未以类的方式组织 |
|
先将字段提取为类,再缩减函数签名中的参数 |
总是绑在一起的数据应该拥有属于它们自己的对象 |
基本类型偏执 |
过多使用基本类型 |
总是被放在一起的基本类型字段 |
提取类 |
将单独存在的数据值转换为对象 |
参数列中有基本类型 |
提取参数对象 |
|||
数组中容纳了不同的对象,需要从数组中挑选数据 |
用对象取代数组 |
|||
基本数据是类型码 |
使用类替换类型码 |
|||
带条件表达式的类型码 |
使用继承类替换类型码 |
|||
Switch语句 |
相同的switch、case语句散布于不同地方 |
根据类型码进行选择的switch |
使用多态替代switch |
避免到处做相同的修改 |
单一函数中有switch |
使用显式的方法取代参数 |
|||
平行继承体系 |
1.为某个类增加子类时,必须为另一个类增加子类 |
|
一个继承体系中的实例引用另一个继承体系中的实例,然后迁移成员 |
避免到处做相同的修改 |
冗赘类 |
类无所事事 |
父类和子类无太大差别 |
将它们合为一体 |
|
某个类没有做太多事情 |
将这个类所有成员移到另一个类中,删除它 |
|||
夸夸其谈未来性 |
|
某个抽象类没有太大作用 |
将父子类合并 |
|
不必要的委托 |
将这个类所有成员移到另一个类中,删除它 |
|||
函数的某些参数未用上 |
移除参数 |
|||
函数名称带有多余的抽象意味 |
重命名函数名 |
|||
函数只被测试方法调用 |
连同测试代码一并删除 |
|||
令人迷惑的暂时字段 |
1.某个实例字段仅为某种情况而设 |
|
提取单独的类,封装相关代码 |
|
过度耦合的消息链 |
一长串的getThis或临时变量 |
客户类通过一个委托类来取得另一个对象 |
隐藏委托 |
消除耦合 |
中间人 |
某个类接口有大量的函数都委托给其他类,过度使用委托 |
有一半的函数 |
移除中间人 |
|
少数几个函数 |
直接调用 |
|||
中间人还有其他行为 |
让委托类继承受托类 |
|||
狎昵关系 |
某个类需要了解另一个类的私有成员 |
子类过分了解超类 |
将继承改为委托,把子类从继承体系移出 |
封装 |
类之间双向关联 |
去掉不必要的关联 |
|||
类之间有共同点 |
提取新类 |
|||
异曲同工的类 |
两个函数做同一件事,但是签名不同 |
|
合并 |
|
不完美的类库 |
类库函数构造的不够好,又不能修改它们 |
想修改一两个函数 |
在调用类增加函数 |
|
想添加一大堆额外行为 |
使用子类或包装类 |
|||
幼稚的数据类 |
某个类除了字段,就是字段访问器、设置器 |
|
1.用访问器取代public字段 |
封装 |
被拒绝的馈赠 |
派生类仅使用了基类很少一部分成员函数 |
子类拒绝继承超类接口 |
使用委托替代继承 |
|
过多的注释 |
一段代码有着长长的注释 |
|
消除各种坏味道 |
|
- 浏览: 5489 次
- 性别:
- 来自: 上海
相关推荐
重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与...
2.6 重构与设计66 2.7 重构与性能69 2.8 重构起源何处71 第3章 代码的坏味道75 3.1 DuplicatedCode(重复代码)76 3.2 LongMethod(过长函数)76 3.3 LargeClass(过大的类)78 3.4 LongParameterList(过长参数列...
2.6 重构与设计66 2.7 重构与性能69 2.8 重构起源何处71 第3章 代码的坏味道75 3.1 DuplicatedCode(重复代码)76 3.2 LongMethod(过长函数)76 3.3 LargeClass(过大的类)78 3.4 LongParameterList(过长参数列...
根据提供的文件信息,“重构-改善既有代码的设计.pdf”这一标题及描述表明这是一份专注于讨论如何通过...希望通过对“重构-改善既有代码的设计.pdf”这份文档的理解,能够帮助读者更好地掌握重构的核心理念和技术要点。
### 重构改善既有代码的设计 #### 一、引言 重构是软件开发过程中不可或缺的一部分,它可以帮助我们提高代码质量、增强可维护性以及提升开发效率。《重构:改善既有代码的设计》这本书由马丁·福勒(Martin Fowler...
5.3 这些重构准则有多成熟 第6章 重新组织你的函数 6.1 Extract Method(提炼函数) 6.2 Inline Method(将函数内联化) 6.3 Inline Temp(将临时变量内联化) 6.4 Replace Temp With Query(以查询取代临时变量) ...
### 重构:改善既有代码的设计 #### 知识点概览 重构是软件工程领域中的一个核心概念,指的是在不改变软件外部行为的前提下,对软件内部结构进行调整,以提高其可读性、可维护性和扩展性。这一过程通常涉及对现有...
Refactoring and Design 重构与设计 Refactoring and Performance 重构与性能 Where Did Refactoring Come From? 重构的起源 Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代码坏昧...
Refactoring and Design 重构与设计 Refactoring and Performance 重构与性能 Where Did Refactoring Come From? 重构的起源 Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代码坏昧...
本书清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。 章节列表如下: 目录 第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组...
Refactoring and Design 重构与设计 Refactoring and Performance 重构与性能 Where Did Refactoring Come From? 重构的起源 Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代码坏...
Refactoring and Design 重构与设计 Refactoring and Performance 重构与性能 Where Did Refactoring Come From? 重构的起源 Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代码坏昧...
Refactoring and Design 重构与设计 Refactoring and Performance 重构与性能 Where Did Refactoring Come From? 重构的起源 Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代码坏...