《重构改善既有代码的设计》之代码的坏味道(一)
2012-12-18 11:01
330 查看
一、Duplicated Code(重复代码)
坏味道行列中首当其冲的就是Duplicate Code.如果你在一个以上地点看到相同的程序结构,那么可以肯定:设法将其合二为一,程序会变得更好。
最单纯的Duplicate Code就是“同一个类的两个函数含有相同的表达式”。这时,你需要做的是采用Extract Method提炼出重复代码,然后让这两个地点都调用被提炼出来的那一段代码。
另一种常见情况就是“两个互为兄弟的子类内含有相同表达式”。要避免这种情况,只需对两个类都采用Extract Method,然后再对被提炼的代码使用Pull Up Method,将它推入超类内。如果代码之间只是类似,并非完全相同,那么就得运用Extract Method将相似部分和差异部分分隔开,构成单独一个函数。然后你可能发现可以运用Form Template Method获得一个Template Method设计模式。如果有些函数以不同的算法做相同的事,你可以选择其中较为清晰的一个,并使用Substitute Algorithm 将其他函数的算法替换掉。
如果两个毫不相关的类出现Duplicate Code,你应该考虑对其中一个使用Extract Method,将重复代码提炼到一个新类中,然后在两个类内使用这个新类。但是,重复代码所在的函数也可能的确只应该属于某个类,另一个只能调用它。抑或这个函数可能属于第三个类,而另两个类应该引用这第三个类。你必须决定这函数放在哪合适,并确保它被安置后就不会再在其他任何地方出现。
二、Long Method (过长函数)
“间接层”所能带来的全部利益--解释能力、共享能力、选择能力--都是由小型函数支持的。程序愈长愈难理解。
你应该积极分界函数。我们遵循一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。我们可以对一组甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名能够解释其用途,我们也该毫不犹豫地那么做。关键不在于函数的长度,而在于函数“做什么”和“如何做”直接的语义距离。
如何确定该提炼哪一段代码呢?
1、寻找注释。它们通常能指出代码用途和实现手法的语义距离。
2、条件表达式和循环常常也是提炼的信号。
坏味道行列中首当其冲的就是Duplicate Code.如果你在一个以上地点看到相同的程序结构,那么可以肯定:设法将其合二为一,程序会变得更好。
最单纯的Duplicate Code就是“同一个类的两个函数含有相同的表达式”。这时,你需要做的是采用Extract Method提炼出重复代码,然后让这两个地点都调用被提炼出来的那一段代码。
另一种常见情况就是“两个互为兄弟的子类内含有相同表达式”。要避免这种情况,只需对两个类都采用Extract Method,然后再对被提炼的代码使用Pull Up Method,将它推入超类内。如果代码之间只是类似,并非完全相同,那么就得运用Extract Method将相似部分和差异部分分隔开,构成单独一个函数。然后你可能发现可以运用Form Template Method获得一个Template Method设计模式。如果有些函数以不同的算法做相同的事,你可以选择其中较为清晰的一个,并使用Substitute Algorithm 将其他函数的算法替换掉。
如果两个毫不相关的类出现Duplicate Code,你应该考虑对其中一个使用Extract Method,将重复代码提炼到一个新类中,然后在两个类内使用这个新类。但是,重复代码所在的函数也可能的确只应该属于某个类,另一个只能调用它。抑或这个函数可能属于第三个类,而另两个类应该引用这第三个类。你必须决定这函数放在哪合适,并确保它被安置后就不会再在其他任何地方出现。
二、Long Method (过长函数)
“间接层”所能带来的全部利益--解释能力、共享能力、选择能力--都是由小型函数支持的。程序愈长愈难理解。
你应该积极分界函数。我们遵循一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。我们可以对一组甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名能够解释其用途,我们也该毫不犹豫地那么做。关键不在于函数的长度,而在于函数“做什么”和“如何做”直接的语义距离。
如何确定该提炼哪一段代码呢?
1、寻找注释。它们通常能指出代码用途和实现手法的语义距离。
2、条件表达式和循环常常也是提炼的信号。
相关文章推荐
- 《重构改善既有代码的设计》之代码的坏味道(三)
- 《重构改善既有代码的设计》之代码的坏味道(二)
- 《重构改善既有代码的设计》代码的坏味道
- 《重构改善既有代码的设计》——代码的坏味道
- 《重构改善既有代码的设计》-代码的坏味道(学习笔记 )
- 21种代码的“坏味道”
- 代码坏味道与启发--《代码整洁之道》总结
- 重构-代码的坏味道
- 代码坏味道——重构
- 代码的坏味道
- Martin Fowler和Kent Beck指出的代码22种坏味道
- 重构笔记——代码的坏味道(下)
- Clean Code 代码整洁之道 - 编码坏味道
- 22种代码坏味道及重构手段
- 代码的坏味道(一)
- 代码的坏味道——摘自《重构》
- 代码坏的味道15:过度耦合的消息链 (Message Chains)
- 雪的味道代码知道
- 代码的坏味道之四 :Long Parameter List(过长参数列)
- 22种代码的坏味道,一句话概括