web-dev-qa-db-ja.com

同じように見えるが異なる2つのアルゴリズムを処理するにはどうすればよいですか?

私には多くの共通点を共有する2つのアルゴリズムがあります。 1つは反復手順を実行し、もう1つは最初の反復のみを実行します。もちろん、結果は異なり(一方のクラスは他方が提供できない結果を提供します)、セットアップ(反復プロセスには許容誤差と最大反復回数が必要ですが、非反復プロセスには関係ありません)。

内部ifを持つ一意のクラス(if (iterative) do this else do thatなど)を使用する必要がありますか、それとも2つの異なるクラスを実装する必要がありますか(共有できるように共通のコードをアクセス可能な場所に配置する可能性がありますか?)どう思いますか?

1
Stefano Borini

テンプレートメソッドパターン のように聞こえます:

テンプレートメソッドは、アルゴリズムのプログラムスケルトンを定義します。 1つ以上のアルゴリズムステップをサブクラスでオーバーライドして、包括的なアルゴリズムが引き続き実行されるようにしながら、さまざまな動作を可能にすることができます。

例えば:

abstract class Base {
    void stepOne(Object item) {
        // Do some stuff on item...
    }

    void stepTwo(Object item) {
        // Do some stuff on item...
    }

    void stepThree(Object item) {
        // Do some stuff on item...
    }

    void allSteps(Collection<Object> data) {
        for (Object x : data) {
            stepOne(x);
            stepTwo(x);
            stepThree(x);
        }
    }
}

class SpecificOne extends Base {
    @Override
    void stepTwo(Object item) {
        // Do something different on item
    }
}

class SpecificTwo extends Base {
    @Override
    void allSteps(Collection<Object> data) {
        for (Object x : data) {
            // The order is altered
            stepThree(x);
            stepTwo(x);
            stepOne(x);
        }
    }
}

次に、次のようなさまざまなアルゴリズムを使用します。

public class TMTest {
    public static void main(String[] args) {
        Collection<Object> items = ...;

        Base one = new SpecificOne();
        Base two = new SpecificTwo();

        one.allSteps(items);
        two.allSteps(items);
    }
}
3
vz0

プロシージャ自体を抽出してから、2つの異なるメソッドを用意する必要があるようです。1つは反復を実行してそのプロシージャを内部で呼び出すもので、もう1つは1回だけ呼び出すものです。

コメントへの応答:

覚えておいてください 繰り返さないでください 。アーキテクチャの最も重要な部分の1つは、類似した部分がまだあるメソッドで類似した部分を分離して共有できるようにコードを編成する方法を理解することです。それらが同じアルゴリズムを実行しているように見えるが、異なるパラメーターを使用している場合、これは、メソッド(または、複数の出力がある場合はクラス)にとって絶好の機会です。

2
Nicole

ユーザーの視点から見てください。いずれかのアルゴリズムのユーザーがもう一方を必要とするのはいつですか?ユーザーがこれらのアルゴリズムがうまく適合する典型的な問題を解決するとき、状況に応じてワンステップから反復(またはその逆)に切り替えることは理にかなっていますか?つまり、これらのアルゴリズムを使用するだけの場合、iterativeパラメーターは日常業務で意味がありますか?

1
9000