关于DDD概念的一些理解和困惑,烦劳Banq点拨

值对象 value object
在开发时产生的一些特定要求的对象,如多个实体对象与多个属性(如一个USER,并加上验证码组成一个值对象)

实体对象(持久化对象) persistent object
基本上对应数据库进行持久化而产生的对象,与数据库表结构基本一一对应

域模型对象
一些在分析设计阶段被抽离出来的问题本质,基本上所有的操作,业务逻辑都是针对域模型展开的。域模型中需要有一些基本对本身的简单操作

dao层
封装了底层的数据库操作

服务层
封装了业务逻辑操作,调用dao层的方法

仓库层
针对域模型的管理,如对域模型的增删等(在学习jj3的代码时,在服务和仓库中都有dao对象的存在,于是对于仓库的作用不是非常清楚)

接下来是我个人的一些理解,难免有错,还望指正:
1.域对象模型与值对象还是有交集,因为需求中的模型与最后需要持久化的对象还是有很多相似之处的
2.服务层相当于一个业务操作+业务控制层?
4.感觉域模型对象与值对象和实体对象有重合之处,值对象用于前台请求向后台发送数据,实体对象用于控制层处理后持久化,域对象模型感觉上是一个重要的部分,实际中却不知如何准确的应用
3.系统整个流程如下:
前台请求->action等控制器->服务层->dao->数据库
(域模型?)值,实体对象贯穿其中

今天早上又去理解了四色模型的一些概念,四色中
moment-interval
role
catalog-entry-like description
party, place or thing
在后面附上的一张示例说明中,我的理解是这样的
四色模型用于抽象出业务中涉及到的类模型,MI中反映的是事件的实体,以事件的实体为驱动,追溯出涉及该事件的角色role,继续得出构成该角色的部件part,从part中再次获得归属的种类description
这样看来 四色算是以事件为驱动的么

我自问自答吧
看了一些回帖后,有意见是说仓库是针对dao的浅层封装,其中包含业务的逻辑验证,所以说仓库层只是对dao返回的数据进行浅加工和验证,真正的核心业务逻辑并不在其中而是由服务层来调用

不知道是不是这样理解

首先4色图只是方法不是目的,只是帮助我们获得一个良好的思考方式。软件中遇到的任何问题都可以按照真实世界中的情况分析,这个结果也必然可以从4色图中导出。软件只能是描述现实世界的真实状况,这是唯一合理的结果。

对于“服务层”lz的理解还是有些浅了,他不是薄薄一层而是非常厚重的,系统中的服务层在实现的过程中都是经过多次的细化得到的,所以repository也是其中的一层。每一层描述业务的多少、实现的复杂简单,都是根据事情情况确定的,没有一个必然的标准。

感谢IceQi大大的赐教

4色图是方法而不是目的,我们通过4色图对软件进行分析,最终以一个4色的形式表现我们对业务的理解,并构成类图,是这样的么

至于服务层的概念,是指具体包含什么内容,如何具体分析还是要根据实际情况而定的吧

软件理念中的任何概念都不是目的,4色图、DDD、OO全都是如此的,他们中的任何一个都是在试图帮助使用者找到事物本来的面目,也都有着共同的标准“与现实符合”。所以4色图不是必然的选择,当然会了更好吧,呵呵。

“服务层”是一个很抽象的概念了,很难一下子解释清楚,但有一个核心“服务”,你的程序给别人提供了什么样的服务,这是个需要仔细思考和理解的问题。

软件里面有一个最重要的思想“按需”,无论是业务过程、系统结构、类划分、编码,都是如此。要根据每一次遇到的实际情况进行个性化的分析,这一次需要什么。

软件设计的标准:与现实相符合。
软件应用的标准:与需求相符合。

IceQi大大的理念也给我很大的提示
在一些软件理念的细节方面的问题其实对整个理念是有很大影响的
我喜欢研究分析设计,也希望自己在几年后可以进入这个方向,慢慢成为其中的强者

再次感谢IceQi大大

==服务层:封装了业务逻辑操作,调用dao层的方法
服务层应当没有业务逻辑,如果有那就变成了MF口中的事务脚本
基本上不能放到域模型中充血的可以考虑放到服务中。服务一般无状态

==仓库层:针对域模型的管理,如对域模型的增删等
仓储的作用是重建对象和对象集。jdon说了是“借道”service
所以你要再理解下。

==实体对象(持久化对象) persistent object
实体对象应当不会出现在DDD中吧?看你怎么融合

== 值对象 value object
值对象主要关注是不变性 然后就有共享性,
为什么共享呢 因为它有不变性 再后生命周期会和域对象不一样了。
jdon中的那个值对象不能算是经典的真正意义上的值对象。搜索一下有讨论过的

感谢pub的耐心回答

我的理解是充血模型是为了让对象模型更加健全或者拟实
如:一个类peason 除了get/set方法外 还应该有走、跑、跳、说话等自我控制的能力,但新生一个自己这样的功能就不行,这些功能应该放在模型外部,由仓储等其他层来执行
服务的无状态,没有很明白
可能我还是需要看看代码后 再细细地理解

仓储的作用是重建对象和对象集。说明仓储所具有的就是取这个功能,针对域模型的取?

还有值对象的内容 谢谢pub提醒 我在搜索下论坛吧

在论坛中对于值对象,有下面这个例子
class User {
public Name name; // Name类只是个值类型,所以name是值对象
public Age age; // Age类也只是个值类型,所以age也是值对象
public Company company; // Company类的对象是系统中需要互相区别的,所以company是实体。
}

当然,User类的对象在系统中也是需要相互区别的,所以

User user = new User();

里,user也是实体。

按照上面的说法,值对象似乎只是实体的属性 或者子对象,有人提到实体与值对象的关系,相当与4色中,PPT与DES的关系,而在4色中有一个例子是PPT为内容。DES为内容类别的例子,是不是说类别就是一个值对象,但对于某些情况,类别也是实体对象,这么说实体和值是有可能相互转化的么?

现在还只是单纯概念上一些理解
还没有结合jdon的代码来看

自己对jdon的理解没有太好的思路,论坛中有没有这样的帖子,比较概括的讲一讲jdon的设计思想的?

呵呵,楼主不要想了,在jdon上对DDD的讲解永远是一鳞半爪,否则banq还办什么培训班?