【发布时间】:2014-04-02 14:47:45
【问题描述】:
使用第三方 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 的 get 方法很昂贵。所以相反,我这样做:
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);
}
}
但是,出于测试原因,我希望能够拥有所有功能而不需要第三方 API 的实例。所以我想重构现有的包装器版本,其中第三方 API 功能只是一个装饰器:
public class WrapperImpl implements MyWrapper {
private int myParam;
public int getMyParam() {
return myParam;
}
public void setMyParam(int param) {
if(param < 0) throw new IllegalArgumentException("Param must not be negative!");
this.myParam = param;
}
}
public class WrapperFoo implements MyWrapper {
private MyWrapper backing;
private Foo f;
public WrapperFoo(MyWrapper backing, Foo f) {
this.backing = backing;
this.foo = f;
}
public int getMyParam() {
return backing.getMyParam();
}
public void setMyParam(int param) {
backing.setMyParam(int param);
f.setParam(param);
}
}
显然,我的真实课程要复杂得多;恐怕很容易出错。我想这就是测试的目的,但是......问题:
- 主要问题 在 Fowler 的Refactoring 中,每个重构都有一个分步过程来确保正确性。这个过程有没有一个?
- 这种重构有名称吗? “提取装饰器”?
- 这样做是否有意义(与从头开始创建测试类相比)
- 是否有可以执行此操作的 IDE?我目前使用的是 Eclipse 4.3.1
【问题讨论】:
-
我不肯定,但这闻起来像mockito。
标签: java refactoring decorator