A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Duplicated Code

首当其冲的当然是冗余代码。

最单纯的冗余,是同一个函数包含两个相同的表达式。这时候需要采用Extract Method提炼出重复的代码。
两个互为兄弟的子类包含同一个表达式。这时候需要对两个类使用Extract Method并且将提炼出的代码使用Pull Up Method,将其推入超类。而如果代码之间只是类似,并非完全相同,那么就得运用Extract Method将相似的部分和差异的部分割开,构成一个单独的函数,然后发现可以运用Form Template Method获得一个Template Method设计模式。如果有些函数以不同的算法做相同的事情,你可以选择其中一个清晰的,并且使用Substitude Algorithm将其他函数的算法替代掉。
如果两个毫不相关的类出现同一个表达式,我们可以考虑对其中一个使用Extract Class,将冗余代码提炼到一个独立的类中,然后在另一个类中使用这个新类。
too Long Function

拥有短函数的对象会活的更好更长。现代OO语言几乎已经完全免除了进程内部函数调用的开销。
大部分场合里,要把长函数变短,只需要使用Extract Method。找到函数中适合集中在一起的部分,将它们提炼出来形成一个新的函数。
如果包含了太多的临时变量或者参数,它们会对构成新函数形成阻碍:导致可读性降低,所以我们应该运用Replace Temp with Query来消除临时变量。Introduce Parameter Object和Preserve Whole Object则可以将过长的参数列表变得简洁一些。
通常,具有明确意义的一段注释或者循环、条件都是提炼的信号。

too Large Class

想利用单个类做太多的事情,其内往往就会出现太多的实例变量。一旦如此,Duplicated Code也就接踵而至了。
所以我们可以使用Extract Class将几个变量提取到新类中,将职责分配出去。

too Long Parameter List

太长的参数列表难以理解,可能会造成前后不一致或者不易使用。向已有对象发出一条请求就可以取代一个参数,那么应该激活重构手法Replace Parameter with Method。还可以使用Preserve Whole Object 将来自同一个对象的一堆数据收集起来,并以该对象替代它们。如果缺乏合理的对象归属,可使用Introduce Parameter Object为他们制造出一个参数对象。

Divergent Change(发散式变化)

如何理解发散式变化呢?
一个类经常因为不同的原因在不同的方向上发生变化,Divergent Change就出现了。比如一个类,如果新加入数据库,必须修改某3个函数,如果假如新金融工具,必须修改某4个函数。那么此时也许将这个对象分成两个会更好。这样,每个对象只会因为一种变化需要修改。当然,往往在修改了数据库后,才发现还需要修改金融工具,这样你才发现了这个问题。为此需要用Extract Class将他们提炼到另一个类中。

Shotgun Surgery(霰弹式修改)

和发散式变化类似,但如果每次遇到某种变化,需要进行许多小修改,而且散步四处,这样以后可能很难找到它们,并且很容易忘记某个重要修改。
这种情况需要用Move Method和Move Field把所有需要修改的代码放入同一个类。

Feature Envy(依恋情节)

函数如果对某个类的依赖程度高过了自己所处的类,这样应该使用Move Method将其移到该去的地方。如果只有一小部分承受这种相忘于江湖的苦闷,这时候应该用Extract Method将其提炼到独立函数中,在使用Move Method解决它的七年之痒。

Switch Statements

少用switch语句,switch的本质就在于重复,所以在出现Switch的时候,应该考虑使用多态来替换它。运用 Replace Conditional with Polymorphism.

Parallel Inheritance Hierarchies(平行继承体系)

如果为某个类增加子类,而另一个类也要相应增加子类的时候,需要消除这种重复。
---------------------
【转载,仅作分享,侵删】
作者:No_Game_No_Life_
原文:https://blog.csdn.net/No_Game_No_Life_/article/details/86073299


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马