2

C#とEmguCVを使用した画像処理プロジェクトに取り組んでいます。私たちのチームは3人で構成されています。より速く進歩させるために、私たち3人は異なるサブ問題に取り組むか、同時に異なるアルゴリズムで実験します。

現在、私たち一人一人が、作業中の主要なコードを含む関数を作成し、ドライバーに変更を加えて、新しい関数への呼び出しを追加しています。これはすべて同じファイルで発生します。ソース管理を使用しているので、まだお互いに足を踏み入れていません。しかし、私たちがさらに進歩するにつれて、これが持続可能になるとは思いません。また、コードが乱雑になっているように感じます。

ストラテジーパターンを実装し、アルゴリズムまたはサブ問題処理を独自のクラスにカプセル化し、ドライバーからそれぞれの実行メソッドを呼び出す方がよいと考えていました。

ただし、このアプローチにはいくつかの問題がある可能性があることを認識しています。

  1. 異なるアルゴリズムは異なる入力を取ります(ソース画像、いくつかの異なるパラメータのセットなど)
  2. 異なるアルゴリズムは異なる出力(新しい画像、機能セット、マトリックスなど)を返します

私がこのようなことをすることによって克服できると私が信じる最初の問題

Class Strategy1 : IStrategy
{
    int _code;

    // Different *input* paramteres for the strategy may be passed in the 
    // constructor depending on the type of strategy
    public Strategy1(int c)
    {
        _code = c;
    }

    // This is the method defined in the IStrategy interface
    public void execute()
    {
        // Some code that uses _code and does some processing goes here
    }
}

さまざまな戦略のコンストラクターを変更して、さまざまなタイプの引数を受け入れることができます。

複数の型/値を返す問題に対処する方法を考えるとき、最初に考えることができるのは、executeの戻り型をvoidからハッシュテーブルのようなものに変更することです。ここでは、さまざまな戻りパラメーターを格納して返すことができますint _returnCode別のメソッドまたはそのクラスの読み取り専用プロパティを介して取得できる""など、クラスの他のメンバーがあります。

これが設計原理の観点からどれほど優れた解決策になるかはわかりません。これについてのご意見をお聞かせいただければ幸いです。ありがとう

4

3 に答える 3

4

アルゴリズムの共通点が実行のみである場合は、戦略パターンではなくコマンド パターンについて考える必要があります。(少なくとも、それはあなたが説明したソリューションに最も適しています。)

これで大丈夫です!戦略パターンのきめの細かい代用性を手に入れることはできませんが、それを行う立場にあるようには思えません。コマンド パターンを使用すると、アルゴリズム固有のコードを処理フロー コントロール (ドライバーとそのサウンド) から切り離すことができます。

たとえば、次のようなコードを記述できます。

// ... logic to obtain an image and handle application flow ...

// I'm using 'image' here as a stand-in for a single object all your commands
// could derive their inputs from, or a container of all the inputs. If no such
// object exists, just do what you have to construct the commands.
ICommand[] commands = ImageCommandFactory.CreateCommands(image);

foreach(ICommand command in commands) {
    command.Execute();
}

// ... Handle commands ...

おっしゃったように、コマンド オブジェクトはパブリック メンバーを使用して実行結果を公開します。最も単純な形式では、 のようなプロパティを使用しますpublic object Results { get; }。(もちろん、その戻り値を標準ICommandResults型に絞り込むことができればできるほど、より良い結果が得られます。)

結果をどう処理するかはあなた次第です。ファクトリーを (再び) 使用して、渡すコマンドに適したハンドラーを作成できます。

// Picks the correct type of processor, depending on the command
IResultHandler handler = ResultHandlerFactory.CreateHandler(command, form);

// renders the results to the form provided to the factory method
handler.RenderResults();

または、デザインにより適した他の手法を使用してください。

于 2009-11-14T18:17:59.213 に答える