《重构——改善既有代码》
剩下还有一些重构手法,在本blog系列《Eclipse重构——总章》中有提及,这些重构可以应用基本的Eclipse重构菜单,按照Martin Flower的建议步骤,亦步亦趋的完成。下面只是再特别强调几个。(更多的Eclipse重构菜单的使用,可以参考点击打开链接)
1. [Introduce Factory],Eclipse中有直接对应菜单, 可以直接将构造函数用静态方法封装,做成简单工厂形式,同时会自动将原来直接使用new xxx的代码替换为create_xxx()。这手法与[Encapsulate Field]一样, 简单却是基础。
在应用[Replace Typecode with Subclass]时,该方法就是第一步,然后简单引入switch语句,根据类型码,创建对应的子类。这一步是很关键的,后面的都是水到渠成的事情。
2. [Push Down] ,[Push Up]
两者在Eclipse Refactor菜单中都有直接对应选项,这里友情提示:其中的[preview]选项,可以控制选择具体对哪些类进行操作。
例如,有时候只有部分子类需要push down(重写父类方法),这时就可以在[preview]选项中控制。
3. [Replace Typecode with State/Strategy ]
这个重构是其他基本重构操作的组合,关键点在于
a. [Ecapsulate Field],将 记录当前typecode的成员变量封装起来,得到get /set
b. 将各类型码的定义,复制到State/Strategy基类中,同时 在该基类中实现setTypecode( <typecode>), 一般是简单的switch case形式。
c. 在各派类中实现getTypecode().
接下来,随意替换原类中的类型码,以及进行其他重构。
abstract class PermissionState {
public final static String REQUESTED = "REQUESTED";
public final static String CLAIMED = "CLAIMED";
public abstract String getState() ; // override by subclass
public PermissionState setState(String state) { //switch REQUESTED, CLAIMED
switch(state) {
case REQUESTED:
return new Requested();
case CLAIMED:
return new Claimed();
default:
throw new RuntimeException("type error");
}
}
}
写在最后,也应作为最初(只是当初忘了,直到暮然回首,才。。。)
为什么要使用Eclipse的重构菜单
长长的一句话: 虽然你可以手工改变代码中的某个元素,但是这样不能自动更新所有引用它们的地方,你必须逐条手工替换,而结果往往是漏掉一个或者改错一个。Eclipse等工具提供的菜单正是提供了智能的自动更新的功能。
最后承应标题,完成了纳米级的修改,下一步我们向微型结构出发。下一个系列将是简单的设计模式的讲解。