posts - 16, comments - 18, trackbacks - 0, articles - 111
  首页  :: 订阅 订阅  :: 管理

Refactoring 规则

Posted on 2005-10-18 19:35 GaoJie[高杰] 阅读(...) 评论(...) 编辑 收藏
1.尽量消除重复的代码,将它们合而为一

2.拆解过长的函数

3.拆解过大的类

4.过长的参数列

5Divergent Change(发散式变化)

现象:当某个Class因为外部条件的变化或者客户提出新的功能要求等时,每次修改要求我们更新Class中不同的方法。不过这种情况只有在事后才能觉察到,因为修改都是在事后发生的么(废话)。

重构策略:将每次因同一条件变化,而需要同时修改的若干方法通过Extract Class将它们提炼到一个新Class中。实现目标是:每次变化需要修改的方法都在单一的Class中,并且这个新的Class内所有的方法都应该与这个变化相关。



6Shotgun Surgery(霰弹式修改)

现象:当外部条件发生变化时,每次需要修改多个Class来适应这些变化,影响到很多地方。就像霰弹一样,发散到多个地方。

重构策略:使用Move MethodMove FieldClass中需要修改的方法及成员变量移植到同一个Class中。如果没有合适的Class,则创建一个新Class。实现目标是,将需要修改的地方集中到一个Class中进行处理。



7Feature Envy(依恋情结)

现象:Class中某些方法“身在曹营心在汉”,没有安心使用Class中的成员变量,而需要大量访问另外Class中的成员变量。这样就违反了对象技术的基本定义:将数据和操作行为(方法)包装在一起。

重构策略:使用Move Method将这些方法移动到对应的Class中,以化解其“相思之苦”,让其牵手。

8Data Clumps(数据泥团)

现象:指一些相同数据项目(Data Items),如Class成员变量和方法中参数列表等,在多个Class中多次出现,并且这些数据项目有其内在的联系。

重构策略:通过使用Introduce Parameter Object(创建新的参数对象取代这些参数)或Preserve Whole Object(使用已存在的对象取代这些参数),实现使用对象代替Class成员变量和方法中参数列表,清除数据泥团,使代码简洁,也提高维护性和易读性。



9Primitive Obsession(基本型偏执狂)

现象:在Class中看到大量的基本型数据项目(Data Item),如Employee类中有大量的数据成员,Employee#, FirstName, MiddleName, LastName, Address, State, City, Street, Zip, OfficePhone, CellPhone, Email……等等。

重构策略:使用Extract Class(提炼新类)或Preserve Whole Object(使用已存在的对象取代这些参数),实现使用对象代替基本型数据项目(Data Item)。如上述Employee类中就可分别提炼出EmployeeNameEmployeeContact两个新类。



10Switch StatementsSwitch语句)

11Parallel Inheritance Hierarchies(平行继承体系)

12Lazy Class(冗赘类)

13Speculative Generality(夸夸其谈未来性)

14Temporary Field(令人迷惑的暂时值域)

15Message Chains(过度耦合的消息链)

16Middle Man(中间转手人)

17Inappropriate Intimacy(狎昵关系)

现象:两个Class过分亲密,彼此总是希望了解对方的private成分。

重构策略:可以采用Move MethodMove Field来帮助他们划清界限,减少他们之间亲密行为。或者运用Change Bidirectional Association to Unidirectional,将双向关联改为单向,降低Class之间过多的依存性(inter-dependencies)。或者通过Extract Class将两个Class之间的共同点移植到一个新的Class中。



18Alternative Classes with Different Interfaces(异曲同工的类)

现象:两个函数做相同的事情,却有不同的signature

重构策略:使用Rename Method,根据他们的用途来重命名。另外,可以适当运用Move Method迁移某些行为,使Classes的接口保持一致。



19Incomplete Library Class(不完美的程序库类)