我有一堆对象的属性,这些属性大多是布尔值,但它们来自不同的来源,不同的来源互相覆盖。
例如,要确定功能X是否可供用户使用,我有以下信息来源:
对于不同的功能,源列表,其顺序及其对默认的影响不同,例如,无法为单个用户覆盖功能Y,国家/地区源具有优先权。
也许我对当前的实施过于严格,后面是:
if
- 嵌套select available from user_feature where user_id=1 and feature_id=X
)。问题是,我该怎么做,是否有这样的设计模式? 或者也许我试图过于通用,而YAGNI就是答案?
我的想象可以解决:
修改
也许我的问题是不同属性和来源的数量。也许我需要一个有效的数据结构来保存有关属性,数据源,优先级/源顺序/覆盖的信息来计算每个属性。
答案 0 :(得分:3)
“重要性,然后是宽容的”
首先,为每个来源分配一个重要性。默认是最重要的,因为它应该总是被覆盖。
现在,在尝试确定权限时,请从最重要的来源开始,看看它有什么要说的。继续,直到找到一个来源,告诉您是否允许该操作并使用该操作。
您可能希望某些来源具有同等重要性。在这种情况下,请使用最优先的设置。如果两个同等重要的来源不同,一个人说你可以,另一个人说你不能,那么你可以。 (显然,这假设没有更重要的消息来源说你可以或不可以,或者你会停在那里。)
我不知道这是一种模式,而不是算法。
答案 1 :(得分:1)
您可能希望查看Specification Pattern以获得处理复杂规则系统的简洁方法。
您为规则定义DSL的想法也可能很好,DSL构建的结构是模式中描述的复合规范。