代码之家  ›  专栏  ›  技术社区  ›  Greg

属性模式的优点和缺点是什么?

  •  10
  • Greg  · 技术社区  · 17 年前

    属性模式 在一个 blog post 他的。

    3 回复  |  直到 17 年前
        1
  •  6
  •   CodexArcanum    14 年前

    我自己最近也在深入研究这个模式,我可以告诉你,要找到关于它的信息是相当困难的。Yegge将其称为原型或属性,但这两种模式都被过度使用,并被称为另外两种不同的模式。有些人将耶格提出的系统称为“严格的[sic]类型”,因此这是另一种研究途径。

    这是一个非常好的想法,在一些应用中有很多优点,在其他应用中有很多缺点。从本质上讲,您获得的是一种在运行时构建“类型”的非常灵活的方法,但您失去了许多语言的强大类型检查功能。实现它的最简单方法是 Dictionary<string,string> . 然后必须使用强制转换将字符串值作为实际值返回。保持这种设计可管理的关键是,如果可以避免的话,永远不要在代码中直接引用属性。诸如此类 theProtoObject["owner"] = "protoman" 如果插槽的“规范”名称更改,将杀死您。它还可能导致一些问题,比如JavaScript(它使用下面的模式作为它的对象模型),如果你拼错了键名,你会添加一个新的槽。

    您可能会在生产系统中进行的一个非常有可能的升级是对值使用某种特殊类型,对键使用某种“重键”,这样您就可以在模型上获得一些额外的类型和安全信息。

    OpenQuote 是一个非常灵活的项目,用于报价任何一般类型的保险。它是用Java编写的,但是如果你知道C,它应该读得很好。它的核心在于 Type 对象,其中包含以下代码位:

    /** A dynamic collection of attributes describing type */
    private List<Attribute> attribute = new ArrayList<Attribute>();
    

    Attribute ? 这:

    * An attribute is defined as "One of numerous aspects, as of a subject". Generally, another
    * type will own a (composite) collection of Attributes which help describe it.
    

    属性 是一种键值对,包含唯一的字符串ID(字段名)和字符串值,以及与某些正则表达式组合以验证和处理值的类型枚举。通过这种方式,它可以存储多种类型的值,并将它们转换回java值,同时提供一点安全性。

    然后在该核心之上构建许多领域特定的模型类型。因此,可以将保险单对象视为具有一个灵活、可扩展的福利列表,可以在运行时添加、删除或修改该列表。每项福利也可以扩展或减少其属性。

        2
  •  3
  •   Steen    17 年前

    当您想要制作对象的原型或具有某种程度上迫使您迭代部署API/接口的开发结构时,properties模式特别有用(或者,对我来说是这样)。

    如果你一开始就对一个物体的某些属性有了一个概念,那么你就可以创造它们。后来,您发现(并且您已经预料到这一发现…)您对主题领域的理解不充分,您根据第一个对象的原型进行了新的对象设计/行为。等等关于这个主题的wiki页面结合静态类型语言对这个主题进行了很好的描述,但是如果你真的对原型开发很认真的话,我建议你研究一下JavaScript或Lua。在静态类型化语言中,原型的属性是不可变的,这一事实最终会让你一败涂地。

    编辑:哦,我看到你链接到一篇关于这个主题的优秀文章。Yegges对这个主题的使用/解释当然让我自己相形见绌。请通读几遍,在java这样的语言中使用properties模式的优点/含义应该非常清楚。

    编辑2:维基百科文章链接: http://en.wikipedia.org/wiki/Prototype_pattern

        3
  •  0
  •   dkretz    17 年前

    任何 项目,因为报价:

    Java基本上不支持Properties模式。

    出于同样的原因,C#也是如此。当我谈到那句话时,我感到有点安慰,因为我肯定找不到任何方法把它们结合在一起。

    所以我不确定我是否理解你的问题。不过,谢谢你的链接,我只为这个问题投票。现在我对一些事情有了更好的理解。

    推荐文章