У меня есть набор свойств объекта, значения которых в основном булевы, но они поступают из разных источников, причем разные источники перекрывают друг друга.
Например, чтобы решить, доступна ли функция X пользователю, у меня есть следующие источники информации:
- Значение по умолчанию для функции, например, «Функция X доступна по умолчанию»
- Тип учетной записи пользователя, например, «Функция X доступна для пользователей с типом учетной записи« Бизнес »»
- Страна, например, "Функция X недоступна в вашей стране"
- Переопределение для каждого пользователя, например, «Функция X доступна для этого пользователя, потому что он крут»
Для разных функций список источников, их порядок и их влияние по умолчанию отличаются, например, функция Y не может быть переопределена для отдельного пользователя, источник страны имеет приоритет.
Возможно, я слишком привязан к текущей реализации, которая выглядит следующим образом:
- Каждая функция идентифицируется константой в классе Feature.
- Существует массив с настройками по умолчанию (функция X -> недоступна по умолчанию).
- Существуют массивы для каждого типа учетной записи (бизнес-аккаунт: функция X -> доступна, функция Y -> ...)
- Существует длинная, длинная функция для всех других источников, с большим количеством
if
-внесением
- В конце (или может быть) безусловное переопределение для каждого пользователя
(select available from user_feature where user_id=1 and feature_id=X
).
Вопрос в том, как мне сделать это правильно, и есть ли для этого шаблон проектирования?
Или, может быть, я пытаюсь быть слишком общим, и YAGNI - это ответ?
То, что я представляю, может сработать:
- DSL для описания влияния источника на свойство, для выражения таких вещей, как «доступно для данного типа учетной записи» и «недоступно в этой стране»
- Упорядоченный список источников для каждого определенного свойства
- По умолчанию может быть просто другой источник
EDIT
Может быть, моя проблема в количестве различных свойств и источников. Возможно, мне нужна эффективная структура данных для хранения информации о свойствах, источниках данных, приоритетах / порядке расположения источников / переопределении для вычисления каждого свойства.