Существует ли шаблон проектирования для свойств, поступающих из разных, противоречивых, приоритетных источников? - PullRequest
2 голосов
/ 09 сентября 2011

У меня есть набор свойств объекта, значения которых в основном булевы, но они поступают из разных источников, причем разные источники перекрывают друг друга.

Например, чтобы решить, доступна ли функция 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

Может быть, моя проблема в количестве различных свойств и источников. Возможно, мне нужна эффективная структура данных для хранения информации о свойствах, источниках данных, приоритетах / порядке расположения источников / переопределении для вычисления каждого свойства.

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

«Важность, затем вседозволенность»

Сначала назначьте каждому источнику важность. По умолчанию это НАИМЕНЬШЕ важно, так как оно всегда должно быть перезаписано.

Теперь, пытаясь определить разрешение, начните с самого важного источника и посмотрите, что он говорит. Продолжайте, пока не найдете источник, который сообщает вам, разрешено ли действие, и используйте его.

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

Я не знаю, является ли это паттерном, а не алгоритмом.

1 голос
/ 11 сентября 2011

Возможно, вы захотите взглянуть на шаблон спецификации , чтобы узнать о чистом способе обработки сложной системы правил.

Ваша идея определения DSL для правил также может быть хорошейодин со структурой, построенной DSL, являющейся составной спецификацией, как описано в образце.

...