Похоже, ваша проблема заключается в разрешении противоречивых правил.Когда несколько правил совпадают с вашими данными (ваш иностранец и пират) и они в конечном итоге рекомендуют разные вещи (ваш cangetjob и cangetevicted), вам нужна стратегия для разрешения этого конфликта.
ЧтоВы упомянули, что это один из способов решения проблемы, который заключается в устранении конфликта.Однако это не всегда возможно и не всегда желательно, потому что, когда пользователь добавляет новое правило, которое конфликтует с набором старых правил (которые он или она не написали), пользователь может не знать, как изменить его, чтобы удалитьконфликт.
Другим возможным методом разрешения является приоритезация .Отметьте приоритет для каждого правила (основываясь на таких вещах, как собственные полномочия пользователя и т. Д.), Отсортируйте соответствующие правила в соответствии с приоритетом и примените в порядке возрастания приоритета.Обычно это работает и намного проще в управлении (например, всем известно, что правила главного босса являются окончательными!)
Приоритизация также может использоваться для обозначения определенного правила как «глобального переопределения».В вашем примере вы можете сделать IsPirate правилом переопределения - это означает, что он переопределяет настройки для обычных людей.Другими словами, если ты пират, к тебе относятся по-другому.Это позволяет очень легко спроектировать систему, в которой у вас есть набор нормальных бизнес-правил, регулирующих 90% случаев, а затем набор «исключений», которые обрабатываются по-разному, автоматически переопределяя определенные вещи.В этом случае вам также следует подумать о том, чтобы сделать "?"также доступно в выходных столбцах.
Еще один возможный метод разрешения - включение атрибутов в каждое из ваших условий.Например, определенные условия не должны иметь «нулей» для прохождения (? Не имеет значения).Некоторые условия должны иметь хотя бы один «один», чтобы пройти.Другими словами, пометьте каждое условие как «И», «ИЛИ» или «XOR».Некоторые популярные системы защиты файлов используют эту модель.Например, CanGetJob может быть AND (вы хотите быть строгими в отношении прав на работу).CanBeEvicted может быть ИЛИ - вы можете захотеть выселить даже иностранца, если он также является пиратом.
Усовершенствование метода И / ИЛИ заключается в предоставлении порогового значения, которое общий результат должен превышать до выполнения этого условия.,Например, установив CanGetJob на порог 2, он должен получить по крайней мере две единицы, чтобы вернуть 1. Это иногда полезно при условиях, которые не совсем чётко черно-белые.
Вы можете смешивать разрешениеметоды: например, сначала расставьте приоритеты, затем используйте AND / OR для разрешения правил с аналогичными приоритетами.
Возможности безграничны и действительно зависят от ваших реальных потребностей.