使用第三方API,我为其对象编写了包装类。明显/标准的方式是:
public class WrapperFoo implements MyWrapper {
private Foo f;
public WrapperFoo(Foo f) {
this.foo = foo;
}
public int getMyParam() {
return f.getParam();
}
public void setMyParam(int param) {
if(param < 0) throw new IllegalArgumentException("Param must not be negative!");
f.setParam(param);
}
}
但是,Foo
的{{1}}方法很昂贵。所以相反,我这样做:
get
但是,出于测试原因,我希望能够拥有所有功能而无需第三方API的实例。所以我想重构现有的包装器版本,其中第三方API功能只是装饰器:
public class WrapperFoo implements MyWrapper {
private Foo f;
private int myParam;
public WrapperFoo(Foo f) {
this.foo = foo;
}
public int getMyParam() {
return param;
}
public void setMyParam(int param) {
if(param < 0) throw new IllegalArgumentException("Param must not be negative!");
this.param = param;
f.setParam(param);
}
}
显然,我真正的课程要复杂得多;我担心犯错会很容易。我想这是测试的目的,但是......问题:
答案 0 :(得分:1)
对于真正的Decorator / Adapter,适配器应具有相同的接口,因此您的包装器方法get/setMyParam()
应为get/setParam()
,如果可能,您应该实现第三方接口(如果存在)。
代码不应该能够从API的角度来区分包装器和原始包装器之间的区别。
现在回答你的问题:
主要问题:在Fowler的重构中,每次重构都有一个逐步的过程来确保正确性。这个过程有一个吗?
是的,Joshua Kerievsky 重构模式称之为&#34; Extract Adapter&#34;并且有一个循序渐进的例子。我无法在线找到确切的代码示例,但之前/之后的UML是Here
这种重构是否有名称? &#34;提取装饰&#34;?
如前所述,它被称为Extract Adapter
这样做是否有意义(而不是从头开始制作测试类)
可能取决于你的用例。
是否有可以执行此操作的IDE?我目前正在使用Eclipse 4.3.1
你可以使用Eclipse的重构工具来执行每一步,但我会犹豫尝试进行复杂的重构,就像你暗示你只需按一下按钮,即使有一个工具可以让你