学習のために、私はソケットベースのクライアント/サーバアプリケーションを書いています。私はパケットを正しく処理できるようにカスタムプロトコルを設計しました。今日のコードの一部を調べているうちに、自分のデータパケットを作成する私の方法には、多くの冗長なコードが含まれていることに気付きました。私はここでどのデザインパターンを使うべきですか
私はさまざまなタイプのパケットを持っています。 ImagePacket、MessagePacketなどがあります。すべての型の作成は小さなものでのみ異なり、たとえばヘッダと区切りの作成は同じです。これを改善する
、私はこのような溶液(簡体字)を思い付いた:
abstract class Packet
{
public Packet(object o)
{
MemoryStream memoryStream = new MemoryStream();
AddHeader(ref memoryStream);
AddData(ref memoryStream, obj);
AddDelimiter(ref memoryStream);
_packetBytes = memoryStream.ToArray();
memoryStream.Close();
}
protected abstract void AddData(ref MemoryStream ms, object obj);
はaddheaderとAddDelimiterを抽象的に定義されているのに対し、AddData関数メソッドが抽象メソッドとして実装され、具象クラスでオーバーライドされますクラスパケットそのもの。
これはうまく動作し、以前と同じくらい重複したコードはありませんが、 は、ImagePacketコンストラクタに文字列を渡してはいけないことを明確にしていないため、AddDataにオブジェクトを渡しています。
// correct
Packet myMsgPacket = new MessagePacket("hello world");
Packet myImagePacket = new ImagePacket(image);
// wrong, but will be compiled :(
Packet myChaosPacket = new ImagePacket("muaha you're doomed");
正しいデータ型が渡されているかどうかをチェックする必要があった場合は、もう一度たくさんの愚かなコードで終了します。 重複したコードを減らすことはできますが、上記の問題を解決するにはどうすればよいですか?
質問は、どのデータパラメータを使用できるかについてです。ユーザーは、Dataが文字列かイメージかを知りたいと思う。 –
おそらく私はもっとはっきりしていたはずですが、もちろん、それは可能です - 私は異なるデータ型とおそらくは文字列データのための追加の 'enum'型 – Basic