我想允许用户定义简单业务逻辑,例如:
if (x and y) then ...
if (z or w) then ...
让我具体说明一下:
我正在开发一个人力资源模块,可以解答申请人是否满足某些要求,并由用户定义。
可以围绕逻辑运算符定义这些要求:
(必须年满18岁)或(未满18岁且必须获得家长许可)
将这种逻辑放入数据库中吗?我认为是这样,但我害怕花时间在这上面,并发现这是一种糟糕的做法。
答案 0 :(得分:1)
通常,答案是"它取决于" ;)由于这种情况下的逻辑似乎是用户定义的数据,因此将其放入数据库是绝对合理的。
但是,如果您希望将此输入的结构/ AST建模为单独的业务对象,并将其and
和or
控制流反映在数据库记录中,我将不得不说它&# 39;很可能是过度杀戮,并且除了最初的实施开销之外,还会使未来的重构变得非常困难。
将在运行时评估的简单文本字段是最简单的方法,因为它的内容可以非常容易地提取和推理。
不知道您的明确要求,我建议您查看Drools,这是Java的规则引擎,在其生态系统中也有规则存储后端和指导编辑器。顺便提一下,你的问题中的例子看起来很像它可能从规则引擎中受益,但不幸的是我没有任何相关Ruby库的实际经验。
否则,thougtbot博客上的这篇文章 - Writing a Domain Specific Language in Ruby - 在这种情况下也可能会有所帮助。
答案 1 :(得分:1)
没关系。这是一种灵活的方法,虽然在开发过程中耗费时间。
此外,您不必创建自己的DSL,它已经完成,例如json-logic-ruby允许在json中保留复杂的规则。
答案 2 :(得分:0)
我绝对认为没关系。因为用户正在定义业务逻辑或规则,所以我建议将业务逻辑表单字段拆分为多个部分(规则:if / unless,operand1:user.age,operand2:permissions.parental operator1:and,operator2:greater_than ...)然后将每个业务逻辑对象作为一行存储在序列化的JSON列中。与用户输入他们喜欢的任何内容的单个文本字段相比,这应该使它们更容易验证并且更不容易出错。
答案 3 :(得分:0)
我建议创建一个简单的表来存储逻辑,如果它是可预测的。
例如:
read.csv(text=sub("\\s+", ",", crime$Date.Rept), header=FALSE,
col.names = c("Date", "Time"), stringsAsFactors=FALSE)
# Date Time
#1 12/1/2016
#2 12/1/2013 12:07 AM
#3 12/1/2016 7:76 AM
#4 12/1/2016 11:54 AM
#5 12/2/2016 1:34 PM
所以当你在某一天有更多Table: business_logics
Attributes:
opt_1: decimal
opt_2: decimal
logic_opt: integer (enum: and|or)
then_statement: string
时,这是可扩展的,顺便说一句,你可以在验证中获得优势。稍后重构!允许用户输入自由文本在您的情况下风险很大!