Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop DDD:应该';国家';是值对象还是实体?_Oop_Domain Driven Design - Fatal编程技术网

Oop DDD:应该';国家';是值对象还是实体?

Oop DDD:应该';国家';是值对象还是实体?,oop,domain-driven-design,Oop,Domain Driven Design,“国家”:DDD中的值对象或实体 无论哪种意见都值得赞赏 以及,在哪里存储国家名称/代码表? DB? XML? 在课堂上 谢谢 如果您的域是地理域或政治域,那么它可能是一个实体,但在一般情况下,一个国家只是一个与地址等相关联的值。在这种情况下,在对象模型的上下文中,它只是一个值 至于存储,域模型并不真正关心。如果方便,您可以使用数据库,如果愿意,可以使用XML,如果您有与国家相关的行为,可以使用类。实体的一个特征是它有一个生命周期,即它随时间而变化。一个值对象没有。事实上,值对象应该是不可变的。

“国家”:DDD中的值对象或实体

无论哪种意见都值得赞赏

以及,在哪里存储国家名称/代码表? DB? XML? 在课堂上


谢谢

如果您的域是地理域或政治域,那么它可能是一个实体,但在一般情况下,一个国家只是一个与地址等相关联的值。在这种情况下,在对象模型的上下文中,它只是一个值


至于存储,域模型并不真正关心。如果方便,您可以使用数据库,如果愿意,可以使用XML,如果您有与国家相关的行为,可以使用类。

实体的一个特征是它有一个生命周期,即它随时间而变化。一个值对象没有。事实上,值对象应该是不可变的。所以要问你自己的问题是,“这个国家的目标会随着时间的推移而改变吗?”

区别实体和值对象的另一个方面是,具有相同属性的两个值对象是相同的。因此,如果你有一个名为“France”的国家的实例,它与另一个名为“France”的国家的实例是相同的,即使它们是两个不同的实例(为了本次讨论,假设这是国家的唯一属性)。想想大多数语言中的字符串,字符串“fubar”等于字符串“fubar”的另一个实例

另一方面,实体是不同的,即使它们具有相同的属性。一个名为“John Smith”的客户可能与另一个名为“John Smith”的客户不同

鉴于这些特点,你应该能够做出决定。因为只有一个“法国”,而且它不会随时间变化,所以它可能是一个价值对象——除非你的应用程序需要更多地跟踪一个可能随时间变化的国家。

想象一下:

您有另一个实体-客户。
客户实体引用国家/地区对象。
您有两个实体实例,其中填充了具有相同值的国家/地区对象(即“法国”)
您正在从第一个实体(或第一个实体对象)中删除国家/地区对象

  • 如果您也希望删除第二个实体对象的国家/地区
    =>国家是一个实体对象
  • 如果仅为第一个实体对象删除vant country
    =>国家是一个价值对象

法国已经是5.0版:;)好吧,我已经迟到了,但是你怎么提出一个要“存储”的值对象呢?我想存储库是不可能的,可能是静态内存中的值?值对象不会是聚合根,因此它不需要自己的存储库。如果您使用的是ORM,则值对象可以映射到父聚合根下的表中的组合字段,甚至在某些情况下,可以映射到单独的表,在这些表中唯一有意义的标识是所有者对象的标识。在我的例子中,我使用国家作为地址字段的一部分。但我有一份报告需要提供国家的下拉列表。报告显示根据地址中的国家/地区选择的国家/地区的客户。我认为在这种情况下,国家应该是一个实体。我说的对吗?@devanalyst我想说这取决于你是否有1)关于你的领域中还需要处理的国家的大量元数据,以及2)有多少行为与“国家”相关。如果这只是一个你排序和筛选的东西,我不确定这是否是一个实体的有力论据(我经常对本身不是实体的受约束值进行排序、筛选和聚合)。但是,如果您有其他原因这样做,而不仅仅是为了约束值或旋转,或者如果您发现这样做简化了域逻辑,那么可能有理由这样做。