[英]Refactor object to use decorator pattern
使用第三方 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);
}
}
显然,我真正的课程要复杂得多; 我怕很容易犯错。 我想这就是测试的目的,但是......问题:
对于真正的装饰器/适配器,适配器应该具有相同的接口,因此您的包装方法get/setMyParam()
应该是get/setParam()
并且如果可能,您应该实现第 3 方接口(如果存在)。
代码应该无法从 API 的角度区分您的包装器和原始包装器之间的区别。
现在回答你的问题:
主要问题:在 Fowler's Refactoring 中,每次重构都有一个分步过程以确保正确性。 这个过程有吗?
是的,Joshua Kerievsky 的Refactoring to Patterns称之为“提取适配器”,并且有一个循序渐进的例子。 我在网上找不到确切的代码示例,但之前/之后的 UML 在 这里
这种重构有名字吗? “提取装饰器”?
如前所述,它被称为提取适配器
这样做是否有意义(与从头开始制作测试类相比)
也许取决于您的用例。
有没有可以做到这一点的IDE? 我目前正在使用 Eclipse 4.3.1
您可以使用 Eclipse 的重构工具来执行每个步骤,但我会犹豫是否尝试进行复杂的重构,就像您暗示只需按一下按钮一样,即使存在可以让您使用的工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.