介绍
我以前写过《php杂谈 《重构-改善既有代码的设计》之一重新组织你的函数》,其中代码坏味道,还有深入挖掘的地方,所以我再重点把这一篇提出来,分几篇再提一下,不要闲我烦。
我觉得重构是我们要用一生去研究的地方,跟文学一样,我们要用一生追求优秀的文学作品。
我尽量以漫画的形式表现。
味道
Duplicate Code
状况:如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好。
1、同一个class内的两个函数含有相同的表达式。——需要Extract Method,提炼出重复代码,然后让两个地点都调用被提炼出来的那一段代码。
2、两个互为兄弟的subclass内含相同的表达式,要避免这种情况——需要两个class都使用Extract Method,把Extract的Method推入superclass内。
3、两个毫不相干的classes内出现Duplicate Code,你应该考虑对其中一个使用Extract Class,将重复代码提炼到一个独立class中,然后在另一个class内使用这个新class。
Long Method
不熟悉面向对象技术的人,常常觉得对象程序中只有无穷无尽的delegation(委托),根本没有进行任何计算。和此类程序共同生活数十年之后,你才会知道,这些小函数有多大价值。——间接层所能带来的全部利益:解释能力,共享能力,选择能力。——都是由小型函数支持的。
很久以前程序员就已认识到:程序愈长愈难理解。不过短函数让代码阅读者必须经常转换上下文去看看子程序做了什么,然短函数容易理解的真正关键在于一个好名字。如果你能给函数起个好名字,读者就可以通过名字了解函数的作用,根本不必去看其中写了些什么。
可遵循的一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途命名。——关键在函数“做什么”和“如何做“之间的语义距离。
函数内如果有大量的参数和临时变量,会对你的函数提炼形成阻碍,导致可读性几乎没有任何提升。——可以使用Replace Temp with Query来消除暂时元素。Introduce Parameter Object则可以将过长的参数列变的更简洁些。
如果仍然有太多临时变量和参数,那就应该“用对象替换方法”。
如何确定该提炼哪一段代码?寻找注释。寻找条件式和循环。
总结
由于这一篇内容太多,所以分批来写,大家勿见怪。——如果有理解上的错误,请指教!
推荐
希望各位高手能把平时写代码的经验,好的代码形式,给大家分享一下。
喜欢编程