Если требования могут измениться в будущем, будет ли хорошей идеей вытащить бизнес-правила из кода в механизм пользовательских правил? - PullRequest
0 голосов
/ 22 января 2020

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

Подобный гипотетический пример

  • Если пользователь принадлежит Австралии и зарабатывает более 10 тыс. Долл., То показывает представление / факты XYZ
  • Если пользователь принадлежит США и зарабатывает меньше 5k $, тогда покажите AB C представление данных / фактов
  • ...
  • ...

Теперь мы можем либо,
сохраняя это сопоставление в пользовательской модели и имея эти бизнес-правила в коде
или
, мы можем вытащить эти правила в JSON или DSL, где мы можем просто изменить правило без необходимости развертывания кода для каждое отдельное изменение.

Мы не знаем, как часто будут изменяться эти правила.

Я прочитал аргументы за и против идеи создания собственного механизма мини-правил.

Аргументы для:

  1. Каждое небольшое изменение не требует развертывания
  2. Все правила, связанные с этой спецификацией c, находятся в одном месте (вероятно) упрощая получение обзора

Аргументы против:

  1. (статья Мартина Фаулера) Будет трудно рассуждать о вашем коде
  2. Anemi c Анти-шаблон модели данных
  3. Со временем будет трудно управлять этими правилами
  4. Конфликты между правилами или вероятность того, что некоторые факты не принадлежат ни одному из

Ответы [ 2 ]

2 голосов
/ 22 января 2020

В целом, это зависит от вашего варианта использования. Глядя на предоставленные вами примеры, это выглядит как превосходное применение механизма правил. Экстерьер этого логика c сделает приложение более декларативным, простым в обслуживании и быстрее доставит пользу вашим пользователям.

В вашем случае это ключевое утверждение:

Мы не знаем, как часто будут изменяться эти правила.

Это говорит о том, что вам действительно нужно экспортировать этот лог c либо в механизм правил, либо в DSL по вашему выбору. Если вы этого не сделаете, вы будете подписываться на развертывание нового кода каждый раз, когда эти правила меняются.

Ваши примеры написаны довольно классно c Примеры ProductionRules https://martinfowler.com/dslCatalog/productionRule.html https://en.wikipedia.org/wiki/Production_system_ (computer_science)

Есть много хороших доступны движки с открытым исходным кодом и коммерческими правилами. Я хотел бы рассмотреть их, прежде чем создавать пользовательские DSL. Логика c, которую вы написали, очень хорошо соответствует этим системам.

Некоторые технические недостатки механизмов правил и DSL:

  • Системы правил могут быть сложны для тестирования
  • Вы должны тщательно спроектировать входы и выходы для своих правил
  • Вам нужно будет понять, задокументировать и интегрировать другой инструмент или пользовательский анализатор DSL
  • Правила сборки другая ментальная модель, к которой привыкли некоторые разработчики, и может потребоваться время, чтобы сделать это хорошо
1 голос
/ 22 января 2020

Нет ничего плохого в том, что бизнес-логика c абстрактна. И декларативные правила кажутся подходящими в вашем сценарии. Нужно уметь извлекать отчет, читаемый человеком, с указанием бизнес-логики c, применяемых правил.

Таким образом, на первом этапе будут требования, которые вы хотели бы видеть в качестве продукта. Это может стать дополнительным кодом / моделированием без ущерба для существующей кодовой базы.

Не начинать с дикой природы: не искать библиотеку решений, когда проблема и решение неясны. Часто применяется «структура решения», и проблема моделируется после этого. С большим количеством кода котельной пластины и не совсем совпадающим с тем, что вы на самом деле хотели бы.

На этом этапе вы, вероятно, могли бы создать простой прототип механизма правил "сделай сам". Может быть, даже сделать быстрый и грубый прототип. Затем найдите существующие механизмы правил и создайте прототипы. Желательно не в вашем приложении, а с использованием Test-Driven-Development в юнит-тестах.

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

В заключение: это могло быть чем-то для разработки программного обеспечения форум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...