Java 如果将来需求会发生变化,那么将业务规则从代码中拉出来,放到自定义规则引擎中是一个好主意吗?
我们有这样一个要求,即用户需要根据一些约束条件呈现不同的事实 类似的假设例子Java 如果将来需求会发生变化,那么将业务规则从代码中拉出来,放到自定义规则引擎中是一个好主意吗?,java,oop,design-patterns,refactoring,rule-engine,Java,Oop,Design Patterns,Refactoring,Rule Engine,我们有这样一个要求,即用户需要根据一些约束条件呈现不同的事实 类似的假设例子 如果用户属于澳大利亚且收入超过10000美元,则显示数据/事实的XYZ视图 如果用户属于美国且收入低于5千美元,则显示ABC数据/事实视图 现在我们可以选择, 在用户模型中保留此映射,并在代码中包含这些业务规则 或 我们可以将这些规则拉到JSON或DSL中,在那里我们可以简单地更改规则,而不必为每一次更改部署代码 我们不知道这些规则会多久改变一次 我读过支持和反对自定义迷你规则引擎的观点 以下论点: 每一个小的
- 如果用户属于澳大利亚且收入超过10000美元,则显示数据/事实的XYZ视图
- 如果用户属于美国且收入低于5千美元,则显示ABC数据/事实视图
在用户模型中保留此映射,并在代码中包含这些业务规则
或
我们可以将这些规则拉到JSON或DSL中,在那里我们可以简单地更改规则,而不必为每一次更改部署代码 我们不知道这些规则会多久改变一次 我读过支持和反对自定义迷你规则引擎的观点 以下论点:
一般来说,这取决于您的用例。看看您提供的示例,它看起来像是规则引擎的一个优秀应用程序。通过外部化该逻辑,您将使您的应用程序更具声明性,更易于维护,并将更快地为用户提供价值 在您的情况下,这是关键声明: 我们不知道这些规则会多久改变一次 这表明您确实需要将该逻辑外部化到规则引擎或您选择的DSL中。如果您不这样做,您将在每次规则发生更改时注册以部署新代码 您编写的示例是ProductionRules的经典示例 有许多好的开源和商业规则引擎可用。在创建自定义DSL之前,我会考虑这些问题。您编写的逻辑与这些系统非常匹配 规则引擎和DSL的一些技术缺点是:
- 规则系统可能很难测试
- 您必须仔细设计规则的输入和输出
- 您需要理解、记录和集成另一个工具或自定义DSL解析器
- 构建规则是一种不同于某些开发人员习惯的思维模式,它可能需要时间才能做好
最后一句话:这可能是软件工程论坛的内容。我建议您等到知道需要更改值的频率后再进行更改。应该避免过早的优化。雅格尼:你不会需要的。事实上,您谈论的是需求变更,这说明现在不需要该功能。每次这些规则发生变更时,您都会注册部署新代码吗?现代应用程序经常一天部署几次。如果将来需要扩展,确保代码干净应该提供适当的钩子。确保每天多次部署大量应用程序,这是一个很好的实践。这是否意味着您的应用程序不可配置或扩展?或者声明性业务逻辑没有价值?快速部署的能力并不能成为糟糕设计的借口。在许多情况下(并非全部),将部署规则的能力交给业务用户是正确的方法。