C++ 03で、異なるソースからのさまざまな種類のメッセージを管理する必要があるシステムを設計する必要があるとします。オーバーライドされたメソッドで別の列挙型を返す
すべてのメッセージには、IDであるを表す数字が共通してメッセージに含まれるデータのを表します。
したがって、IDはソースに関連し、異なるソースは他のソースの共通IDを持つことができます。 SourceAおよびSourceBは、メッセージ内のデータの意味がまったく違うにもかかわらず、IDが1に設定されたメッセージを送信できます。
だから、メッセージを表す基底クラスには、次のように宣言することができます
enum SourceType {
SourceA,
SourceB,
// ...
};
struct Message {
virtual int getID();
virtual SourceType getSource();
// ...
};
私は自分のコードの周りマジックナンバーを広めるために避けたいので、私はいくつかのより有意義にint
を交換したいと思いますenum
ですが、各ソースは独自の異なる列挙型を持つことができません。
によって返された情報を使用して、を適切なenum
にキャストしている可能性がありますが、非常に完璧なデザインのようです。そう
enum MessageID {
SourceA_ID1,
SourceA_ID2,
SourceB_ID1,
SourceB_ID2,
// ...
};
そして:
別の解決策は次のように、(それはエラーではありません)値の重複の多くを持つすべてのソースのためにすべての可能なIDで大きな列挙型を定義することができgetID
メッセージはMessageID
を返す可能性がありますが、これはMessageIDのサイズが爆発的になり、維持管理や文書化が少し面倒かもしれないことを意味します。
したがって、ディスパッチャは 'SourceType'とメッセージIDを使って正しいペイロードタイプをインスタンス化しますか?あなたのデザインを完全に理解しているかどうかはわかりません。メッセージIDを使用したこのような遅延解析は、GoogleプロトコルバッファBTWなどのシステムによって既に実装されています。 –
基本的には、さまざまなソースからのさまざまなメッセージを管理するシステムを構築することです。各ソースは異なる言語を使用するため、解析はカップル(ソース、メッセージID)によって異なります。厳しい制限のある古い組み込みシステム(PowerPC)を使用しているので、サードパーティライブラリを使用することはできません。 –
なぜ 'pair'(または利用可能な場合は' tuple')を返しますか? 1つのコンポーネントはソースの数値IDであり、もう1つはメッセージの数値IDです。この方法では、ペアを受け取るソフトウェアは、最初のコンポーネントを独自のID値にマッチさせてそこから対応する 'enum 'にキャストする方法だけを知っていなければなりません。 –