<ddd--领域驱动设计学习>讨论--------分层架构

<ddd--领域驱动设计学习>讨论--------分层架构


用户界面层: 负责向用户显示信息,并解析用户的命令。...

---------这里的用户界面层是不是 jsp 一类的 view ?

应用层 : 定义软件可以完成的工作,指挥具有丰富含义的领域对象来解决问题.....

---------应用层是不是 我们平时 所用的 接口,抽象类 ?

在这个层次中不反应业务情况的状态,但反映用户或程序的任务进度状态

---------这句话应该怎么理解呢?务情况的状态 和 任务进度状态是怎么反映出来的? 可以举

个例子吗?各位大牛

领域层 : 负责表示业务概念,业务状况的信息以及业务规则

---------领域层是不是 我们平时用到的类? bean? 不是很准确,应该说是实体,值对像,服

务吧。(这几个有待区别)

“反映业务状况的状态在该层中被控制和使用”
---------这里是不是指有的 操作要写在 相应的bean里面?比如 一个帐户account,应该具有
“存和取”两个动作?

基础结构层:为上层提供技术能力:消息发送,领域持久化,为用户界面绘制窗口等。

---------这个模糊 . “提供能力”看起来好像是 接口的 implement ,abstract class的

extend。。 但是 还有 持久化,这个是hibernate的功能吧, 后面的绘制窗口---这个是什么意思了?

感觉飘忽不定啊~~~~~~~~


是不是本来就理解错了,思维的出发点就有问题? 大家多多指教! 谢谢各位老师了


[该贴被spring7777777于2008-12-05 17:43修改过]

up

你理解DDD的一个误区就是:把DDD中概念和Java中技术概念混同在一起,我一直讲领域模型是鱼;而计算机技术概念是水,DDD中在讲鱼的身体结构比如鱼头,你在像水方面理解,以为水分子就是鱼头,这根本不是一回事。

分层架构就比如要求鱼的生存条件,对水的要求。

需要多多做项目,学习模式以后,才会有脱离具体语言平台以后的抽象思维。

收到,谢谢板桥

可不可以举个例子,说说具体的一些方案例子,怎么分层?
[该贴被spring7777777于2008-12-08 20:11修改过]
[该贴被spring7777777于2008-12-08 21:03修改过]

我来说说,我不成熟的观点,也是我目前项目中应用的。
表现层(MVC/Event-driven ..etc)


应用层---pojo facade(我现在把应用层当做外观来封装业务逻辑,以及划定事务边界等)

领域层---真正的业务逻辑。


持久层(orm/jdbc ...etc)

所以总体上来说分为4层,应用层是很薄的一层。不对的地方请各位道友指点。
[该贴被xmuzyu于2008-12-09 00:23修改过]

DDD主要针对领域模型.和架构分层不是一会事.
领域模型中的各种角色一定要分清楚
1.实体--有唯一的标识,并且要有属性和行为(非GET/SET),添加加了行为,使其具有生命力.往往在设计时,实体的形力最难决断.为确定形为,我们必须识别它们的责任和协作.类的责任是指该类要做,知道或决定的一切,由一个或多个方法完成.类中有属性和关联,协作就是为完成自己的责任所调用其它关联类.

2.值对象--没有标识没有行为.如Address类

3.工厂---定义创建实体的方法,封装实例化对象并将一些关联对象注入.

4.仓库(repository)管理实体的集合,主要有查找和删除实体的方法.实现类可以调用执久化层(如Hibernate,Ibatis)

5.服务(Service),它实现整个应用程序的工作流(workflow).服务包含那些无法指派单个实体的形为,由作用多个对象方法组成.如可以调用repository查找到实体对象,然后委派给这些对象.服务和facade很像,但不一样,它不处理以下事情.a执行事务b.收集返回给表现层的数据,c脱钩对象d其它事情.服务可以说是业务的协调者,业务逻辑可以分散到实体对象中.

以上是简短说明.还有现在图书概念混杂,一定要选会书看,还要在平时工作是应用DDD,不要光说不练.现在环境很尴尬,虽然天天说DDD,但是一到工作中,就忘记了.很悲哀.


这里有个图,讨论下对不对。

【【【【再次请求:可不可以举个例子,说说具体的一些方案例子,怎么分层?

一起学习


LS兄弟的图和我的想法一致的,我目前也是采用这种方法。

图里面好像少了工厂这个概念。
如果包含对象关联,对象工厂就不再是简单的new操作符了,工厂应该被显示的提及。
就算没有对象关联,只要包含领域逻辑,比如创建账号的时候不允许用一批不良词汇,这个规则是谁在处理呢?我认为应该交给工厂处理,工厂应该持有一个(批)规则的接口,不满足规则的应该掷出一个领域异常,表示对象没办法创建及原因,如果规则扔进new里,显然变更规则时候要更改对象本身的定义,还不如放进专有的工厂里处理,尽管初期没有这许多规则,我仍然倾向为重要的实体创建工厂对象。

>图里面好像少了工厂这个概念
非常正确,没有Factory的领域设计是假的,工厂负责对象的创建,控制对象的生命周期,何等重要,它可谓是对象编程和数据库编程的本质区别象征。我在JiveJdon3中专门用Builder模式来做工厂,花费的力气也最多。

Factory是必须的.就向我上面说的一样,一般情况下领域对象不能缺少工厂.工厂的职责是"创建",而不是"重建".仓库可以负责重建.


工厂模式是不是这样加的?

感觉 主要是来创建 实体的


我认为factory应该可以持有repository的引用,不然有的关联实体已经在生命周期里,那就不是新建而是重建了,重建必然要用仓储管理。factory还可以持有一些spec接口


class Factory{
RepositoryInterface rep1,rep2;
SpecInterface spec1,spec2;
}
class Model{
void doXYWith(M2 m2){
this.state=newState;
m2.state=newStateByFixWithCurrentModel;
}
}
class Service{
Model model;
Model m2;
RepositoryInterface rep;
FactoryInterface factory;
void doXXX(Object otherParams){
model=rep.reload();//已存在的对象重建
m2=factory.create();
//不存在的对象新建
rep.save(m2);
//新建的对象加入仓库
//到此为止model和m2都已经在仓库里了,也都找出来了,下面就是业务作业
model.doXYWith(m2,otherParams);
//model和m2的状态被改变,期间可以包含很多规则约束,因为这俩东西都在仓库中,事务结束的时候状态应该同步回DB,如果使用hibernate等等就不用显示update了。
}
}

[该贴被freebox于2008-12-10 18:51修改过]

rep.save(m2);//新建的对象加入仓库

请问这里的 仓库 是不是 指 仓储(repository)。

ls的 仓库 说起来感觉像 session 之类的缓存
仓储应该是一些 存储,检索,查询功能的 实现吧。

还有:
model=rep.reload();//已存在的对象重建
m2=factory.create();//不存在的对象新建

怎么区别一个对象是新对象 还是 旧对象呢?

谢谢 freebox 的指教

仓储就是对象的仓库,反正通过它直接得到对象(本身就是根)或得到根了,至于这些对象本来是在哪里的,是仓储内部的事。
新的对象和已有对象的区别:新下个单,刚建好单但是还没下单,订单是存在的,也有ID(手工派发),但是订单集合是不知道它的存在的,是个外部的东西,就像new一个string,必须通过Set.add(string),Set才知道它拥有这么样的一个实例了。否则string还在那,set也在那,但它俩不能互相感知。重建就是订单已在集合里了,不能说我下了一个单,再拿出来就不是我的了,这需要标识这种实体对象并覆写equals等,让它们在重建的时候保证是业务上的同一个对象,尽管某些属性可能被修改过(添了新商品或放弃某些商品),但它仍旧是同一个订单。