Configuration 语言不可知规则规范

Configuration 语言不可知规则规范,configuration,cross-platform,rules,Configuration,Cross Platform,Rules,我当前项目中的一个要求是能够根据特定条件为客户机选择目标URL,这些条件可能有和/或运算符,也可能有嵌套条件。一个基本的虚构例子: if (device == 'android' || device == 'iOS') { if ( (flag1 == 'x' && productId == 'ABC123') || (flag1 == 'y' && productId == 'EFG345') ) { return url1; } }

我当前项目中的一个要求是能够根据特定条件为客户机选择目标URL,这些条件可能有和/或运算符,也可能有嵌套条件。一个基本的虚构例子:

if (device == 'android' || device == 'iOS') {
    if ( (flag1 == 'x' && productId == 'ABC123') || (flag1 == 'y' && productId == 'EFG345') ) {
      return url1;
    }
}
else if (device == 'mac' || device == 'windows') {
   ...
}
如果您正在构建此服务,那么这非常简单,但我们的挑战是,需要将此逻辑提供给我们的供应商,这些供应商负责我们客户群特定部分的URL选择,并且他们都使用不同的实现语言—Java、Go Lang、Python,您可以随意选择

问题是,假设已经填充了诸如device、flag1、productId等变量,是否有一种与语言无关的方式来指定这些规则,比如在JSON中

我看了看:

我喜欢这样的建议,比如:

["AND",
    {"var1" : "value1"},
    ["OR",
        { "var2" : "value2" },
        { "var3" : "value3" }
    ]
]
但是我没有看到任何标准的解析器能够读取这个JSON并将规则应用到所选择的特定语言中。是否有任何标准解决方案可以帮助满足这一需求,而不需要多个容易出错的自定义解析器和实现


附言:我们可以让我们的每个供应商为这个选择逻辑编写他们自己的代码片段,但挑战是规则可能会经常更改,我们不想等待几家不同的公司在每次更改规则时对其系统进行代码更改。我们还考虑编写一个服务,让供应商给我们打电话,这样就可以集中访问这些规则,但这意味着需要额外的网络调用(或者让供应商维护缓存并不断轮询我们的服务)。此外,并非所有供应商都愿意在选择URL时调用服务。

我创建了一个JSON模式来描述您的逻辑类型:

{
“id”:”http://json-schema.org/geo",
“$schema”:”http://json-schema.org/draft-06/schema#",
“描述”:“与语言无关的逻辑表示”,
“$ref”:“#/定义/术语”,
“定义”:{
“期限”:{
“类型”:“对象”,
“附加属性”:false,
“说明”:“逻辑值”,
“财产”:{
“种类”:{“$ref”:“#/definitions/kind”},
“x”:{“$ref”:“#/definitions/Term”},
“y”:{“$ref”:“#/definitions/Term”},
“value”:{“$ref”:“#/definitions/value”}
},
“必需”:[“种类”],
“标题”:“术语”
},
“价值”:{
“类型”:“对象”,
“附加属性”:false,
“说明”:“关键值术语”,
“财产”:{
“键”:{“类型”:“字符串”},
“值”:{“类型”:“字符串”}
},
“必需”:[“键”、“值”],
“标题”:“术语”
},
“善良”:{
“描述”:“术语类型”,
“类型”:“字符串”,
“枚举”:[“和”、“或”、“不”、“值”],
“头衔”:“种类”
}
}
}
下面是一个符合模式的数据示例(请注意,我对它的结构化比您的示例稍微有规律):

{
“种类”:“和”,
“x”:{
“种类”:“价值”,
“值”:{“键”:“var1”,“值”:“value1”}
},
“y”:{
“种类”:“或”,
“x”:{
“种类”:“价值”,
“value”:{“key”:“var2”,“value”:“value2”}
},
“y”:{
“种类”:“价值”,
“value”:{“key”:“var3”,“value”:“value3”}
}
}
}
(我认为您可以使用模式来获得更简洁和/或更安全的内容)

我曾经在C++、GO、SWIFT、Objul-C、java、CysAcript、JavaScript等中生成类型和JSON封送处理代码。例如,以下是表示和解析说明:

//要解析JSON,请将此文件添加到项目中,然后执行以下操作:
//
//让我们试试?JSONDecoder().decode(Term.self,from:jsonData)
进口基金会
///逻辑值
类别术语:可编码{
让善良:善良
让x,y:术语?
让值:TermValue?
}
///这类术语
枚举类型:字符串,可编码{
case and=“and”
case not=“not”
case or=“或”
case value=“value”
}
///键值项
结构TermValue:可编码{
let键,值:String
}
下面是Go的实现:

//若要解析和解析此JSON数据,请将此代码添加到项目中,然后执行以下操作:
//
//术语,错误:=解组术语(字节)
//字节,err=term.Marshal()
包干管
导入“encoding/json”
func解组术语(数据[]字节)(术语,错误){
var r项
err:=json.Unmarshal(数据,&r)
返回r,err
}
func(r*Term)封送处理()([]字节,错误){
返回json.Marshal(r)
}
//逻辑值
类型术语结构{
Kind`json:“Kind”`
术语“json:”X“`
Y*术语`json:`Y`
Value*TermValue`json:“值”`
}
//键值项
类型TermValue结构{
Key字符串`json:'Key'`
值字符串`json:“值”`
}
//这类术语
类型类型字符串
常数(
和Kind=“和”
Not Kind=“Not”
或Kind=“或”
Value-Kind=“Value”
)

转到以使用模式并生成各种语言的代码。但是,您仍然需要在每种语言中定义求值函数。

没错,除了您选择的语言中的一部分,没有其他标准解析器。但在大多数语言中解析JSON都很简单,评估条件树也是如此。如果你想要一个标准的解析器,你必须创建它。谢谢。挑战在于,如果我们为条件树评估构建一个自定义解析器,那么我们的每个供应商都需要这样做,而且很快就会变成一场维护噩梦:)您的供应商可能不太愿意联系服务,但他们可能更不愿意为无法控制的数据格式实现自己的解析器。如果您坚持以非标准格式处理数据(让我们在这里明确一点:任何数据格式的逻辑都将是非标准的),那么您最好愿意为它们编写解析器库。否则,请提供一个接受任何请求的URL,并