0

アルゴリズムの概要があります。特定の順序で実行する必要があるいくつかの論理ステップです。アルゴリズムの結果は何らかの数値でなければなりません。当然、これはテンプレート メソッド パターンを使用するというアイデアにつながりました。これはvoidメソッドでは問題なく機能しますが、ここで問題が発生します。アルゴリズムの各ステップはvoidメソッドではありませんが、数値を返すことが許可されています (したがって、intメソッドです)。ステップがゼロ以外の数値を返す場合、この数値はアルゴリズムの実行結果。ゼロの場合、実行は次のステップに進みます。

これは本当に些細なことに聞こえるかもしれませんが、次のようなものを持つのはなんとなく醜いと思います。

public int algorithm() {
    int resultStep1 = step1();
    if (resultStep1!=0) {
        return resultStep1;
    }
    int resultStep2 = step2();
    if (resultStep2!=0) {
        return resultStep2;
    }
    ...
}

もちろんstep1()step2()などは抽象メソッドであり、私のものを拡張する対応するクラスに独自の特定の実装があります。

私の頭に浮かんだもう 1 つのアイデアは、例外を使用することでしたが、ここで制御フローについて話しているので、これはアンチパターンになります。

ここに何かが欠けていますか、それともこれは私がそれを書かなければならない方法ですか?

4

2 に答える 2

3

Java 7

ステップのインターフェースを定義できます。

interface Step {
    int step();
}

次に、手順のリストを使用します。

ArrayList<Step> steps = new ArrayList<Step>();

次のように繰り返します。

public int algorithm() {
    for (Step step : steps) {
        int result = step.step();
        if (result != 0)
            return result;
    }
    return 0;
}

そのリストを初期化するには、匿名実装クラスを使用してこれを行うことができます。

steps.add(new Step() {
    @Override
    public int step() {
        return step1(); //or the code directly
    }
});

steps.add(new Step() {
    @Override
    public int step() {
        return step2();
    }
});

または、ステップごとに適切な名前の実装クラスを作成します。

public class Step1 implements Step {
    @Override
    public int step() {
        // TODO Auto-generated method stub
        return 0;
    }       
}

そして、次のようにリストに追加します。

steps.add(new Step1());
steps.add(new Step2());

Java8 でラムダを使用する

インターフェースは必要ありません。

リスト:

ArrayList<Supplier<Integer>> steps = new ArrayList<Supplier<Integer>>();

設定:

steps.add(()-> step1());
steps.add(()-> step2());

アルゴリズム:

public int algorithm() {
    for (Supplier<Integer> step : steps) {
        int result = step.get();
        if (result != 0)
            return result;
    }
    return 0;
}
于 2014-11-24T11:22:29.113 に答える
0

次のことができます。

if(setResultAndCheckIsNonZero(step1())) {
    return result;
} else if(setResultAndCheckIsNonZero(step2())) {
    return result;
} else if ...

どこ:

private int result;

private boolean setResultAndCheckIsNonZero(int x) {
    result = x;
    if(result != 0) 
        return true;
    return false;
}
于 2014-11-24T11:05:49.450 に答える