Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果将来需求会发生变化,那么将业务规则从代码中拉出来,放到自定义规则引擎中是一个好主意吗?_Java_Oop_Design Patterns_Refactoring_Rule Engine - Fatal编程技术网

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中,在那里我们可以简单地更改规则,而不必为每一次更改部署代码

我们不知道这些规则会多久改变一次

我读过支持和反对自定义迷你规则引擎的观点

以下论点:

  • 每一个小的改变都不需要部署
  • 与此特定功能相关的所有规则都位于一个位置(可能),因此更容易获得概述
  • 反对:

  • (Martin Fowler文章)很难对代码进行推理
  • 贫血数据模型反模式
  • 随着时间的推移,将很难管理这些规则
  • 规则之间的冲突或某些事实不属于任何一方的可能性

  • 一般来说,这取决于您的用例。看看您提供的示例,它看起来像是规则引擎的一个优秀应用程序。通过外部化该逻辑,您将使您的应用程序更具声明性,更易于维护,并将更快地为用户提供价值

    在您的情况下,这是关键声明:

    我们不知道这些规则会多久改变一次

    这表明您确实需要将该逻辑外部化到规则引擎或您选择的DSL中。如果您不这样做,您将在每次规则发生更改时注册以部署新代码

    您编写的示例是ProductionRules的经典示例

    有许多好的开源和商业规则引擎可用。在创建自定义DSL之前,我会考虑这些问题。您编写的逻辑与这些系统非常匹配

    规则引擎和DSL的一些技术缺点是:

    • 规则系统可能很难测试
    • 您必须仔细设计规则的输入和输出
    • 您需要理解、记录和集成另一个工具或自定义DSL解析器
    • 构建规则是一种不同于某些开发人员习惯的思维模式,它可能需要时间才能做好

    抽象业务逻辑没有错。声明性规则似乎适合您的场景。人们应该能够提取一个可读的报告,显示业务逻辑和应用的规则

    所以第一个阶段是需求,你想要什么样的产品。 这可以成为额外的代码/建模,而不会妨碍现有的代码库

    不要从野外开始:当问题和解决方案不清楚时,不要搜索解决方案库。通常会应用“解决方案框架”,然后对问题进行建模。有很多锅炉铭牌代码,但并不完全符合您的实际需求

    在这个阶段,您可能可以制作一个简单的自己动手规则引擎原型。甚至可以制作一个快速而粗糙的原型。然后寻找现有的规则引擎,并制作原型。最好不要在您的应用程序上,而是在单元测试中使用测试驱动开发

    一个坏主意是立即将规则定义维护留给最终管理员用户。这样的功能会产生影响:缺少测试阶段、生产系统的工作、版本控制、最终用户的技术资格,如“大图”


    最后一句话:这可能是软件工程论坛的内容。

    我建议您等到知道需要更改值的频率后再进行更改。应该避免过早的优化。雅格尼:你不会需要的。事实上,您谈论的是需求变更,这说明现在不需要该功能。每次这些规则发生变更时,您都会注册部署新代码吗?现代应用程序经常一天部署几次。如果将来需要扩展,确保代码干净应该提供适当的钩子。确保每天多次部署大量应用程序,这是一个很好的实践。这是否意味着您的应用程序不可配置或扩展?或者声明性业务逻辑没有价值?快速部署的能力并不能成为糟糕设计的借口。在许多情况下(并非全部),将部署规则的能力交给业务用户是正确的方法。