0

クラス オブジェクトの GUI を処理するための最良の (読み取り: 最も技術的に正しい) 方法は何ですか?

たとえば、I/O を処理するクラスがあるとします。と呼びましょうclsIO。ユーザーがこのクラスのさまざまなオプション/プロパティを変更できるようにするフォームもあります。それを と呼びましょうfrmIOfrmIOGUI は に固有のものclsIOであり、アプリケーションの他の場所では使用されません。

私のアプリケーションは常に のインスタンスを作成し、clsIOデフォルト設定をロードして操作を開始します。frmIOユーザーは、構成できるように「設定フォーム」を表示する必要がある場合とない場合があります。

ShowConfigForm()私には、これを処理する最善の方法は、クラスをインスタンス化するフォームをインスタンス化するのではなく、フォームへのオブジェクト参照をクラス内に格納し、メソッドを提供することです。

これがサウンドデザイン?

編集

このクラスとフォームの組み合わせを複数のプロジェクトで再利用する予定です。私はすでにそれを独自のプロジェクトで開発しているので、それを必要とする他のプロジェクトに簡単に転送/インポートできます。

現在の設計による単純な擬似コード:

class clsIO
{
  public bool Active{get;set;}
  public int Port{get;set;}
  public ShowConfigForm()
  {
    frmIO settings = new frmIO(this);
    settings.Show();
  }
}

class frmIO
{
  private clsIO _IO;
  public frmIO(clsIO IO){_IO = IO;};//constructor
  private btnEnable_Click()
  {
     _IO.Active = true;
    //etc etc
  }
}

ここでは、 をインスタンス化するだけですclsIO。その逆ではありません。

4

2 に答える 2

1

あなたが行った方法では、clsIO から frmIO (GUI クラス) への密結合があります。この密結合により、単体テストなどを行うことができなくなるため、これは良い方法ではありません。また、clsIO を他の操作に再利用する必要がある場合、fromIO へのこの密結合により、再利用ができなくなります。

最初に clsIO をインスタンス化し、次に clsIO インスタンスを frmIO に渡すことによって frmIO をインスタンス化することによってそれらをまとめる別のクラスが必要です。このようにして、各クラスの懸念を分離し、薄いものを別のものに配線する責任を負わせます。これにより、よりクリーンになります。

さらに、clsIO クラスからインターフェイスを抽出し、frmIO 内のインターフェイス タイプを使用して clsIO を参照することにより、設計を改善できます。これは、2 つのクラス間の疎結合を実現するのに役立ちます。

私が説明したことがあまり意味をなさない場合は、コードサンプルを提供する必要がある場合はお知らせください。

于 2012-07-04T10:07:05.607 に答える
1

通常、構成を含むクラスがあります。フォーム自体には、そのsettingsクラスへの参照があります。ユーザーがフォームの設定を変更すると、フォームはそれをsettingsクラス/オブジェクトに伝えます。

clsIOこれで、設定でオブザーバーとして登録できます。つまり、何かが変更されるたびに、clsIOは通知を受け取り、その操作を更新できます (この方法では、設定にはすべてのオブザーバーへの参照が含まれます)。これはオブザーバー パターンと呼ばれます。多くの「未知の」オブジェクトが何かを観察すると、その強さを発揮します。つまり、設定は、多くの異なるクラス/オブジェクトに影響を与えるものである可能性があります。オブザーバーは設定を決定するだけで、変更することはありません。

手間をかけずにシンプルに保ちたい場合は、設定への参照を に追加するだけclsIOです。選べるデザインです。これはより単純なので、小さくて単純なアプリケーションであれば、それで十分です。

しかし、あなたが本当にすべきことは、フォームを値から分離することです。フォームは単なるビューですが、実際の値は別のクラスに含まれています。

于 2012-07-04T08:25:32.607 に答える