假设我们有这样的表达式:
(Rule1 && Rule2 && Rule3)
其中
Rule1
、Rule2
和 Rule3
是返回 true 或 false 的 REST
调用。
我想根据表达式优化 REST 调用。 在引用的示例中,如果其中一条规则违反,则无需评估其他规则。
如果出现
(Rule1 || Rule2 || Rule3)
我想立即解雇所有人员,或者尝试获得第一个正确的结果,然后忽略其他的。
这就是编译器评估布尔表达式的方式。如果我必须用 Java 或任何现代编程语言来实现这一点,我们是否有任何标准算法?
大多数现代语言支持短路求值,仅当第一个参数不能确定整个表达式时才求值第二个参数。因此,在
(Rule1 && Rule2 && Rule3)
中,如果 Rule1 为 false,则不会评估 Rule2。同样在 (Rule1 ||Rule2 || Rule3)
如果规则 1 为 true,则不会评估规则 2。
确定“第一个参数”的约定是从左到右。这是因为大多数现代编程语言仍然遵循西方的书写规则。因此,最大限度地减少浪费周期的“算法”是:
我们如何确定哪个论点最有可能是错误的?根据我们掌握的有关系统的信息,使用我们的技能和判断。或者猜测我们是否没有足够的信息。这可能是一个容易出现过早优化的领域。
最后,解决这个问题:
如果有像
这样的复杂表达式,这里我会先评估Rule4(Rule1 && (Rule2 || Rule3))&&Rule4
您需要将表达式写为
(Rule4 && Rule1 && (Rule2 || Rule3))