0

私のプログラムはシリアルポートでデータを受信して​​います。データを受信した後、8つの異なる方法のいずれかで解釈できます。

データの受信後にイベントをトリガーする場合、1つのイベントを使用してカスタムイベントargクラスで列挙型のようなものを使用する必要がありますか、それとも8つの個別のイベントを作成する必要がありますか?基本的に、イベントを作成するための規則は何であるか疑問に思っています。

現在のイベントと区別できる場合は、新しいイベントを作成する必要があると思いますが、私の例ではどちらに進むべきかわかりません。

編集:状況を明確にするために、プログラムは主にシリアルポートを介してデバイスと通信します。入力を受け取る方法は次のとおりです。

私はこれをすべきですか?

void receive(byte[] somebytes)
{
    // After checking to make sure all bytes expected are received
    switch(somecase)
    {
        case 0: TriggerEvent(SomeEventArgs);break;
        case 1: TriggerEvent(SomeEventArgs);break;
        case 2: TriggerEvent(SomeEventArgs);break;
        case 3: TriggerEvent(SomeEventArgs);break;
        case 4: TriggerEvent(SomeEventArgs);break;
        case 5: TriggerEvent(SomeEventArgs);break;
        case 6: TriggerEvent(SomeEventArgs);break;
        case 7: TriggerEvent(SomeEventArgs);break;
        case 8: TriggerEvent(SomeEventArgs);break;
    }
}

またはこれ:

void receive(byte[] somebytes)
{
    // After checking to make sure all bytes expected are received
    switch(somecase)
    {
        case 0: Event0(LessEventArgs);break;
        case 1: Event1(LessEventArgs);break;
        case 2: Event2(LessEventArgs);break;
        case 3: Event3(LessEventArgs);break;
        case 4: Event4(LessEventArgs);break;
        case 5: Event5(LessEventArgs);break;
        case 6: Event6(LessEventArgs);break;
        case 7: Event7(LessEventArgs);break;
        case 8: Event8(LessEventArgs);break;
    }
}
4

4 に答える 4

1

どちらのソリューションも機能しますが、サインルイベントを開催する方がはるかに簡単だと思います。

EventArgs<T>単一のイベントがある場合は、クラスで単一のイベントを公開する一意のイベントを定義し、単一のイベントを処理する必要があります。

何をするかを決定するすべてのロジックは、イベントをサブスクライブする「クライアントクラス」にあります。これにより、テストとデバッグが容易になります。

したがって、次のものが必要になります。

  • 単一のイベントを公開するクラス
  • イベント引数に応じて、そのイベントを処理し、実行を適切なメソッドにディスパッチするメソッド
  • 8つのケースのそれぞれを処理するための方法。

このようにすると、ディスパッチャメソッドをテストするための単体テストと、8つのメソッドのそれぞれをテストするためのさまざまな単体テストを簡単に作成できます。

外部リソースに依存する「サーバークラス」は単純です。8つのイベントから選択したディスパッチャのテストをデバッグするのは難しいため、これは重要です。

8つのイベントを使用して、他の実装について考えてみてください。コードのテストとデバッグがより混乱し、困難になります。

補足として、「C#イベント実装の基本、ベストプラクティス、および規則」に関するこの完全な記事を読むことをお勧めします。

于 2012-05-16T15:01:43.760 に答える
1

それは本当にあなたがしていることとあなたのプログラムのより大きな文脈に依存します。これはおそらく文体的な問題ですが、次のように考えてください。イベントではなく通常の変数を処理する場合は、それらを8つの異なるクラスに分割する方がよいでしょうか、それともすべて同じものを使用する方がよいでしょうか。クラスですが、8つの異なる値がありますか?

于 2012-05-16T14:50:34.787 に答える
1

私の個人的な好みは「lessismore」アプローチであり、説明したようにeventargsを介して列挙型を渡す1つのイベントを作成します。

KeyPressDownこれをデスクトップ開発用の.NETライブラリと比較します。AKeyPressed、、はありません-きちんとした直感BKeyPressedEnterKeyPressedな実装のために1つのメソッドにカプセル化されています。

于 2012-05-16T15:26:58.517 に答える
0

あなたのプログラムが正確にどのように見えるかわからないので、判断するのは少し難しいです。ただし、概要を維持し、イベントハンドラーメソッドによってイベントが作成されないようにするために、8つの個別のイベントを作成することをお勧めします。

于 2012-05-16T14:49:04.843 に答える