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

2024-03-20

史蒂夫·叶格描述了属性模式 in a 博客文章 http://steve-yegge.blogspot.com/2008/10/universal-design-pattern.html#Property of his.

对于使用 C# 或 Java 等静态语言的人来说,这种方法的优点和缺点是什么?您希望在什么类型的项目中使用属性模式,什么时候您希望避免使用它?


我最近对这种模式进行了相当多的研究,我可以告诉你,找到有关它的信息非常困难。 Yegge 将其称为原型或属性,但这两种模式都被严重过度使用,并且众所周知的是另外两种不同的模式。有些人将像 Yegge 提出的系统称为“字符串[原文如此]类型”,所以这是另一种研究途径。

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

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

我见过一些使用它的应用程序。最近,在查找我所在行业的开源代码时,我想到了一个令人惊讶的例子:保险报价。公开报价 http://openquote.appliedindustriallogic.com/是一个非常灵活的项目,适用于任何一般类型的保险报价。它是用 Java 编写的,但如果您了解 C#,它应该读起来很好。其核心在于Type对象,其中包含这段代码:

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

什么是Attribute? This:

* 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 所概述的那样。性能可能很差,尤其是在简单的实现中。类型检查和安全性受到影响,并且您的对象更难以推理,因为您不确定它们的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

属性模式的优点和缺点是什么? 的相关文章

  • 使用类的 __new__ 方法作为工厂:__init__ 被调用两次

    我在 python 中遇到了一个奇怪的错误 其中使用 new 将类的方法作为工厂会导致 init 实例化类的方法被调用两次 这个想法最初是为了使用 new 母类的方法根据传递的参数返回其子类之一的特定实例 而无需在类外部声明工厂函数 我知道
  • C语言中有“设计模式”吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 带线程的观察者模式

    我想运行多个线程并将它们加入到主方法的末尾 这样我就可以知道它们何时完成并处理一些信息 我不想将我的线程放入数组中并逐个执行 join 因为 join 是一种阻塞方法 我会留在主线程中等待某些线程仍在运行 而其他线程可能已经完成 没有可能知
  • 导航栏是否应该始终以列表的形式实现?

    首先 非常抱歉 如果这不是一个 真正的 stackoverflow 问题 但这是我一直想知道的事情 当您为网站 html 编写导航栏时 我读到这是非常好的实践 即使不是使用列表标签实现它的唯一实践 例如 ul li Home li li A
  • 用多态性替换条件式

    我试图通过一个例子来理解这种干净的代码实践 考虑具有折扣开关盒的类产品 我正在尝试用多态性替换 switch 语句 代码之前 class Product String priceCode int discount Product Strin
  • 具体来说,什么属于模型、视图和控制器?

    我一直在学习模型 视图 控制器范例 MVC 但我很困惑 因为有些教程与其他教程相矛盾 我目前对这个过程的理解是这样的 路由器 调度器 前端控制器 尽管 MVC 名称中没有具体提及 但 Router 仍然是一个非常重要的部分 正是在这里 请求
  • 呈现模型与被动视图

    我想知道上述两种模式之间的区别 当您考虑到您需要在表示模型模式中同步代码并且该代码位于表示模型本身中时 那么我认为这些模式非常相似 两者都将事件委托给演示模型 演示者 演示模型和演示者命令域模型 并且也观察域模型 当发生更改时 它们都与视图
  • 是否可以将继承应用于 Singleton 类?

    今天面试时遇到一个问题 是否可以在单例类上应用继承概念 我说过 由于构造函数是私有的 因此我们无法扩展该 Singleton 类 他问我的下一件事是在该 Singleton 类上应用继承 因此 我将单例的构造函数设置为受保护的 认为孩子的构
  • 这是一个不正确的警告吗?

    让我们看看我经常看到的这个代码模式 struct Foo template
  • SQL Server T-SQL 中的 REGEXP_LIKE 转换

    我在一份需要转换为 SQL Server 的旧报告中遇到了这一行 REGEXP LIKE examCodes learner code examCodes 是源 learner code 是模式 我知道 SQL Server 没有 REGE
  • 横切关注点示例

    什么是一个很好的例子cross cutting concern 医疗记录示例维基百科 http en wikipedia org wiki Cross cutting concern页面对我来说似乎不完整 具体来说 从这个例子来看 为什么日
  • Javascript 沙箱模式示例实现

    在 Stoyan Stefanov 的伟大著作 JavaScript Patterns 的第 101 页中 他解释了沙箱模式 我非常喜欢他的书 但我真的错过了一些现实生活中的例子 然后更好地理解他所谈论的内容 我正在寻找一个现实生活中的工作
  • 实施策略模式的函数式方法

    我正在尝试解决一个处理从一种温度单位到另一种温度单位 摄氏度 开尔文 华氏度 转换的问题 在Java中 我需要创建一个接口并提供多个实现来封装输入类型并将结果作为输出类型的单元返回 例如开尔文到摄氏度或摄氏度到华氏度等 我已经在 scala
  • 使用 Doctrine2 时的多重歧视级别

    我正在使用 Doctrine2 来管理我的模型 如下 有一个抽象概念Content与复合模式Gallery 也是一个抽象概念Media从中Video and Image继承 我的选择是添加鉴别器Content and Media表以便区分G
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • MVVM ViewModel 与 MVC ViewModel

    ViewModel 是一个在 MVVM Model View ViewModel 和 ASP NET MVC 的推荐实现中使用的术语 鉴于每种模式都使用相同的术语 研究 ViewModel 可能会令人困惑 MVC ViewModel 和 M
  • 如何简化 ASP.NET MVC 中的全状态交错模式对话框

    我需要在多对多模式对话框中保留状态渐进增强 http en wikipedia org wiki Progressive enhancementASP NET MVC 项目中的方式 在我的代码中 当禁用 javascript 时 模式对话框
  • 在实现接口的类上强制使用单例模式

    我最好用一个例子来解释这个问题 我有一个接口模型可用于访问数据 模型可以有不同的实现 可以以各种格式表示数据 例如 XMl txt 格式等 Model不关心格式 可以说这样的一个实现是myxml模型 现在我想强迫myxml模型以及其他所有实
  • 发布者-订阅者与观察者[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto

随机推荐