重复代码
症状
坏味道中首当其冲的就是重复代码,如果看到两段(或更多)代码结构差不多或完全相同,那么这个坏味道就可以确定了。想办法消除掉。
病因
重复代码通常发生在多个程序员同时在同一个程序的不同部分上工作时。由于他们正在处理不同的任务,他们可能不知道其它同事已经写了类似的代码。 当代码的使用不同的算法却执行相同的工作时,这是更微妙的重复。这种重复可能很难找到和修复。 有时重复是有目的的,当急于按时完成工作,现有的代码几乎是正确的时候,新手程序员可能无法抵制复制和粘贴相关代码的诱惑。而且在某些情况下,程序员懒得去处理这种混乱的代码。
导致的健康问题
假设重复的代码足够的稳定,百年不变,这样的重复也许不会带来问题。但是软件是可塑性极强的工程实践,最不稳定的也是需求变化,那么你就要花时间去修改所有包含重复逻辑的代码,这样无形中增加了维护成本和发生bug的几率。
治疗
- 同一个类中两个或更多的函数,含有相同的表达式。
利用 Extract Method 提炼重复代码,然后引用新提炼的函数
- 提炼重复代码的过程可能会用到 Extract Variable 提炼相同的局部变量
- 互为兄弟的子类,含有完全相同的表达式。IntelliJ IDEA 练习视频
利用 Extract Method 提炼重复代码,然后将重复代码通过 Pull Up Method 推到超类
- 互为兄弟的子类,含有部分相同的表达式。IntelliJ IDEA 练习视频
一般常见相似的两个函数以相同的顺序执行大致的操作,但是各操作不完全相同。
利用 Extract Method 提炼重复代码,过程中可能发现可以运用From Template Method【Template Method 设计模式】
- 以不同的算法做相同的事。IntelliJ IDEA 练习视频
利用 Substitute Algorithm 将其他函数替换掉
- 两个互不相干的类出现重复代码。IntelliJ IDEA 练习视频
利用 Extract Class 将重复代码提炼到一个独立的新类中,然后引用新类,或者这个函数就是属于原来的某个类,那么可能就不是互不相干的类之间的引用了
什么情况不治疗
如果合并了两段重复代码,反而使得可读性变差了,并且不如原来直观了。
网友评论