创建一个域,其中单个标签映射到多个值

Creating a domain where a single label maps to multiple values

我的输入数据具有多个值可以引用单个业务友好语言化(域标签)的属性。我试图弄清楚如何在 Rule Designer 中表示这一点。我是 ODM 的新手,仍在学习中——目前使用 ODM 8.8.1(分布式/Java)。

想象一下将邮政编码前缀映射到他们所在的州。例如,以 967 和 968 开头的邮政编码是夏威夷。简而言之,我想将规则表达为 "if the ZIP code prefix is Hawaii..." 而不是与 967 和 968 的比较。在领域术语中,967 和 968 是真正的底层属性值,而 Hawaii 是语言化标签。但显然 BOM-to-XOM 需要一个 return,随意选择 967 或 968 是不正确的。

我的实际情况要复杂得多,涉及用户永远不会知道或识别的一长串神秘代码值,但概念是相同的。在某些情况下,一个标签可以映射到 15 或 20 个基础值。

ODM 域可以吗? (我很确定它可以通过决定 table 在另一边完成,但我现在真的想把它作为一个域问题来解决。)

这里最好的方法是创建一个 XOM 或 BOM class 以将状态映射到前缀,然后用您想要的语言表达来包装它。我将用一个将邮政编码映射到各州的示例来说明。

示例:

  1. 使用您的状态设置枚举或域:

public enum States
{
 AL,
 AK,
 AZ
  // etc
 }

  1. 为您的邮政编码制作一个 class:

public class Zipcode
{
 private String zipcode;

 public String getZipcode()
 {
  return zipcode;
 }

 public void setZipcode(String zipcode)
 {
  this.zipcode = zipcode;
 }
 
}

  1. 创建扩展程序 class 以执行邮政编码到州的映射:

public class ZipToStateMap
{
 private Map<String, States> zipToStateMap = new HashMap<String, States>();
 
 public ZipToStateMap()
 {
  zipToStateMap.put("99553", States.AK);
  zipToStateMap.put("99571", States.AK);
  // etc
 }
 
 public States getStateFromZip(String zip)
 {
  return zipToStateMap.get(zip);
 }
 
 public boolean zipIsInState(String zip, States state)
 {
  return this.getStateFromZip(zip) == state;
 }
 
}

  1. 创建一个使用 ZipToState:zipIsInState() 扩展器的虚拟 bom 方法:

  1. 使用新映射编写规则:

或许可以使用 ODM 域来解决此问题,但我怀疑这是否是最佳解决方案,因为域的用途并非如此。如果您想要一个州列表或邮政编码前缀列表,以便在规则中引用它们,那么 ODM 域是一个很好的解决方案。但是要维护州与其邮政编码前缀之间的映射,我不太确定; ODM 域不提供获取域可能值的方法,这与 Java 枚举不同,后者提供 .values() 方法。

您是否担心维护邮政编码前缀和州之间的映射?您是否希望业务用户维护映射?

一个不求助于 Java 的选项是定义一个规则集变量来保存夏威夷的邮政编码前缀列表。如果我们假设变量被表达为'the Hawaiian ZIP code prefixes',那么规则可能被表达为"if the ZIP code prefix is one of 'the Hawaii ZIP code prefixes' then ...".

也有可能规则覆盖和分层 属性 适合您的情况。但这是一个复杂的、很少使用的功能。