我想允许用户定义简单业务逻辑,如:如何将业务逻辑存储到数据库中?
if (x and y) then ...
if (z or w) then ...
让我把它具体:
我开发,如果申请人满足一定的要求,回答一个HR模块,由用户定义。
这些要求可以围绕逻辑运算符来定义:
(必须是18岁)或(18岁和必须有家长许可)
是把这个数据库里面的逻辑好吗?我认为是这样,但我害怕花时间在这件事上,并发现它是一种糟糕的做法。
我想允许用户定义简单业务逻辑,如:如何将业务逻辑存储到数据库中?
if (x and y) then ...
if (z or w) then ...
让我把它具体:
我开发,如果申请人满足一定的要求,回答一个HR模块,由用户定义。
这些要求可以围绕逻辑运算符来定义:
(必须是18岁)或(18岁和必须有家长许可)
是把这个数据库里面的逻辑好吗?我认为是这样,但我害怕花时间在这件事上,并发现它是一种糟糕的做法。
经常这样,答案是“它依赖于”;)由于在这种情况下,逻辑似乎是用户定义的数据,因此将其放入数据库是绝对合理的。
但是,如果你正在寻找此输入的结构/ AST与他们and
和or
控制流模型为单独的业务对象反映数据库中的记录,我不得不说,这很可能矫枉过正和意志 - 除了最初的实现开销 - 使未来的重构非常困难。
将在运行时评估的简单文本字段是最简单的方法,因为其内容可以很容易地提取和推理。
不知道你的权威要求,我建议你看看Drools,一个Java的规则引擎,它的生态系统中还有一个规则存储后端和指导编辑器。顺便提一下,你的问题中的例子看起来很像它可能受益于规则引擎,但不幸的是,我没有任何相关Ruby库的实际经验。
否则这篇关于thougtbot博客的文章 - Writing a Domain Specific Language in Ruby - 也可能对此有帮助。
我绝对认为没关系。由于用户正在定义业务逻辑或规则,因此我建议将业务逻辑表单字段拆分为多个部分(规则:if/unless,操作数1:user.age,操作数2:权限。父级操作员1:和操作员2:更高级_ .. ),然后将每个业务逻辑对象作为行存储在序列化的JSON列中。与用户输入任何他们喜欢的单个文本字段相比,这应该使他们更容易验证并且更不容易出错。
我会建议创建一个简单的表来存储逻辑,如果它是可预测的。
例如:
Table: business_logics
Attributes:
opt_1: decimal
opt_2: decimal
logic_opt: integer (enum: and|or)
then_statement: string
所以这是可扩展的,当你有一天在更logic_opt
,顺便说一句,你可以得到的好处的验证&重构以后!允许用户输入自由文本在您的案例中风险很大!
没关系。这是一种灵活的方法,虽然在开发过程中很耗时。此外,您不必创建自己的DSL,它已经完成,例如, json-logic-ruby允许在json中保留复杂的规则。