如何避免重复的代码,字段与局部变量

时间:2014-04-17 17:28:11

标签: java code-duplication

我有一个类,在某些情况下,永久更新它的内部状态,在其他情况下,计算预计值。更新内部状态的过程与计算投影值的过程相同,但由于一个使用局部变量,一个使用字段,我没有看到避免复制/粘贴代码的方法。

我认为问题是因为foobar是原语,这意味着它们无法通过引用进行更新。但是对于一个简单的例子来说,将foobar包裹在内部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);
}

2 个答案:

答案 0 :(得分:2)

我能想到的一件事就是提取课程'。如果您有“重构 - 改进现有代码的设计”这本书。作者:Martin Fowler,您将在第81页找到数据块。

似乎foobar总是在一起。他们可能是一个数据集团。书中引用:"一个好的测试是考虑删除其中一个数据值:如果你这样做,其他人是否有意义?如果他们没有,那么这肯定表明你有一个渴望出生的对象。"

如果你确实提取了一个课程,你最终会得到一些看起来很像莫里斯建议的东西。但是,我个人向foobar添加最终标记,以使对象不可变。

答案 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);
}