在条件中动态设置比较规则


Dynamically set comparison rules in a conditional?

我有三个用户可以配置的规则:

1-无论是否处于活动状态,如果它处于活动状态,我必须在条件中使用它。

2-用户可以将规则行为设置为"&&"或"或"。

3-最后,用户可以设置规则的值。

例如,设置此规则;

规则 1,活动:是,行为:或,值 15。

规则 2,主动:是,行为:或,值 35。

规则 3,主动:是,行为:或,值 55。

我必须建立一个有条件的喜欢这:

if($varX < 15 or $varY < 35 or $varZ < 55)
{
  .
  .
  .
}

我该如何完成呢?

不要尝试动态地"构建"这样的语句并执行它(这将是脆弱的(——而是单独找出表达式的结果,并通过和/或之后连接它们的值......

像这样的东西,(伪代码(

result = true;
if(rule_active) {
  if(rule_behavior is or) {
    result || (rule_var < rule_value);
  }
  else {
    result && (rule_var < rule_value);
  }
return result or do whatever with it …

(在这里将and换成&&or换成||,因为使用它们更常见;如果你愿意,你当然可以保留andor的位置,你只需要知道不同的运算符优先级。

当然,这可能仍然有问题,如果您不想简单地将一个规则的结果按照它们出现的顺序逐个连接到下一个规则,而且还要考虑到and在布尔逻辑中比or具有更高的优先级......但到目前为止,这不是你问题的一部分。
如果你也想考虑到这一点,那么你需要事先找出正确的"顺序"来进行检查和加入。(即便如此,结果可能也不是用户所想的 - 所以也许你需要找到一种方法让用户引入"括号"来分组构建规则集......?实际上取决于手头实际任务的复杂性。