0

これが本当に基本的な質問である場合は申し訳ありませんが、これをどのように攻撃すべきかについて苦労しています。OLE オブジェクトのいくつかのコマンドをまとめようとしています。基本的な仕様は次のようになります。

Set Window window_id
    //Units is part of the position setter.
    [ Position ( x, y ) [ Units paper_units ] ] 
    [ Width win_width [ Units paper_units ] ] 
    [ Height win_height [ Units paper_units ] ]
    ..... this goes on for about 20+ commands, all optional.

[] の間は任意です。

したがって、クラスを作成する必要があります。「 CommandBuilder 」と呼ぶことができます。これは、これらすべてのオプションのセッターのメソッドを設定できます。それで問題ありません。私が抱えている主な問題は、文字列を出力する必要がある ToCommandString メソッドです。次のようになります。

Set Window 1 Position (x,y) Units "m" Height 100 Units "m" + what ever else the user added

設定される変数に基づいていくつかのifを実行し、文字列を結合するだけで、設定される変数について複雑なことは何もない場合、または変数がわずかしかない場合でも正常に機能しますが、オプションの変数および/またはネストされた値のヒープがある場合、ToStringメソッドが非常に長く複雑になる可能性があり、何かが変更された場合に維持するのが難しくなります.

このようなことを行うことで、ポリモーフィズムを使用してこれを解決できるかどうか疑問に思っていました。

interface ICommand
{
    string ToCommandString();
}

class PositionCommand : ICommand
{
    double X;
    double Y;
    string Units;

    public PositionCommand(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public PositionCommand(double x,double y, string units)
    {
        this.X = x;
        this.Y = y;
        this.Units = units;
    }

    public string ToCommandString()
    {
        //Add more stuff here to handle empty units.
        return String.Format(" Postion ({0},{1})", X.ToString(), Y.ToString());
    }
}
....more command classes.

次に、「 CommandBuilder 」のすべての設定メソッドを作成して、それをリストに追加するだけで、「CommandBuilder」メソッドのメインの ToString は、設定されたすべてのものをループして ToCommandString を呼び出すことができ、心配する必要はありませんif ステートメントまたは null チェックを実行します。

これはこれを行う正しい方法でしょうか?

PSさらに情報が必要な場合は、喜んで追加しますが、最初は長くなりたくなかっただけです。

4

2 に答える 2

2

それは私には合理的に聞こえます。ICommand インスタンスの構築を CommandBuilder 内部に保持することは間違いありません。

class CommandBuilder
{
  private List<ICommand> _commands = new List<ICommand>();

  public CommandBuilder Position(double x, double y)
  {
    _commands.Add(new PositionCommand(x,y))
    return this;
  }

  ...
}

ただではなく

class CommandBuilder
{
  public void AddCommand(ICommand cmd)
  { ... }
}
于 2008-12-12T03:07:59.323 に答える
0

はい。十分にカバーできたと思います。

于 2008-12-12T03:04:10.830 に答える