Вопрос проверяет умение проектировать архитектуру движка правил для систем расчётов, что важно для разработки гибких бизнес-логик.
Движок правил — это компонент, который принимает набор условий и действий (правил) и выполняет их для входных данных. В системах расчётов (например, налоги, скидки, тарифы) бизнес-правила часто меняются, и их реализация в коде приводит к частым релизам и ошибкам. Движок правил позволяет вынести эти правила в отдельное хранилище и интерпретировать их в рантайме.
Существует несколько архитектурных решений. Первый — использование паттерна Strategy, где каждое правило — отдельный класс, а выбор правила происходит через фабрику. Второй — паттерн Interpreter, когда правила представлены в виде AST (абстрактного синтаксического дерева) и интерпретируются. Третий — использование готовых библиотек (например, Drools для Java, json-rules-engine для JavaScript), которые предоставляют DSL и оптимизацию.
Для простых систем достаточно хранить правила в JSON и выполнять их через цепочку условий. Для сложных — стоит рассмотреть компиляцию правил в байткод или использование графов зависимостей.
// Правило в JSON
const rule = {
conditions: { age: { greaterThan: 18 }, income: { greaterThan: 50000 } },
action: { discount: 0.1 }
};
// Простой движок
function evaluate(rule, data) {
const cond = rule.conditions;
if (data.age > cond.age.greaterThan && data.income > cond.income.greaterThan) {
return rule.action;
}
return null;
}
const result = evaluate(rule, { age: 25, income: 60000 });
console.log(result); // { discount: 0.1 }Движок правил стоит применять, когда бизнес-логика часто меняется и требует гибкости. Он снижает затраты на разработку и повышает надёжность, но добавляет сложность в инфраструктуру. Для небольших проектов достаточно простого интерпретатора, для крупных — используйте специализированные библиотеки или микросервисы.