Нормально ли так хардкодить значения в хранимой функции/приложении?

Есть хранимая функция, которая принимает несколько аргументов. В ней есть примерно такое условие:

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 шт):

Автор решения: Roman Konoval

Я когда читаю этот код

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 есть константы). Так чтоб один раз определить и использовать везде.

Если хранить эти значения в таблице, то:

  1. это сбивает с толку, что и не константа это вовсе, а параметр конфигурации.
  2. чтоб прочитать их - нужен отдельный запрос, что и по производительности хуже и код усложняется без хорошей причины
→ Ссылка