2009-04-04 4 views
4

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

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

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

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

ответ

3

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

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

1

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

0

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