1

最初は、送信されたオブジェクトのタイプをチェックするifステートメントを実行していましたが、さまざまなタイプのメッセージオブジェクトがたくさんある場合は、それが非常に苦痛になる可能性があります。それから私は考えて、呼び出されるイベントを作成しました。次に、特定のタイプがそのイベントをリッスンし、呼び出されたときにそれをチェックするときに何かを実行する各関数を作成しました。

ifステートメントの方法

   //code for after message received - if you need the code for listening for the message i can give it but i don't see a need
   Type msgType = msgObj.getType();
   if(msgType == messageType1){
        //do stuff
   }
   else if(msgType == messageType2){
        //do more stuff
    }
   // and so on

あなたが見ることができるように、あなたがたくさんの異なるタイプのメッセージを持っているならば、これはひどいことがありえます

イベントの道

   private delegate messageEvent(object message);
   public event messageEvent onMessage;

   //code after message received
   onMessage(msgObj);


   // sample function that will listen for the onMessage event
   private void onMessage(object message){
        if(message.getType() == typeForThisFunction){
              //do somthing
        }
   }

ご覧のとおり、これはifステートメントよりも少し簡単ですが、すべてがリッスンしていることを確認するのは面倒であり、異なるタイプのメッセージが多数あり、それらすべてを同時にチェックする場合にも問題が発生する可能性があります。

これをもっと簡単に行うためのより良い方法はありますか?

4

1 に答える 1

2

より便利であるだけでなく、実行時に構成することもできる一般的に使用されるメソッドがあります ( if/elseまたは同等のものswitchはコンパイル時にのみ構成できます): make a Dictionary.

var dict = new Dictionary<Type, Action<object>>
           {
               { typeof(SomeMessage), m => this.Process((SomeMessage)m) },
               { typeof(OtherMessage), m => this.Process((OtherMessage)m) },
           };

ディクショナリの値は単なる例であり、要件に応じて別の方法を選択できます。

イベントベースの方法に似た他のアプローチも有効です。たとえば、次のようなクラスのオブジェクトのコレクションをビジネス ロジックに保持させることができます。

 interface IMessageProcessor
 {
     bool WantsToHandle(MessageBaseClass message);
 }

 class SomeMessageProcessor : IMessageProcessor { /* ...*/ }
 class OtherMessageProcessor : IMessageProcessor { /* ...*/ }

MessageBaseClassメッセージの「タイプ」に関する情報が含まれているはずです。もちろん、オブジェクトの実行時タイプを渡しobjectてフィルタリングすることもできますが、それは遅くなります。メッセージが届いたら、IMessageProcessor順番にそれぞれに提供します。

于 2012-04-06T16:19:33.300 に答える