您的位置:首页 > 编程语言

《重构改善既有代码的设计》之代码的坏味道(一)

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、条件表达式和循环常常也是提炼的信号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: