Лучшие средства определения констант или именованных значений
Каков наилучший способ определения констант или именованных значений в InRule?
например, я не хочу кучу магических чисел (которые могут быть легко продублированы). Например "минимальный возраст". Я хотел бы определить именованную константу, которую я могу использовать как MinimumAge
вместо значения, как 21.
1 ответ
Есть несколько разных способов подойти к этому. Я опишу пару общих подходов, которые могут решить ваш вопрос.
С некоторой тщательностью проектирования вы можете использовать поля, инициализированные значениями по умолчанию, которые могут быть переопределены путем передачи (из вызывающего приложения) соответствующих данных конфигурации в механизм правил.
1. Вычисляемое или инициализированное поле сущности
Создайте вычисляемое поле на объекте, установив значение выражения в нужную константу. Это плохо масштабируется, так как добавляются дополнительные константы и реализуются дополнительные точки входа в корневой контекст.
Чтобы справиться с этим ростом сложности, существует ряд вариаций этого паттерна, которые смягчают вышеперечисленное, почти прямо из Рефакторинга Фаулера:
- Извлечь данные конфигурации в объект (параметр)
- Вместо использования вычисляемого поля напишите набор правил инициализации. Явный набор правил рекомендуется для точного контроля времени инициализации. В управляющем наборе правил добавьте действия Execute RuleSet, которые вызывают ваши правила инициализации. РЕДАКТИРОВАТЬ: исправленное руководство
2. Встроенная таблица данных
Создайте встроенную таблицу для хранения этих и других постоянных значений, используемых вашими правилами. Затем вы найдете соответствующее значение (см. Выше параграф о наборах правил инициализации, так как понятия применимы и здесь).
Правильно структурировав свои правила, вы можете перефразировать проблему из "Каков наилучший способ определения констант?" на "Как мне написать управляемое данными поведение в моих правилах?".
Обсуждение и принятие решения о том, где и кому будут принадлежать данные типа config/const, очень важно, и это как бизнес, так и архитектурное решение.
3. Определите шаблон словаря (применяется ко всем подходам)
Шаблон выражения, возвращающий нужную константу, может быть удобным способом, позволяющим пользователям писать правила, подобные следующим (константы выделены жирным шрифтом):
Если заявитель не достиг минимального возраста, установите базовый балл на минимальный базовый балл
Какой бы подход вы ни выбрали, во всех, кроме самых простых сценариев, вы должны рассмотреть возможность использования шаблонов Vocab для облегчения повторного использования и уменьшения трения для авторов правил. Vocab великолепен, потому что по сути это произвольно определяемая параметрическая функция многократного использования. Недостатком является то, что правила должны быть написаны на BL (Business Language), чтобы воспользоваться преимуществами шаблона Vocab.
Например, если вы решили использовать справочную таблицу для хранения констант, вы можете создать шаблон Expression, который вызывает GetMember
или же TableLookup
, Вместо того, чтобы заставлять пользователей писать одни и те же операторы поиска в таблицах повсеместно, вы объединили эту логику поиска в центральный оператор Vocab.