Steve Yegge在其blog post中描述了属性模式。属性模式有哪些优缺点?
对于使用静态语言(如C#或Java)的人来说,这种方法的优缺点是什么?您希望使用属性模式的项目类型以及您希望何时避免它?
Steve Yegge在其blog post中描述了属性模式。属性模式有哪些优缺点?
对于使用静态语言(如C#或Java)的人来说,这种方法的优缺点是什么?您希望使用属性模式的项目类型以及您希望何时避免它?
最近我一直在深入挖掘这种模式,我可以告诉你,在它上面找到信息是相当困难的。叶戈称它为原型或属性,但这两者都被过度使用,并且被称为另外两种不同的模式。有些人提到像Yegge所建议的那样的系统是“串联式”(原文是“typed”),这是另一个研究途径。
这是一个非常整洁的想法,在某些应用中有很多优点,而在其他应用中有很多缺点。你获得的基本上是一个在运行时构建“类型”的非常灵活的方法,但是你会失去很多强类型检查语言来完成它。实现它的最简单的方法是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.
所以基本上Attribute
是一种含有一个唯一的字符串ID(在字段名称)和一个字符串值,并且的类型的一些正则表达式组合以验证枚举键 - 值对的和处理的值。通过这种方式,它可以存储多种类型的值,并将它们转换回java值,同时提供一些安全性。
然后继续在该核心之上构建许多特定于域的模型类型。因此,保险单对象可以被视为具有灵活的,可扩展的好处列表,可以在运行时添加,删除或修改。每个好处都可以扩展或减少它们的属性。
所以这是一个使用模式的例子,以及一个体面的使用案例:保险单可以非常灵活,直到销售时刻为止,承保人可以随心所欲,因此高度灵活的模型适用于它。
虽然Yegge概述的缺点几乎是。性能可能很差,特别是在天真的实施中。类型检查和安全性会受到打击,而且你的对象更难以推理,因为你不确定它们的属性。
当您想要制作对象的原型或者有一个开发结构会强制您对API/Interfaces进行迭代部署时,属性模式特别有用(或者对我来说)。
如果你从一个对象的某些属性的想法开始,然后你做出来。之后你会发现(并且你已经预料到了这个发现......)你对这个主题领域的理解是不够的,你会根据第一个对象的原型做出一个新的对象设计/行为。等等。关于这个主题的维基页面与静态类型语言一起对这个主题有非常好的描述,但是如果你真的对原型开发很认真,我会建议你研究JavaScript或者Lua。原型的属性在静态类型语言中是不可变的,这个事实最终会让你走上路。
编辑:哦,我看到你链接到一个关于这个问题的优秀帖子。叶戈斯使用/解释这个话题当然会使我自己变矮小。请阅读它几次,并且使用像java这样的语言的属性模式的好处/含义应该很清楚。
Edit.2:链接到维基百科的文章:http://en.wikipedia.org/wiki/Prototype_pattern
使用Java的人,因为我读了一篇文章,我说你不能用在任何项目属性模式,因为报价:
Java对属性模式提供基本上零的支持。
由于相同的原因,C#也是如此。当我发表这个声明时,我感到有点安慰,因为我当时没有找到任何让他们合适的方法。
所以我不知道我理解你的问题。但是,要感谢这个链接,请单独提出这个问题。现在我明白了一些我中途变得更好一些的东西。
只是一个瞥见的想法,但这可能解释为什么你不能在Java或C#上实现jQuery? – dkretz 2009-01-29 05:51:10