值对象需要持久化,但值对象又不能建仓储,比如(货币、类型)等。咋办!

在实际开发中经常 需要配置一些系统参数(比如角色,权限,货币,XX类型等等)
这些很显然是值对象,即使为了性能在数据库中加上个Id,但他们在领域中任然还是值对象
值对象 不可能有仓储(以为仓储是针对聚合[聚合根必然是实体]而言的。
矛盾出来了。
不知大伙怎么解决。
我思考过的办法
1.有值对象相关的实体的仓储来承担,但是问题依然麻烦(比如有些值对象,它可以被不同实体使用,那到底放在哪个上呢?)
2.有单独一个值对象仓储来承担这些值对象的持久化(但是感觉职责过载)
[该贴被bmrxntfj于2009-03-17 17:15修改过]

都知道呢 还是都不知道
都知道就像女人一样叫一声嘛
在DDD书中和Martin的企业应用架构模式书中都有讨论
但都没给出解决方法,昨天晚上看了下Tim的代码
发现他用的就是我说的第一种方法
jdon 俺也常来 也没见个个都是牛逼的嘛(注:牛逼的一般都不告诉菜鸟,俺其实就是这种菜鸟,跟人家没法比,人家啥都懂,就是不告诉你)
[该贴被bmrxntfj于2009-03-18 09:12修改过]

>值对象 不可能有仓储
不一定吧,仓储是为了将对象从数据库床上唤醒,值对象也是对象,所以两者没有必然关系。

只要你需要保存数据库中冬眠,都必须用仓储。

不要把问题复杂化,也不要太多框架限制,MF或Evans 他们的理论也是基于对象OO思维,而OO是一个很正常自然的思维,每个人都能判断力,不需要权威再替我们做基本准则判断。

所以,关键是让自己回到自然,回到正常思维,只有得了数据库富贵病无病呻吟后,才需要去看专家门诊。


“在DDD书中和Martin的企业应用架构模式书中都有讨论”

你把讨论的内容贴上来看看,俺咋就没看见他们讨论这些东西呢?

“这些很显然是值对象”

你从哪得出的结论 “这些很显然是值对象” 呢?为什么他们不能是一个 ConfigInfo 实体??

值对象 不可能有仓储
我说错了,我改,可banq,下面的人 那值对象的全局查询职责由谁来承担
banq的做法就是每个值对象 都去建个仓储吗?
@yananay 别自以为是,你不好好看书,还谈什么

原来都这么牛逼的,我还真不信这不是问题

脑子都生锈了吗?
我看以前大家是为了模式而模式,到了jdon,大家就变成为了ddd而ddd了。

到底什么是领域模型,什么是仓储,bmrxntfj 你真的想明白了?

>那值对象的全局查询职责由谁来承担
这是一个很好的问题,很有实战意义,这也是Martin Fowler在他的分析模式中提到的“入口点”问题,也是DDD提到的聚合根的问题。

入口点对于数据库思维的人是没有存在意义,因为数据都在数据库脱了衣服安静地躺着,你要从哪个入手就从哪个入手,不存入口点问题。

从聚合根实体类选择入口也可以,但是也可以委托一个全局的登记表对象,当然,这只限定于查询,以我的理解打比方,后者就是Jdon框架提供的批量查询功能,也就是JiveJdon3中获取ForumThread主题列表的方式。

http://www.jdon.com/jivejdon/thread/35811.html


btw:大家说话慢慢说,我之前可能说太多,没有责怪你的意思,我通常都是有感而发,不针对个人。


[该贴被banq于2009-03-19 10:28修改过]

@yananay
'我看以前大家是为了模式而模式,到了jdon,大家就变成为了DDD而DDD了。'
这种屁话就不要来跟我说了,我听的耳朵都起老茧了,
如果你不遵循别人已经实践出来的模式,你以为你自己读读DDD前面那些大思想,你就能组织好 领域模型吗?
我提的问题 在书中绝对没有给出解决方法 大多都是含糊其词
说什么 提供全局查询没有意义, 什么如果真的是这样 就可能是一个实体

“这些很显然是值对象” 你不会用脑子想想啊 就是通常来说都是这样 何必咱牛角尖呢
什么是仓储 俺就知道 仓储是对聚合而言的
至于我说的聚合根一定是实体这句话 我说错了
为什么我会说错 因为那些老大们 都建议为值对象提供查询没有意义,并且还说了 如果是这样就可能是一个实体
好了
既然值对象需要全局查询 那么职责由谁来承担
我给出来两种方法
@banq 说的就是第一种方法
但是当系统复杂起来,就比如我举的列子
‘有些值对象,它可以被不同实体使用,那到底放在哪个上呢?’

@yananay
也许是我脑子都生锈了,没想明白,可你一副专家学者的样子,就让我不爽,非常不爽,本来我上次回复就想多说两句,因为我以前也是这样,以为ddd看多了 自个就懂了,看到别人讨论,总是不屑一顾
‘不要为了模式而模式’这句话 我也对别人说过,慢慢我才发现一般说这样话的人,都模式对不怎么懂,或者就是皮毛而已。
留下这样的话,自以为很牛逼,如果牛逼的人 ,会给出解决方法。
哎 不说了 真他妈的没意思 叫别人 不收钱 还要被别人骂

“因为那些老大们 都建议为值对象提供查询没有意义,并且还说了 如果是这样就可能是一个实体”

为什么那些老大会这么说呢?为什么值对象提供查询没有意义呢??
因为 值对象 是不应该有自己的 唯一标示的阿!!! 如果它有了唯一标示,它就不是值对象了!
(同样,别像之前一位老兄,把唯一标示和数据库主键搞混了)

你说的“全局查询”的意思难道是“不是从一个实体中获得这个值对象,而是直接获得这个值对象”?
兄台,请你想一想,如果您的系统有这样的需求,请问 它 还是一个值对象吗?

所以,分析一个东西是不是值对象,不是大家说它应该是啥你就认为它是啥,得看你的需求和系统到底是啥样子的 --- 这也是我说脑子生锈的原因。

既然你觉得中国人说得不明白,我替您搜索了一个“ddd what is value object”,
其中的一个结果:

http://stochastyk.blogspot.com/2008/05/value-objects-in-ddd-part-2-creating.html

我再友情贴一个:

http://www.lostechies.com/blogs/joe_ocampo/archive/2007/04/23/a-discussion-on-domain-driven-design-value-objects.aspx

结贴吧
自己先搞清楚 再来和我谈。

--'你说的“全局查询”的意思难道是“不是从一个实体中获得这个值对象,而是直接获得这个值对象”?
兄台,请你想一想,如果您的系统有这样的需求,请问 它 还是一个值对象吗?'

你那一大堆理由,简直就没好好思考过

--'为什么那些老大会这么说呢?为什么值对象提供查询没有意义呢??
因为 值对象 是不应该有自己的 唯一标示的阿!!!'
可笑至极的理由。
如果上面的话是真的话,那么就可以推论出,我以前说过的一句话,值对象没有仓储。

建议你还是好好 仔细 看看ddd仓储部分

[该贴被bmrxntfj于2009-03-19 17:12修改过]
[该贴被bmrxntfj于2009-03-19 17:19修改过]

"可笑至极的理由。"

我无奈了,这怎么是理由呢?人家 evans 给了很好的定义呀。

“如果上面的话是真的话,那么就可以推论出,我以前说过的一句话,值对象没有仓储。”

你看,又来了吧?又把“唯一标示”和“数据库主键”混为一谈了吧?

真是锈了,这个时候,你需要“实践”这个润滑油。

先声明一点,我只是一只很菜的菜鸟,甚至都没怎么看DDD,所以我无法保证自己的观点的正确性。

看了楼主和yananay的争论,特别是楼主的观点我觉得怪怪的。

对于楼主的言论,我不知道是不是可以这样去理解,我们在日常生活中的各项交易都会使用人民币,这个时候人民币对象应该算是值对象吧,不管是一百张的一块、十张的十块还是一张的一百,它们都是等值的,都可以去衡量商品的价格。

而你说的值对象全局查询,你仔细想想,值对象有必要进行全局查询吗?当然,也许你会问人民币不也有唯一编号,也许客户想知道编码为:xxxx的人民币现在谁手中?但你想想看,这个时候,人民币还是值对象吗?它已经转换了角色。在这个场景中,它不在担当衡量商品价格的工具,对于客户而言,它只是一件物品,而不是钱!

不知道这样说你能不能理解我想表达的意思。

另外,所谓的仓储,在我看来就相当于现实生活中仓库。我们还是以人民币来举例吧。比方说我有一百万的财产,我不可能把这些钱都带在身上,所以我选择把他存储在银行中,这个时候银行就算是一个仓储。它只是让我来储存这些钱的,某次我要用钱了,我去银行取钱,那么你认为我还会计较我取出来的钱是不是我之前存入的那些呢?只要取出来的钱是等值的就可以了,当然如果你愿意,你也可以立马在银行兑换成等值的美元、日元或者英镑不是吗?当然前提是银行提供这种业务!

其实所谓的面向对象真的很简单,只要你站在一个普通人的角度去看待问题,很容易就解决了。

楼主的问题其实根源还是在于你是一个程序员的角度去看待事物,或者说还没有脱离数据库的影响。

呵呵~我是一只菜鸟,很菜很菜的菜鸟,一只想要成长为大鸟的菜鸟!呵呵~
[该贴被snow0613于2009-04-05 15:57修改过]
[该贴被snow0613于2009-04-05 15:58修改过]

还有一点,JDON是一个论道的地方。

我觉得如果你认为某人的观点是错误的,你可以提出证据去反驳他,但是却不能对其进行人身攻击。

这句话是对楼主和yananay说的。

呼呼~

欢迎楼主拍砖!