【问题标题】:Patterns for the overlap of two objects两个对象重叠的图案
【发布时间】:2010-09-08 07:40:48
【问题描述】:

我确信这已经被询问并回答了,所以我提前为此道歉,但我没有找到要搜索的正确关键字。搜索“模式”时会遇到太多的问答。

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

有没有关于这种数据结构的软件设计模式?我是不是把事情复杂化了——二维数组会是最好的方法吗?正如我所说,如果有人提出并回答了这个问题,我深表歉意。我在这里搜索并没有找到任何东西,谷歌搜索也没有找到任何东西。

【问题讨论】:

    标签: object design-patterns intersection


    【解决方案1】:

    表格驱动的设计可能很有效。 Steve Maguire 在 Writing Solid Code 中没有几个很好的例子。

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

    在你的情况下是这样的:

    Field1ReadonlyRules = {
        'user class 1' : True,
        'user class 2' : False
    }
    
    field1.readOnly = Field1ReadonlyRules[ someUser.userClass ]
    

    顺便说一句,您可能希望对用户和用户类/角色/组进行建模,而不是将它们组合起来。 用户通常捕获(身份验证),而组/角色捕获什么(权限、能力)

    【讨论】:

    • 这是一个很棒的建议 maccullt。谢谢;表驱动技术可能是解决此问题的最佳方法。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,Dan,情况大致如此——实际上涉及多个级别的安全性,但我同意你的观点。这是一个很好的建议。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2011-08-09
    • 2015-10-15
    • 2011-12-04
    相关资源
    最近更新 更多