Шаблоны проектирования кода состояния - PullRequest
4 голосов
/ 04 апреля 2009

Скажем, у вас есть объект 'post' в типичном сценарии блога. Сообщение в блоге может иметь различные статусы, такие как «черновик», «опубликован», «утвержден» и т. Д. Каковы наилучшие способы справиться с этим, особенно в отношении хранения этих данных в базе данных осмысленным образом, а также осмысленным образом в коде.

Обычно я видел их в виде целого числа, связанного со строкой в ​​базе данных (в этом примере таблицы 'posts'). Иногда в базе данных есть таблица поиска для объяснения этих статусов (то есть таблица состояния с id => 1 name => draft и т. Д.). Обычно я бы перевел их в перечисление на уровне доступа к данным, чтобы иметь более содержательное представление кода и избежать «магических чисел».

Однако в этом решении разработчик обновляет два разных места (базу данных и код), чтобы добавить или изменить тип статуса.

Какой лучший способ сделать это? Кажется, это проблема, с которой я часто сталкивался, но я никогда не видел хорошего способа справиться с этим.

Ответы [ 3 ]

3 голосов
/ 05 апреля 2009

Мне нравится устанавливать status_id и создавать справочную таблицу со статусами в ней и соответствующим перечислением, как вы предложили.

Если мои статусы по существу неизменны (например, состояние записи в блоге, состояние заказа и т. Д.), Я создам модульный тест, который определяет, соответствует ли число используемых мной перечислений данным в таблице поиска - так если в будущем кто-то добавит статус в базу данных, он провалит тест, сообщив разработчику добавить в перечисление.

1 голос
/ 05 апреля 2009

IMO, они должны быть только в одном месте, если вы отображаете черновик в enum DRAFT в коде, что, вероятно, означает, что вы добавляете поведение в черновик в коде, например, если черновик можно редактировать, например, и принимать решения на основе тот . Мой подход здесь состоит в том, чтобы переместить поведение в базу данных и добавить столбец в db для этого поведения (например, логический столбец, чтобы сказать, можно ли его редактировать) и сопоставить его с классом состояния вместо перечисления. Поэтому, если вводится новый статус, его можно просто добавить в БД с соответствующим поведением.

0 голосов
/ 05 апреля 2009

Я согласен с ответом Джона Раша, но вас может заинтересовать пост Codeproject , в котором говорится о динамической генерации перечислений

...