第三章 代码的坏味道(一)
来源:互联网 发布:51单片机智能交通灯 编辑:程序博客网 时间:2024/04/29 22:48
3.1 Duplicated Code (重复的代码)
问题一:同一个class内的两个函数含有相同的表达式(expression).
解决办法:采用Extract Method(110)提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码。
问题二:两个互为兄弟(sibling)的subclasses内含相同表达式
解决办法:对两个classes都使用Extract Method(110),然后再对被提炼出来的代码使用Pull Up Method(332),将它推入superclass内。
问题三:代码之间只是类似,并非完全相同
解决办法:运用Extract Method(110)将相似部分和差异部分分隔开,构成单独一个函数。然后可能发现或许可以运用Form Template Method(345)获得一个Template Method设计模式。
问题四:有些函数以不同的算法做相同的事
解决办法:选择其中较清晰的一个,并使用Substitue Algorithm(139)将其他函数的算法替换掉。
问题五:两个毫不相关的classes内出现Duplicated Code
解决办法:考虑对其中一个使用Extract Class(149),将重复代码提炼到一个独立class中,然后再另一个class内使用这个新class.但是,重复代码所在的函数也可能的确只应该属于某个class,另一个class只能调用它,抑或这个函数可能属于第三个class,而另两个classes应该引用这第三个class。你必须决定这个函数放在哪儿最合适,并确保它被安置后就不会再在其他任何地方出现。
3.2 Long Method(过长函数)
百分之九十九的场合里,要把函数变小,只需使用Extract Method(110).找到函数中适合集在一起的部分,将它们提炼出来形成一个新函数。
如果函数内有大量的参数和临时变量,可以经常运用Replace Temp with Query(120)来消除这些暂时元素。introduce Parameter Object(295)和Preserve Whole Object(288)则可以将郭仓的参数列表变得更简洁一些。
问题一:如何确定提炼哪一段代码
解决办法:寻找注释;条件式和循环常常也是提炼的信号。可以使用Decompose Conditional(238)处理条件式。至于循环,应该将循环和其内的代码提炼到一个独立函数中。
3.3 Large Class(过大类)
单一的类做太多的事情,出现太多instance变量
3.4 Long ParameterList(过长参数列)
如果手上没有你所需要的东西,可以叫另一个对象给你。有了对象,就不必把函数需要的所有东西都以参数传递给它了,你只需传给它足够的东西,让函数能从中获得自己需要的东西就可以了,函数需要的东西多半可以在函数的宿主类(host class)中找到。
Replace Parameter with Method(292)
Preserve Whole Object(288)
Introduce Parameter Object(295)
3.5 Divergent Change(发散式变化)
问题:某个class经常因为不同的原因在不同的方向上发生变化,Divergent Change就出现了。
解决:把这个对象分成两个,这样每个对象就可以只因一种变化而需要修改。找出因某特定原因而造成的所有变化,然后运用Extract Class(149)将它们提炼到另一个class中。
3.6 Shotgun Surgery(散弹式)
问题:每遇到某种变化,你都必须在许多不同的classes内作出许多小修改以响应值。
解决:使用Move Method(142)和Move Field(146)把所有需要修改的代码放进同一个class。如果眼下没有合适的class可以安置这些代码,就创造一个。通常可以运用Inline Class(154)把一系列相关行为放入同一个class。这可能会造成少量Divergent Change, 但你可以轻易处理它。
Divergent Change是一个class受多种变化的影响,Shotgun Surgery是一种变化引发多个classes响应修改。
3.7 Feature Envy(依恋情结)
问题:某个函数为了计算某值,从另一个对象那儿调用几乎半打的取值函数(getting method).
解决:把这个函数移至另一个地点。使用Move Method(142)把它移到它该去的地方。
3.8 Data Clumps(数据泥团)
问题:常常可以在很多地方看到相同的三或四笔数据项;两个classes内的相同值域(field)、许多函数签名式(signature)中的相同参数。
解决:首先找出这些数据的值域形式(field)出现点,运用Extract Class(149)将它们提炼到一个独立对象中;
然后将注意力转移到函数签名式(signature)上头,运用Introduce Parameter Object(295)或Preserve Whole Object(288)为它减肥。这么做的直接好处是可以将很多参数列缩短,简化函数调用动作。不必因为Data Clump只用上新对象的一部分值域而在意,只要你以新对象取代两个(或更多)值域,你就值回票价了。
评判方法:删掉众多数据中的一笔。其他数据有没有因而失去意义?如果它们不再有意义,这就是个明确信号:你应该为它们产生一个新对象。
- 第三章 代码的坏味道(一)
- 第三章代码的坏味道
- 第三章 代码的坏味道
- 第三章 代码的坏味道(二)
- 代码的坏味道(一)
- 重构 第三章 代码的坏味道
- 看出笔记-第三章-代码坏味道
- 《重构》读书笔记(四)——第三章 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- 代码的坏味道
- f(x,y)=ax*x+by+c 的抽象
- 判断链表是否有环以及查找环的入口点——淘宝笔试归来
- Whitespace语言教程【译】Whitespace Tutorial [原]
- socket编程
- C++容器类 Vector教程
- 第三章 代码的坏味道(一)
- 行指针和列指针-专题分析(转至汪老师的C语言)
- JPEG文件格式解析
- php 5 方法的重载
- 在ubuntu 10.04及以上版本为chrome安装flash
- C语言运算符优先级存在的问题
- oracle pl/sql 基础
- ServletConfig与ServletContext
- Tomcat中的类加载器