两个对象重叠的模式

时间:2020-03-05 18:50:12  来源:igfitidea点击:

我确信已经有人问过并回答了这个问题,因此我对此表示歉意,但我没有弄清楚要搜索的正确关键词。搜索"模式"会导致太多的"问答"无效。

我正在开发回归测试应用程序。我正在屏幕上显示一个表单,根据该用户登录到应用程序的情况,某些字段应为只读。因此,我可以抽象一个字段对象,也可以抽象一个用户对象,但是我应该看什么模式来描述这两个概念的交集?换句话说,对于字段1和用户A,我应该如何描述该字段为只读?似乎只读(或者不是只读)应该是Field类的属性,但是正如我所说,它取决于哪个用户正在查看表单。我考虑了一个简单的二维数组(例如ReadOnly [Field,User] = True),但我想确保选择了最有效的结构来表示这一点。

是否有关于这种数据结构的软件设计模式?我是否使事情复杂化了?二维数组是进入此处的最佳方法吗?正如我所说的,如果有人问及回答,我对此表示歉意。我在这里做了搜索,却没有找到任何东西,谷歌搜索也没有找到任何东西。

解决方案

回答

乍一看,听起来更像我们有两种不同类型的用户,并且它们具有不同的访问级别。这可以通过继承(PowerUser,User)或者通过包含为用户设置级别的安全对象或者令牌来解决。

如果我们通常不喜欢继承,则可以在应用程序上使用状态模式,装饰用户对象(Shudder)或者为不同的安全级别添加策略模式。但是我认为还为时过早,在我对项目的增长和维护方式有了一个明确的想法之前,我通常不会应用模式。

回答

表驱动设计可能是有效的。
史蒂夫·马奎尔(Steve Maguire)在编写Solid Code中没有几个很好的例子。

它们也是捕获测试的好方法,请参见fit。

在情况下,例如:

Field1ReadonlyRules = {
    'user class 1' : True,
    'user class 2' : False
}

field1.readOnly = Field1ReadonlyRules[ someUser.userClass ]

顺便说一句,我们可能想同时对用户和用户类/角色/组进行建模,而不是将它们组合在一起。
用户通常捕获谁(身份验证),而组/角色捕获什么(权限,功能)