У меня есть проект, в котором я преобразовываю сообщения из одного формата в другой. Сообщения идентифицируются идентификатором. У меня есть MappingTable с идентификатором в одном формате и соответствующим идентификатором в другом формате.
Например: 2000 = 153
Идентификаторы являются целыми числами
Я добавляю все эти записи через:
this.AddMappingEntry(2400, 2005, true, false);
Этот метод добавляет запись сопоставления в список сопоставления. Я могу отфильтровать список через linq, чтобы найти правильное сопоставление, если я получу сообщение со значением 2400.
С тех пор, как проект запущен, он довольно сильно вырос, что привело к множеству рефакторингов и появлению множества идентификаторов с особым поведением. Я должен контролировать, относится ли сообщение к особому типу.
if(message.id == 153)
{
//special behavior
}
Как мне справиться с этим самым элегантным? Должен ли я использовать много констант, описывающих тип сообщения, или есть другой более элегантный способ?
ИЗМЕНИТЬ:
Я переформулирую вопрос. У меня есть главные записи и вспомогательные записи. Но идентификаторы этих записей используются во всем Кодексе. Поскольку существует около 200 различных идентификаторов, мне было интересно, что мне делать с этими магическими числами. Инструмент, который я пишу, это конвертер.
Структура выглядит следующим образом
+------+ +-------------+ +---------+
| DAL +-------> | CONVERTER +----> | WRITER |
+------+ +-------------+ +---------+
Классы Converter выглядят примерно так
+------------+
|BaseClass |
+-----+------+
^
|
+-----+------+
|BaseRecord +^-------------+----------------------+
+------+-----+ | |
^ | |
| | |
+------+-----+ +-------+--------+ +-------+--------+
| HeadRecord | | RecordType1 | | RecordType2 |
+------------+ +----------------+ +----------------+
BaseRecord расширяет Baseclass, а все остальные классы расширяют BaseRecord. Всего у меня есть 5 типов записей с идентификатором записи 1-5. Внутри этой записи есть несколько subrecordId (~ 50), которые используются только для идентификации записей, стоящих за автором, соответственно, после процесса записи.
Проблема в том, что некоторые записи считывают одни значения из разных полей, чем другие, что приводит к некоторым особым случаям, когда мне нужно идентифицировать запись.
Это приводит к проблеме: у меня есть много магических чисел, о которых никто не знает, для чего они нужны, если я использую их в своих классах и конвертере. Как мне избежать этих магических чисел? Я боюсь, что мои классы заполнены значениями 50+ const, если я их использую. Есть ли способ избежать магических чисел и большого количества константных значений? Каков правильный рефакторинг для этого?
2000 = 0153
равно 0153 varchar или целому числу.. вместо использования оператора If вы подумали об операторе case, и я лично не стал бы использовать начальные нули, если вы ожидаете, что это будет153
, тогда используйте правильное целочисленное представление, а не varchar это также можно исправить с помощью оператора switch - person MethodMan   schedule 17.10.2016enum
, что позволит вам использовать осмысленные имена вместо магических чисел. - person Pieter Witvoet   schedule 19.10.2016enum
? - person Pieter Witvoet   schedule 20.10.2016