2017-06-21 7 views
4

私は次のシナリオをどのように処理するのが最善かを考えようとしています。私は、メッセージを受信して​​処理し、応答をクライアントに返すサーバーを持っています。私はprocessingステップに、実行された処理の結果とオブジェクトに関する詳細情報を返すようにしたい場合があります。C#でステータスコードまたは複合オブジェクトを返す理想的な方法は何ですか?

私は、次のようなコードを持っている:私は何をしたいか

public void HandleMessage(Connection conn, Packet packet) { 
    var somedata = packet.Read(); 
    var result = Process(somedata); 

    if (result == typeof(Message)) 
     SendA(result); 

    if (result == typeof(MyObject)) 
     SendB(result, extraInfo); 
} 

public [what goes here] Process(object data) { 
    if (validated) 
     return data; 
    else 
     return Message.Failed; 
} 

は責任の分離を作成することです。

  • レシーバ:有意義なオブジェクト
  • プロセッサにデータを解析:解析されたデータに作用し、ステータスコードまたはオブジェクトを返します。
  • 送信者:プロセッサから返されたデータを解釈し、パケットを構成し、これをクライアントに送信します。

このようなことを達成するためにどのような設計を実装する必要がありますか?

+0

プロセスは何を返す必要がありますか?それは単なる失敗かデータかですか? –

+0

@EvanTrimboli列挙型またはデータのいずれかです。私は、データを必要としないクライアントに送る標準的なメッセージを表すためにenumを使用しています。 – Ci3

答えて

4

typeof()を使用して回避しis構文に向かってもっと傾く:

if (result is Message) 

私の提案は、状態のあなたのオブジェクトをラップ、またはすべて一緒の状態結果をスキップして、ちょうどあなたのpacket.Read()からインターフェイスを返すことです方法、直接インタフェースメソッドを呼び出す:

public StateResult 
{ 
    public StateResultEnum Result; 
    public IDataObject Data; 
} 

のIDataObjectはそれに含まれるデータに依存して変えることができるメソッドを公開なるインターフェイスであろう。例えば

public interface IDataObject 
{ 
    string GetData(); 
} 

public Message : IDataObject 
{ 
    public string Contents; 

    public Message(string contents) 
    { 
     Contents = contents; 
    } 
    public string GetData() 
    { 
     //Convert the string to json 
     return json; 
    } 
} 

public MyObject : IDataObject 
{ 
    public string Contents; 
    public string ExtraInfo; 

    public MyObject(string contents, string extraInfo) 
    { 
     Contents = contents; 
     ExtraInfo = extraInfo; 
    } 
    public string GetData() 
    { 
     //Convert the string to json (And include extraInfo) 
     return json; 
    } 
} 

ボトムライン:どこでもobject Sを使用しないでください。データを検証できる場合はValidate()というメソッドを公開するインターフェイスIValidatableを作成します。あなたの関数からIValidatableを返すとき、どちらのオブジェクトであるかは関係ありません(タイプMyObjectまたはMessageのいずれか)、それらはどちらもあなたのインターフェースで定義された検証のための手段を提供します。したがって、キャストなしでobj.ExtraInfoを実行できない場合は、obj.Validate()に電話することができます。

+0

ありがとう!これは私が探しているものです。 – Ci3

関連する問題