值对象是什么??
为什么要值对象呢?
===============================来自JDON
Form由ForumState组成,ForumState是经常更新的,所以我们设计为一个状态值对象,如果不设计这个值对象,ForumState中的字段都放在Forum中,那么更新这些字段会导致Forum这个大对象锁住,从事务性能等方面都是不好的,从Evans DDD的OO设计角度也是不对的
================================================================================
DDD中也说:如果我们只关心模型中一个元素的属性,那么就可以把这个元素划为值对象,按照这个定义,最新帖子应该Forum和ForumThread等对象中很重要的一个元素,我为了表示其整体一致性,一旦有新帖,Forum或ForumThread的State就必须全部更换。这些都是吻合的。
=============================================================================
在我们的项目实际分析设计中,其实不用严格区分实体对象和值对象,用四色图来分析和理解更易接受。
值对象的作用应该主要集中在两方面:
1. 造成无负作用函数:因为值对象往往是动态生成的临时对象,其作用主要是提供一个规格或策略或特性而已, 所以对实体的类状态不产生影响。
但一定注意,代表计算,规格,策略或属性的值对象,作用是为实体对象修改其状态而生成的。 也就是说值对象只负责计算改变的值,而不真正实施改变。而真正的改变由实对象自己调用其他方法来进行。 这样使得计算和改变两个职责解耦,不联系在一起。 有几方面好处:
比如可以更改计算或规格策略,而不影响实体类; 不用跟踪计算的中间状态; 中间状态与修改状态无关。 所以我们可以放心使用值对象来计算。 因为它并不真正来影响实体类的状态,只是为状态改变提供值而已。可以提高程序性能,一般不用持久化值对象。
2. 在类之间关联关系造成存储级联关系时, 区分出值对象,可以考虑存储策略,因此可以提高程序性能(因为可能减少数据库的访问,减少缓存的压力):比如值对象可能不需要存储和保存(如规格类往往只是利用来进行验证或是计算的,一般不改,所以也就没有必要保存和更新),但也可能需要存储,是否存储由业务决定。
因此我的理解是:分析一个类是否作为值对象, 主要应该从以上方面考虑,而不应该以是否需要存储来作为和实体的本质区别。
同时由值对象是否需要存储而导致了值对象的不同创建策略,如果需要存储,说明这个值对象代表的规格是需要一再复用的,同时也是可以配置和修改的,创建采用读写文件形成,有需要的话可以结合反射技术。 如果不需要存储,说明是固化在代码中,对应的计算相对固定。
===========================================================================
引用
我认为state在初次创建时load一次属性即可,以后每当发帖就通知它,用新帖的属性去更新state里面的值,不必每次都重新查询。信任内存。
分享到:
相关推荐
在EJB(Enterprise JavaBeans)3.0版本中,依赖值对象(Dependent Value Objects,DVO)是一种设计模式,用于在实体Bean中处理非持久化的复杂对象。这种模式允许实体Bean的属性引用其他Java对象,而这些对象并不直接...
描述中的"DDD Embeddables"进一步强调了这个项目是围绕领域驱动设计中的"嵌入式值对象"(Embeddable Value Objects)理念展开的。在DDD中,值对象是不可变的、具有业务意义的数据结构,它们通常用于封装复杂实体对象...
"值对象转换成SQL语句"的主题涉及到了如何将程序中的对象模型直接映射到SQL查询,这通常被称为对象关系映射(ORM)。ORM是一种编程技术,它允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句,降低...
Struts、DAO、工厂模式、委托模式以及值对象模式是Java Web开发中常见的设计模式和技术栈,它们在构建高效、可维护的系统中扮演着重要角色。以下将详细阐述这些概念及其相互作用。 **Struts** 是一个开源的MVC...
java 中设计模式(值对象)的实例详解 java 中设计模式(值对象)的实例详解主要介绍了java 中设计模式(值对象)的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下。值对象设计模式是一种...
049.Python字典_核心底层原理_内存分析_查找值对象过程.mp4
### 值引用与对象引用 #### 一、引言 在编程中,变量的引用方式分为两大类:值引用(Value Reference)和对象引用(Object Reference)。这两种引用方式决定了程序如何处理数据以及数据的存储方式。理解这些概念...
money, 另一个使用BCMath的货币值对象的PHP 使用BCMath的PHP 货币库,灵感来自于 Mathias Verraes 和商务人员。 将 1.x 系列用于 PHP 5.4 兼容性。动机用浮点表示货币值是不好的,你可能会丢失精确的结果。 最好...
值对象是一个简单的对象,由其属性定义,反映了业务领域的概念——例如货币、电子邮件地址、温度、位置等。值对象的主要特征是它是不可变的。 这意味着它有 在构造函数中初始化的所有属性 没有二传手 如果你想修改一...
主义ORM的值对象简化了 该库为您提供了一种在Doctrine ORM应用程序中处理值对象的简便方法。 它将为您节省每种类型的值对象类型的创建类型的类型。安装composer require yokai/doctrine-value-object设置您将必须将...
JavaScript和TypeScript的轻量级,高效的元组和值对象实现。 快速提醒一下什么是元组(使用Python): ( 1 , 2 , 3 ) == ( 1 , 2 , 3 ) # → True 类似JavaScript版本如下所示: '[1,2,3]' === '[1,2,3]' ; // → ...
值对象是域驱动设计方法的基本组成部分,由马丁·福勒(Martin Fowler)在EAA第486页的P中进行了如下描述:“值对象是一个小的简单对象,例如金钱或日期范围,其相等性不基于身份。 ” – Martin Fowler该库中的所有...
在编程领域,值对象(Value Objects)是一种设计模式,它强调对象的值而不是标识。值对象通常用于封装数据,确保数据的一致性和完整性。在这个项目中,"SchemaObjects"是专门为PHP开发的一套库,它基于Schema.org的...
值对象模式是一种软件设计模式,它在面向对象编程中用于创建表示特定值的不可变对象。在PHP中,这种模式可以有效地解决数据的比较和复制问题,尤其在处理如日期、货币等具有值语义的类型时。在给定的例子中,通过...
标题中的“dds-demo-vo”很可能是一个项目名称,它专注于使用值对象(Value Objects)在领域驱动设计(Domain-Driven Design, DDD)框架下的安全实现。这部分系统可能是一个更大型应用的一个模块,专注于处理特定的...
在Java开发中,值对象(Value Object)是一种常见的设计模式,用于封装那些具有特定值的数据。它们不关注自身的身份,而是关注其值的等价性。`codingmatters-value-objects`项目则提供了一个工具,能够根据YAML描述...
在计算机科学中,值对象是表示简单实体的小对象,其简单性不基于标识:即,两个值对象在具有相同值时是相等的,不一定是同一对象。 阅读更多关于。安装: pip install dz-phone-numbers用法: from dz_phone_number...
嵌入式是一个小型Rails引擎,可以在Active Record Object列中正确保存值对象 代码状态 嵌入式支持并针对此Ruby和Rails版本进行了测试: Ruby 2.1.5和Rails 3.2(很遗憾,但是我有一个旧项目) Ruby 2.4和Rails ...
Energetic.ValueObjects 是一个专为域驱动设计(DDD)开发的开源库,它提供了对强类型ID和值对象的支持。在DDD中,这些概念是构建复杂业务逻辑的基础,因为它们帮助保持数据的准确性和一致性。这个库的重要性在于,...
C# 中 Clone 一个对象的值到另一个对象案例 C# 中 Clone 一个对象的值到另一个对象案例是一种常见的编程需求。在这篇文章中,我们将学习如何使用 C# 中的 Clone 方法来复制一个对象的值到另一个对象。 什么是 ...