今天我面临一个有趣的挑战,我希望您能就如何处理这种情况提出意见。
所以问题如下(我已将其转换为演示数据,因为如果不熟记公司字典,真正的问题就没有多大意义)。
我们有一个至少包含 16 个条件的决策表。因为管理所有这些(2^16 种可能性)是一项不可能的任务,我们决定只列出例外情况。像这样:
作为一个例子,我只添加了 10 个条件,但实际上(目前)有 16 个。基本思想是我们有一个基线(默认值),它对每个人和该默认值的所有例外都有效。
Example:
You have a foreigner who is also a pirate.
If you go through all the exceptions one by one, and condition by condition you remove the exceptions that have at least one condition that fails. In the end you'll end up with the following two exceptions that are valid for our case. The match is on the IsPirate and the IsForeigner condition. But as you can see there are 2 results here, well 3 actually if you count the default.
我们的解决方案
现在我们想出如何解决这个问题,在添加这些异常的 GUI 中,应该运行一个算法来检查此类情况并强制您更具体地定义异常。这仍然只是一个理论,尚未经过测试,但我们认为它可以这样工作。
我的问题
我正在寻找替代解决方案,使规则易于管理并防止出现示例中所示的问题。
您的问题似乎是解决冲突的规则。当多个规则与您的输入(您的外国人和海盗)匹配并且它们最终推荐不同的事物(您的 cangetjob 和 cangetevicted)时,您需要一个策略解决这场冲突。
你提到的是一种解决办法,就是首先消除冲突。然而,这可能并不总是可能的,并且并不总是可取的,因为当用户添加与一组旧规则(他/她没有编写)冲突的新规则时,用户可能不知道如何修改它以删除冲突。
另一种可能的解决方法是优先顺序。为每个规则标记一个优先级(基于用户自身的权限等),按照优先级对匹配的规则进行排序,并按照优先级升序应用。这通常有效并且更易于管理(例如,每个人都知道最高老板的规则是最终的!)
优先级还可用于将特定规则标记为“全局覆盖”。在您的示例中,您可能希望将“IsPirate”设置为覆盖规则 - 这意味着它会覆盖普通人的设置。换句话说,一旦你成为海盗,你就会受到不同的对待。这使得设计一个系统变得非常容易,其中有一堆正常的业务规则管理 90% 的情况,然后是一组以不同方式处理的“异常”,自动覆盖某些事情。在这种情况下,您还应该考虑制作“?”也可在输出列中使用。
另一种可能的解决方法是在每个条件中包含属性。例如,某些条件必须没有“零”才能通过(?无关紧要)。有些条件必须至少有一个“一”才能通过。换句话说,将每个条件标记为“AND”、“OR”或“XOR”。一些流行的文件系统安全性使用这种模型。例如,CanGetJob 可能是 AND(您希望严格遵守工作权利)。 CanBeEvicted 可能是 OR——如果外国人也是海盗,您甚至可能想驱逐他。
AND/OR 方法的一项增强功能是提供一个阈值,在通过该条件之前总结果必须超过该阈值。例如,将 CanGetJob 设置为阈值 2,则它必须至少获得两个 1 才能返回 1。这有时在非明显黑白的情况下很有用。
您可以混合解决方法:例如首先确定优先级,然后使用 AND/OR 来解决具有相似优先级的规则。
可能性是无限的,实际上取决于您的实际需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)