我有一个类,在某些情况下,永久更新它的内部状态,在其他情况下,计算预计值。更新内部状态的过程与计算投影值的过程相同,但由于一个使用局部变量,一个使用字段,我没有看到避免复制/粘贴代码的方法。
我认为问题是因为foo
和bar
是原语,这意味着它们无法通过引用进行更新。但是对于一个简单的例子来说,将foo
和bar
包裹在内部class
中是否有意义?
public abstract class RatioUpdate {
private double foo;
private double bar;
public Update(double foo, double bar) {
this.foo = foo;
this.bar = bar;
}
public double getRatio() {
return foo / bar;
}
public double updateData(double input) {
foo = recalculateFoo(foo, input);
bar = recalculateBar(bar, input);
return foo / bar;
}
public double getProjectedRatio(double input) {
double newFoo = recalculateFoo(foo, input);
double newBar = recalculateBar(bar, input);
return newFoo / newBar;
}
// Abstract because not really relevant, this was the best I could do to avoid duplication
protected abstract recalculateFoo(double foo, double input);
protected abstract recalculateBar(double bar, double input);
}
答案 0 :(得分:2)
我能想到的一件事就是提取课程'。如果您有“重构 - 改进现有代码的设计”这本书。作者:Martin Fowler,您将在第81页找到数据块。
似乎foo
和bar
总是在一起。他们可能是一个数据集团。书中引用:"一个好的测试是考虑删除其中一个数据值:如果你这样做,其他人是否有意义?如果他们没有,那么这肯定表明你有一个渴望出生的对象。"
如果你确实提取了一个课程,你最终会得到一些看起来很像莫里斯建议的东西。但是,我个人向foo
和bar
添加最终标记,以使对象不可变。
答案 1 :(得分:-1)
考虑将你的课分成两部分:
public class Ratio {
private double foo;
private double bar;
public Ratio(double foo, double bar) {
this.foo = foo;
this.bar = bar;
}
public double getRatio() {
return foo / bar;
}
}
public abstract class RatioUpdate {
Ratio ratio;
public RatioUpdate(Ratio ratio) {
this.ratio = ratio;
}
public void updateData(Ratio ratio) {
this.ratio = ratio;
}
public Ratio getProjectedRatio(double input) {
return recalculateRatio(ratio, input);
}
// Abstract because not really relevant, this was the best I could do to avoid duplication
protected abstract Ratio recalculateRatio(Ratio ratio, double input);
}