1

GUI オブジェクトの単体テストを容易にするためにメディエーター パターンを使用しています。

疑似コード例:

Class MyGuiClass
{
  //...  Declare and initialize mediator to be a MyMediator
  private void On_SomeButtonPressed()
  {
     mediator.SomeButtonWasPressed();
  }
}

Class MyMeditator
{
  public void On_SomeButtonPressed()
  {
     //.. Do something now that the button was pressed
  }

}

Window を作成しなくても、SomeButton が押されたときに何が起こるかを単体テストできるようになったので、これは素晴らしいことです。

私が懸念しているのは、私が非公開のメソッドを採用し、Mediator を呼び出すすべての人のために公開したことです。過去にこれを行ったことがありますが、公開しなければならない方法があまりなかったので、気にしませんでした。

私は現在、このパターンを使用するために非常に大きなクラスをリファクタリングしています。 MyMediator を作成できるユーザーや、一部のメソッドが公開されているクラスの可視性を制御できる方法があるかどうか疑問に思っています。(これは不可能かもしれませんし、必要でさえないかもしれませんが、私は尋ねようと思いました。)

(私は .NET 3.5 SP1 で C# 3.0 を使用しています)

4

3 に答える 3

3

私はそれは問題ではないと思います.. gui 以外にメディエーターのインスタンスを持っているのは誰ですか? 誰かがそうするなら、それはメソッドを呼び出すつもりですか? もしそうなら、それは問題ですか?バグに気づき、診断し、修正するのは難しいですか?

ただし、イベントで探しているものを達成できると思います:

例えば

/* in the gui class (view) */
public event EventHandler OnButtonClicked;

/* in the mediator */
public MyMediator(MyView view) 
{
    view.OnButtonClicked += HandleButtonClicked;
}

private void HandleButtonClicked(object sender, EventArgs e)
{

}
于 2009-11-02T23:02:04.873 に答える
3

C# についてはわかりませんが、Java ではパッケージ レベルのアクセスとして何かを宣言できます (Java ではアクセス指定子を省略して)。私がやっていることは、パッケージ構造に対応する別のテスト階層を作成することです。つまり、クラス com.abcMyClass をテストするために、テスト クラス com.abcMyClassTest を用意し、MyClass のパッケージ アクセス メソッドに合法的にアクセスできるようにします。

アクセスの問題だけでなく、インターフェイスが乱雑になるため、すべてを公開するという考えはあまり好きではありませ。プライベートにしたいメソッドを公開すると、多くの場合、最終的に行き着く場所です。

于 2009-11-02T23:17:16.330 に答える
1

要点は、クラスのパブリック インターフェイスにそのクラスのパブリック 'API' を表示してもらいたいということです。したがって、プライベート メソッドをパブリックにすることで、クラスがより混乱し、'クリーン' ではなくなりますか?

できることはいくつかあります: 1) メディエーター (または謙虚なオブジェクト) クラスの実際の「公開面」とは何かを考え、喜んでそれらのメソッドを公開します。メディエーター クラス自体が public と宣言されていないことに注意してください。したがって、そのパブリック メソッドでさえ、アセンブリの内部にあります。

2) internal を private に使用して private をごまかすことができます (テスト クラスが別のアセンブリにある場合は、アセンブリの InternalsVisibleTo 属性を設定します)。

3) 単体テストに「ブラック ボックス」アプローチを採用します。これにより、プライベート メソッドは、パブリック メソッドから呼び出されたときにその使用によってテストされるため、原則としてプライベートをテストする必要はありません。

于 2011-01-13T13:09:26.413 に答える