Давайте возьмем другой пример, который менее чреват концепциями и ожиданиями. У меня есть перечисление здесь, и это набор приоритетов для ошибки.
Какую ценность вы храните в базе данных?
Таким образом, я мог бы хранить 'C'
, 'H'
, 'M'
и 'L'
в базе данных. Или 'HIGH'
и так далее. Это имеет проблему со строковыми данными. Существует известный набор допустимых значений, и если вы не сохраните этот набор в базе данных, с ним может быть сложно работать.
Почему вы храните данные в коде?
У вас есть List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
или что-то на этот счет в коде. Это означает, что у вас есть различные сопоставления этих данных в правильном формате (вы вставляете все заглавные буквы в базу данных, но отображаете их как Critical
). Ваш код теперь также трудно локализовать. Вы связали представление идеи в базе данных со строкой, которая хранится в коде.
Везде, где вам нужен доступ к этому списку, вам нужно иметь дублирование кода или класс с кучей констант. Ни один из которых не является хорошим вариантом. Не следует также забывать, что существуют другие приложения, которые могут использовать эти данные (которые могут быть написаны на других языках - в веб-приложении Java используется система отчетов Crystal Reports и пакетное задание Perl, передающее данные в него). Механизму создания отчетов потребуется знать действительный список данных (что произойдет, если в 'LOW'
приоритете ничего не отмечено и вам нужно знать, что это допустимый приоритет для отчета?), А пакетное задание будет содержать информацию о том, что является действительным значения есть.
Гипотетически, вы можете сказать: «Мы - магазин с одним языком - все написано на Java», и у вас есть один файл .jar, содержащий эту информацию, - но теперь это означает, что ваши приложения тесно связаны друг с другом, а этот файл .jar содержит данные. Вам нужно будет выпускать часть отчетов и пакетного обновления вместе с веб-приложением каждый раз, когда происходят изменения, и надеяться, что этот выпуск пройдет гладко для всех частей.
Что происходит, когда ваш начальник хочет другого приоритета?
Ваш босс пришел сегодня. Там новый приоритет - CEO
. Теперь вам нужно пойти и изменить весь код, а затем выполнить перекомпиляцию и повторное развертывание.
При использовании подхода enum-in-the-table вы обновляете список enum, чтобы иметь новый приоритет. Весь код, который получает список, извлекает его из базы данных.
Данные редко стоят отдельно
С приоритетами ключи данных в других таблицах, которые могут содержать информацию о рабочих процессах, или кто может установить этот приоритет или еще много чего.
Возвращаясь к полу, как упомянуто в вопросе, немного: у Пола есть ссылка на используемые местоимения: he/his/him
и she/hers/her
... и вы хотите избежать жесткого кодирования этого в самом коде. А потом приходит ваш босс, и вам нужно добавить, что у вас есть 'OTHER'
пол (чтобы все было просто), и вам нужно соотнести этот пол с they/their/them
... и ваш босс видит, что есть у Facebook и ... ну, да.
Ограничив себя битом данных со строковым типом, а не таблицей перечисления, теперь вам нужно было реплицировать эту строку в кучу других таблиц, чтобы поддерживать эту связь между данными и другими битами.
А как насчет других хранилищ данных?
Независимо от того, где вы храните это, тот же принцип существует.
- Вы можете иметь файл,
priorities.prop
который имеет список приоритетов. Вы читаете этот список из файла свойств.
У вас может быть база данных хранилища документов (например, CouchDB ), в которой есть запись для enums
(а затем написать функцию проверки в JavaScript ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
Вы можете получить XML-файл с небольшой схемой:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
Основная идея та же самая. В самом хранилище данных должен храниться и применяться список допустимых значений. Размещая это здесь, легче рассуждать о коде и данных. Вам не нужно беспокоиться о проверке того, что у вас есть каждый раз (верхний регистр или нижний? Почему chritical
в этом столбце есть тип? И т. Д.), Потому что вы знаете, что вы получаете из хранилища данных точно то, что хранилище данных ожидает от вас отправлять в противном случае - и вы можете запросить хранилище данных для получения списка допустимых значений.
Еда на вынос
Набор допустимых значений - это данные , а не код. Вам действительно нужно стремиться к СУХОМУ коду - но проблема дублирования заключается в том, что вы дублируете данные в коде, а не уважаете их место в качестве данных и сохраняете их в базе данных.
Это облегчает написание нескольких приложений для хранилища данных и позволяет избежать случаев, когда вам нужно будет развертывать все, что тесно связано с самими данными - потому что вы не связали свой код с данными.
Это облегчает тестирование приложений, потому что вам не нужно повторно тестировать все приложение при CEO
добавлении приоритета - потому что у вас нет кода, который заботится о фактическом значении приоритета.
Возможность рассуждать о коде и данных независимо друг от друга облегчает поиск и исправление ошибок при выполнении технического обслуживания.