是否存在来自不同,冲突,优先来源的属性的设计模式?

时间:2011-09-08 22:17:33

标签: algorithm design-patterns data-structures dsl

我有一堆对象的属性,这些属性大多是布尔值,但它们来自不同的来源,不同的来源互相覆盖。

例如,要确定功能X是否可供用户使用,我有以下信息来源:

  • 功能的默认值,例如“功能X默认可用”
  • 用户帐户类型,例如“功能X适用于帐户类型为'商家'的用户
  • 国家/地区,“您所在的国家/地区无法使用功能X”
  • 按用户覆盖,例如“功能X可供此用户使用,因为他很酷”

对于不同的功能,源列表,其顺序及其对默认的影响不同,例如,无法为单个用户覆盖功能Y,国家/地区源具有优先权。

也许我对当前的实施过于严格,后面是:

  • 每个要素都由要素类中的常量标识。
  • 有一个默认数组(功能X - >默认情况下不可用)。
  • 每个帐户类型都有数组(商家帐户:功能X - >可用,功能Y - > ...)
  • 所有其他来源都有很长很长的功能,有很多if - 嵌套
  • 最后有(或可能)无条件的每用户覆盖 (select available from user_feature where user_id=1 and feature_id=X)。

问题是,我该怎么做,是否有这样的设计模式? 或者也许我试图过于通用,而YAGNI就是答案?

我的想象可以解决:

  • 用于描述来源对财产的影响的DSL,表达“此帐户类型可用”和“此国家/地区不可用”等内容
  • 每个已定义属性的有序源列表
    • 默认可能只是另一个来源

修改

也许我的问题是不同属性和来源的数量。也许我需要一个有效的数据结构来保存有关属性,数据源,优先级/源顺序/覆盖的信息来计算每个属性。

2 个答案:

答案 0 :(得分:3)

“重要性,然后是宽容的”

首先,为每个来源分配一个重要性。默认是最重要的,因为它应该总是被覆盖。

现在,在尝试确定权限时,请从最重要的来源开始,看看它有什么要说的。继续,直到找到一个来源,告诉您是否允许该操作并使用该操作。

您可能希望某些来源具有同等重要性。在这种情况下,请使用最优先的设置。如果两个同等重要的来源不同,一个人说你可以,另一个人说你不能,那么你可以。 (显然,这假设没有更重要的消息来源说你可以或不可以,或者你会停在那里。)

我不知道这是一种模式,而不是算法。

答案 1 :(得分:1)

您可能希望查看Specification Pattern以获得处理复杂规则系统的简洁方法。

您为规则定义DSL的想法也可能很好,DSL构建的结构是模式中描述的复合规范。