5

最近、 Presenter Firstについて知り、ホワイトペーパーやブログなどを読みました。

私が見つけたほとんどの例では、イベントはインターフェース上で直接宣言されるのではなく、そのためのメソッドとして宣言されます。例えば、

public interface IPuzzleView
{
    void SubscribeMoveRequest(PointDelegate listener);
    // vs
    event PointDelegate MoveRequest;
}

理由はよくわかりません。この背後にある理由を説明する紙/記事/ブログをどこかで見たと思いましたが、もう見つかりません。上記のテキストには、単体テストコードのスニペットも含まれていました。これは、単体テストの1つが間違っていたと自分に言い聞かせたことを覚えているからです。

アップデート:

以下は比較のための例です。

public class Collect
{
    public static CollectAction<T> Argument<T>(int index,
        CollectAction<T>.Collect collectDelegate)
    {
        CollectAction<T> collect = new CollectAction<T>(index, collectDelegate);
        return collect;
    }
}

public interface IApplicationView
{
    event EventHandler Load;

    // or

    void SubscribeLoad(Action action);
}

Mockery mockery = new Mockery();
IApplicationView view = mockery.NewMock<IApplicationView>();
IApplicationModel model = mockery.NewMock<IApplicationModel>();

購読スタイル:

Action savedAction = null;
Expect.Once.On(view).Method("SubscribeLoad").Will(
    Collect.Argument<Action>(0,
    delegate(Action action) { savedAction = action; }));
Expect.Once.On(model).Method("LoadModules");
new ApplicationPresenter(view, model);
savedAction();
mockery.VerifyAllExpectationsHaveBeenMet();

対イベント:

Expect.Once.On(view).EventAdd("Load", Is.Anything);
Expect.Once.On(model).Method("LoadModules");
new ApplicationPresenter(view, model);
Fire.Event("Load").On(view);
mockery.VerifyAllExpectationsHaveBeenMet();

参考までに、ApplicationPresenterはすぐにガベージコレクションされ、配線が行われないため、上記のイベントスタイルはそのままでは機能しません。

4

1 に答える 1

4

簡単な答えは次のとおりです。PresenterFirstは.NET1.1およびVS2003の時代に最初に進化し、C#イベントは問題になる可能性があります。

当時の現在のテスト/モックツールは、イベントのサブスクリプションとディスパッチをカプセル化する必要性をサポートしていませんでした。時間の経過とともに、放出クラスの外部でイベントの特定の性質を公開することは、実装に関する知識が多すぎてクライアントコードに負担をかけ、リファクタリングを困難にすることに気づきました。

公開されている例では、PresenterFirstの手法を言語固有の機能に関連付けないようにしたいと考えました。(たとえば、JavaにはC#イベントやデリゲートに相当するものはありませんが、オブザーバーパターンを使用できないという意味ではありません。)

過去数年間で、イベント、匿名の代表者、モックツールが大きく進歩したことがわかります。次回C#プロジェクトを選択するときは、イベントのサブスクリプションとディスパッチを処理するための「最良の方法」に関するすべての仮定を再評価します。上記の例は興味深いものです。

C#イベントの使用を非表示にした元の、おそらく日付の付いた理由を要約すると、次のようになります。-単体テストでイベントサブスクリプションをモックすることができなかった-イベントサブスクリプション/ディスパッチを処理するために別の内部メカニズムを使用することがありました。これにより、あるインターフェイスから別のインターフェイスへの不整合が発生しました。-サブスクライバーが存在しない場合は動作が異なるため、C#イベントを内部的にも放棄することを何度か検討しました。イベントを外部に公開すると、再実装がはるかに困難になります。

Jiho Hanがこの質問で私にメッセージを送ったとき、彼はデータバインディングと、より具体的なPFの例についても質問しました。これに対して、Presenter Firstのより新しい、より完全な例を公開し、Adaptersについて詳しく説明しました

于 2010-01-08T03:36:39.823 に答える