重构系列2.代码的坏味道

来源:互联网 发布:知乎 精华 编辑:程序博客网 时间:2024/04/29 17:41

1.重复的代码(重复的代码修改时需要修改多处,容易出现不一致)

如果一个类内有多个函数有重复的代码,可以提取出来放到一个新函数中,然后让用到这些代码的函数调用新函数;如果互为兄弟的两个子类中含有重复代码,则可以提取出来放到父类中;如果其功能骨架相同,可用模版方法模式;如果毫不相干的两个类中有重复代码,可提取出来放到一个单独的类中,然后通过复合调用新类。

 

2.过长函数(难以理解)

函数过长时可以把它分解为多个小型函数,以函数做什么而不是怎么做命名函数,如果函数参数列过长,可以考虑引入一个参数对象,如果还不行,就可以考虑用函数对象代替函数。

 

3.类的职责过多(单一职责原则)

一个类应该专心做好一件事情,不要做太多事情,如果类的职责过多,可以把相关的实例变量和函数提炼到一个新类中。

 

4.过长参数列(过长参数难以记忆,而且不易理解)

可以引进一个参数对象或者用函数对象代替函数。

 

5.一个类受多种变化的影响(外界的多种变化都需要修改某个类)

把每种变化可能影响的方面提炼成单独的类,使每个类只受某一种外界变化的影响。

 

6.一种变化影响多个类(外界的某种变化需要修改多个类)

把这种改变的影响提炼到一个类中。

 

7.某个类中的函数对另外一个类依赖更多

如果某个类中的函数对另一个类的依赖大于它所在的类,可以考虑把该函数移到它依赖性最大的类中。

 

8.相同数据项

如果两个类中有多个相同的字段或者多个函数签名中有相同的参数列,可以把他们提取出来放到一个单独的类中。

 

9.switch语句

看到switch语句,可以考虑用多态替换它,至少可以提炼到单独的函数中。

 

10.平行继承体系

两个平行的继承体系,修改其中一个结构中的类则要相应的修改另一个结构中的类,则可以考虑让一个体系中的实体引用另一个体系中的实体。

 

11.冗余类

如果一个类没有存在的价值,则可以消除它。

 

12.夸夸其谈未来性

不要对未来做出过多的假设,只要做出合理的假设。

 

13.令人迷惑的暂时字段

如果某个实例变量只在特定情况下才需要,并不是所有实例都需要,则可以考虑把该实例变量和与其相关的代码放到一个新类中。

 

14.单纯的数据类

不要使用单纯的数据类,应该让他们承担一些责任。

原创粉丝点击