1

2つのクラスと1つのユーザーフォームがあります。クラスでフォーム関連のコードを使用しないようにしていますが、OOPはかなり新しいです。CreateGraph()メソッドで、[はい/いいえ]ダイアログでユーザーにプロンプ​​トを表示したいと思います。メソッドのコードは、結果に基づいて続行されます。MVPに関するいくつかの例を読みましたが、この場合にどのように実装できるか正確にはわかりません。

誰かがこれについて私を導くことができますか?私のコードにはいくつかの深刻な設計上の問題があると思います

//singleton class
public class MyApplication
{
    private int state;
    private static MyApplication instance = null;

    public void Task1()
    {
        GraphGenerator gg = new GraphGenerator();
        gg.CreateGraph();
        state = 1;
    }

    public void Task2()
    {
        //some other tasks..
        state = 2;

    }
}

私が問題を抱えているクラス。

public class GraphGenerator
{
    public void CreateGraph()
    {
        //some code for creating a graph..
        //here i want to prompt the user with a
        // Yes/No dialog box..
    }
}

ユーザーフォーム

public partial class Form1 : Form
{
    private void btnTask1_Click(object sender, EventArgs e)
    {
        MyApplication ma = MyApplication.Instance;
        ma.Task1();
    }

    private void btnTask1_Click(object sender, EventArgs e)
    {
        MyApplication ma = MyApplication.Instance;
        ma.Task2();
    }
}
4

3 に答える 3

2
  1. ネーミング-MyApplication-はコントローラーまたはプレゼンターの名前としては不適切です。たとえば、「フォーム名」+「プレゼンター」を使用してネーミングします。
  2. シングルトン。コントローラーまたはプレゼンターはシングルトンであってはなりません。コンストラクターを介して注入するか、ctorで作成してから、クラスのプライベートセッターを使用してフィールドまたはプロパティに保存します。例えば:

    public Form1(FormPresenter presenter)
    {
       InitializeComponent();
       this.presenter = presenter;
    }
    
  3. この単純なサンプルの他のすべては正常です。ただし、ボタンイベントハンドラーの場合は、プレゼンター/コントローラーでイベントを使用し、プレゼンター/コントローラーイベントに固有のボタンイベントハンドラーで起動できます。

また、MVC/MVPフレームワークを探してみてください。関連する質問については、こちらをご覧ください: Windowsフォームを使用したMVCの実装

私が覚えているように、そのため のMicrosoft Smart Client Guidance(CAB / Microsoft Composite Application Block)があります。

于 2012-06-18T08:40:36.350 に答える
1

まず、UIコードをドメインオブジェクトと混同する必要がないように、クラスを可能な限り設計するのが最善です。の呼び出し元/所有者GraphGeneratorが、ユーザーに何かを尋ねる代わりに何かを尋ねる必要があるかどうかを判断できるように、コードを再構築できますGraphGeneratorか?GraphGenerator彼の仕事やグラフの作成だけに集中するようにしてください。

GraphGeneratorそれができない場合は、呼び出し元/所有者がユーザーからの通知をリッスンしGraphGenerator、次にユーザーと対話できるように、イベント(またはデリゲートまたはコールバックインターフェイスですが、今はこれらの関連メカニズムイベントを呼び出すことができます)を定義できます。たとえば、QueryConfirmSave発生させるために呼び出されるイベントを定義すると、呼び出し元はイベントを処理してユーザーにプロンプ​​トを表示し、ブール値をEventArgフィールドとして返すことができます。

(コードは次のようになります(編集者がチェックするのではなく、ヒップから):

GraphGenerator gg = new GraphGenerator();
gg.QueryConfirmSave += new EventHandler<ConfirmSaveArgs>(GraphGenerator_QueryConfirmSave);

その後:

private void GraphGenerator_QueryConfirmSave(object sender, ConfirmSaveArgs args)
{
   if (MessageBox.Show("Save?") == DialogResult.Yes)
   {
      args.SaveConfirmed = true;
   }
}
于 2012-06-18T13:31:20.757 に答える
-3

MessageBox.Show(...)が必要です。

于 2012-06-18T08:36:49.493 に答える