メッセージをあるフォーマットから別のフォーマットに変換するプロジェクトがあります。 メッセージはIDで識別されます。私は1つのフォーマットのIDと他のフォーマットの対応するIDを持つMappingTableを持っています。例えば多くのマジックナンバー
:このメソッドは、マッピングリストにマッピングエントリを追加します
this.AddMappingEntry(2400, 2005, true, false);
: 2000 = 153
IDは整数
私は経由でこれらすべてのentrysを追加します。私は値が2400のメッセージを受け取った場合、正しいマッピングを見つけるためにlinqでリストをフィルタリングできます。
プロジェクトが開始されて以来、多くのリファクタリングと多くのIDにつながるかなり成長しています特別な行動。私は、メッセージが特別なタイプのものであるかどうかを制御しなければならない。
if(message.id == 153)
{
//special behavior
}
これはどのように処理すればよいですか? メッセージの種類を表す定数を使用するか、もう少し上手くいく方法がありますか?
EDIT:
私は質問を言い替えます。 私はヘッドレコードとサブレコードを持っています。しかし、これらの記録のIDはコード全体で使用されています。約200の異なるIDがあるので、私はそれらの魔法の数字で何をすべきか考えていました。私が書いているツールはコンバータです。次のように
構造である
は、コンバータクラスはおおよそこの
+------------+
|BaseClass |
+-----+------+
^
|
+-----+------+
|BaseRecord +^-------------+----------------------+
+------+-----+ | |
^ | |
| | |
+------+-----+ +-------+--------+ +-------+--------+
| HeadRecord | | RecordType1 | | RecordType2 |
+------------+ +----------------+ +----------------+
ように見えるBaseRecordは基底クラスを拡張し、他のすべてのクラスはBaseRecordを拡張します。全体では、私はrecordId 1-5で5つのレコードタイプを持っています。 このレコードの中には、いくつかのsubrecordId(〜50)があります。これらは、書き込みプロセスの後で、それぞれライターの背後にあるレコードを識別するためにのみ使用されます。
問題は、いくつかのレコードが異なるフィールドからいくつかの値を読み取ってから、レコードを識別する必要のある特殊なケースにつながるレコードがあることです。
これは問題につながる: 私は私のクラスとコンバータでそれらを使用する場合、私は、誰も彼らが何であるかを知らない多くのマジックナンバーを持っています。どのようにそれらの魔法の数字を避けるのですか?私はそれらを使用する場合、私のクラスは50 + constの値でいっぱいであると私は残念です。マジックナンバーや大量のconst値を避ける方法はありますか?これに対して正しいリファクタリングは何ですか?
あなたのケースでは、 '2000 = 0153'は0153ですvarcharまたは整数.. Ifステートメントを使用する代わりに、ケースステートメントについて考えましたか?また、もしあなたがそれを期待しているなら、私は個人的に先行ゼロを使用しません。 '153'は正しい整数表現を使用しません。これはvarcharではなくswitch文を使っても訂正可能です。 – MethodMan
これはスイッチの場合とそうでない場合です。私は頭やサブレコードを扱ういくつかのクラスを持っています。 ifsはサブレコードなどで扱われます。 – Bongo
あなたの質問を正しく理解すれば、あなたは 'enum'を使いたいと思うように思えます - それはあなたが魔法の数字の代わりに意味のある名前を使うことを可能にします。 –