Нормально ли так хардкодить значения в хранимой функции/приложении?
Есть хранимая функция, которая принимает несколько аргументов. В ней есть примерно такое условие:
IF argument_1 = 2 THEN
value_to_insert = 32;
ELSE
value_to_insert = 1;
END IF;
--insert (...,status_id) vaules (...,value_to_insert)
В зависимости от аргумента меняется значение для последующей вставки в таблицу.
Или например храдкод в хранимой функции на обновление статуса:
IF status_id_in = 9 THEN
--какие-то действия только в этом случаее
ENDIF;
--код
Или вот пример хардкода серверной части приложения:
if elem.ExpireAt.After(time.Now()){
UpdateStatus(elem.ID, 45)
return
}
value := someFunction()
if value > elem.X{
UpdateStatus(elem.ID, 32)
}else{
UpdateStatus(elem.ID, 31)
}
Мне кажется, что здесь правильно не ID статусов кидать, а уникальные имена, которые привязаны к нужному статусу (а потом, в хранимке брать ID по имени), но это же тоже храдкод?
Есть ли решения лучше, чем использовать не ID, а имена? Или это не хардкод и такая связность нормальная?
Ответы (1 шт):
Я когда читаю этот код
IF argument_1 = 2 THEN
value_to_insert = 32;
ELSE
value_to_insert = 1;
END IF;
--insert (...,status_id) vaules (...,value_to_insert)
то у меня сразу возникают вопросы в его правильности. Почему именно эти значения? Что за логика реализована? А правильна ли она? Глядя на прошитые константы это все непонятно.
Гораздо лучше так:
IF action = BUY_ACTION THEN
trade_status = BYING_STATUS;
ELSE
trade_status = SELLING_STATUS;
END IF;
--insert (...,status_id) vaules (...,trade_status)
Именно с этой точки зрения хардкод констант это плохо. Если это реально константа, то она должна быть выражена константой в языке, если есть поддержка в языке (не знаю как в других, это подскажут, вероятно, но в pgplsql есть константы). Так чтоб один раз определить и использовать везде.
Если хранить эти значения в таблице, то:
- это сбивает с толку, что и не константа это вовсе, а параметр конфигурации.
- чтоб прочитать их - нужен отдельный запрос, что и по производительности хуже и код усложняется без хорошей причины