论坛首页 Java企业应用论坛

一堂如何提高代码质量的培训课 之 领域驱动设计

浏览 17352 次
精华帖 (2) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-13  
fangang 写道
当你在质疑我的文章的时候,我首先想到的是,我的文章是否把我的思想表述清楚,也许我真应当重构一下我的文章了。

你给的这篇文章谈的是贫血与富血的讨论。Robbin似乎一直倾向于富血,但我毫无疑问是倾向于贫血而质疑富血的。

Service可以省,因为有dwr支持,DAO可以省,因为有hibernate的支持。在我看来,值对象就只应当包含要持久化的数据,和表间的关系(值对象的建立应当基本上与领域模型中的概念类(不包含行为)保持一致,注意这里的值对象概念是hibernate中的值对象概念,而不是DDD中的值对象概念)。而领域模型中的那些行为,应当全部放到BUS中,即领域层。这个意思就是我所说的数据与业务逻辑分离。

这篇文章可能理论概述多了一点儿,很难把我的意思表达清楚。我正在策划写一篇新的文章,用一个实例来讲述我怎样用领域驱动设计去分析和设计一个系统的。


1.我并不是要进行对与错的质疑,而是质疑是面向对象还是面向过程,是Eric的DDD,还是其它的.我并不认为你的方式是Eric的DDD的一个落地,因此才建议你改名字,以免引起混淆和无谓的争议;

2.我要说的Service是指Eric所谓的中等粒度,无状态的分割领域和应用的那一层次.你通过DWR实现了将BUS暴露出去(这只是个技术实现),但是你的Entity(Bus)如果每个都映射到一个领域概念,那么肯定是细粒度的.除非在你的BUS中分割出来一部分类不映射到失体,承担粗粒度的职责.因此不是Service可以省略的问题.而是你的应用中省略了Eric的Service;

3.Eric的DDD中不提倡DAO,而是根据实体的聚合关系划分不同的仓库.

4.看过DDD的人,会对你所说的值对象感到不知所措;

最后,我并不是要表达我多么崇拜DDD,你要是不符合Eric的DDD就是多么的谬误,说了这么多核心要表达的就是,楼主的东西和Eric的东西差异很大,已经不适合在同一个名号下来讨论了.
0 请登录后投票
   发表时间:2010-01-13  
fangang 写道
这篇文章我犹豫了数天,最后还是贴上来了,但不得不承认比较失败,即有许多地方没有描述清楚,也有许多地方认识还不深刻,但也许可以提出来作为一次有益的尝试吧。

我这个人崇尚大胆地改造,我希望将领域驱动设计实实在在地运用到我们的开发中,并大胆地改造我们的开发模式。但这依然是一个艰巨的工作。希望这里能作为一个我们探索和探讨的场所吧:)


其实你的前几部分我都看了,说实话还不错,但是最后这一部分在吊足了大家胃口的同时没有看到预期的东西.
你确实是在做大胆的改造
0 请登录后投票
   发表时间:2010-01-13  
mwmw 写道
现在又多少大型项目用了真正的DDD,DDD虽然已经出来了这么多年了,但是用起来还是蛮麻烦的,也是蛮复杂的。概念上是好的,Repository,Domain Event,Factory,Bus很多东西都是换了一个名字。

DDD可行,很好,没有在大型项目中系统的用过。小项目的DDD不能体现出其中的魅力。


DDD有点阳春白雪的意思.
:)
0 请登录后投票
   发表时间:2010-01-13  
kevinyao 写道

1,怎样抽取领域模型。


业务是复杂的,建立Domain model对很多人来说比较困难,这实际上阻碍了DDD的普及。建一个好的Model就像作家写一部成功的小说。
DDD是建立在OO的基础上。OO的炒作已经30年了,提起OO似乎都有落伍的嫌疑,但是又有多少人在真正在用OO呢?多少人和机构是在挂羊头卖狗肉呢?从另一方面我也在反思,不能普及的技术是好技术么?很多人不也是用过程八项目做出来了么?

kevinyao 写道

Application是Transaction边界。这个消息也可以称之为Domain Event。
这个消息框架的设计,有2种方案:(1)观察者模式(2)JMS 。
利用JMS处理信息的时候,可以采用同期和非同期,根据自己的业务要求来定。


Domain Event研究的不多,能否分享一下经验

kevinyao 写道


2,怎样基于领域模型进行框架设计。
各位同学如果有兴趣的话,请看看这份框架设计http://dddsample.sourceforge.net/
dddsample提供了一个很好的例子,不过自己在借鉴的过程中要区别使用。
BigBlue的一些疑惑也是我看这份代码的疑惑。如果大家有兴趣的话,我们再开一贴,专门讨论怎样借鉴dddsample来进行领域驱动设计,呵呵。
暂时先借一个地方说说,从dddsample里我的疑惑:
(1)事务的一致性处理
要保持事务的一致性,在跨多个领域模型更新操作的时候,必须是同期处理。如果采用非同期处理,要保持事务的一致性,就要采用分布式事务。
有没有折衷的办法呢?dddsample里用的是非同期处理,没有采用分布式事务处理。dddsample为了提高可用性,而牺牲了一致性。

   没有仔细研究过dddsample的这个方面。分布式事务很麻烦,特别是异构的系统,有时候不得不牺牲一致性。
    想听听你的看法。

kevinyao 写道

(2)增删改和查询统计的区别处理
在目前还是以关系型数据库为主流的持久化时代中,查询统计一般都是通过存储过程来实现的。这样一来业务逻辑就很有可能分散在领域模型和存储过程两个地方了,不方便维护。各位同学有没有好的方案?http://code.google.com/p/cqrs4j/提供了一种方案,有谁在开发中实践过这个框架吗?

    如果不是性能问题,我一直不赞同使用存储过程,这个问题我一般是这么考虑的:
    .NET领域可以选择Linq来解决查询问题,
     JPA可以通过JPQL或者Criteria API来解决

kevinyao 写道


总之,业务层采用Domain + DomainEvent + Cache,表现层适当采用Ajax,应该能够构建一个灵活的,柔软的框架,代码质量也会有所提高。

把这些内容整理一下就可以新开一贴了
0 请登录后投票
   发表时间:2010-01-14   最后修改:2010-01-20
TO BIgBlue
呵呵,我正准备在下一个项目中实施目前所了解的DDD方面的知识,现在纯属纸上谈兵。
有DDD实战经验的大佬们能否站出来给各位同学讲讲心得体会啊。
0 请登录后投票
   发表时间:2010-01-20  
如果我是在一个月以前看楼主这文章的话,绝对是觉得看不懂,全是空谈,但现在不一样,公司 来了个牛人,在这一个月的时间里,我以前一直理解的java面向对象完全有了一个新人认识,再次感谢楼主提供这么好的东西
0 请登录后投票
   发表时间:2010-01-20  
DDD这方面的东西,一直在发展,半年前还没有听说过传说中的CQRS呢,最近开始有人准备做了,如前面的一位同学说的,DDD,特别是Eric说的DDD,有点阳春白雪的样子,永远都是那个例子。 DDD方向的实践,什么是真正的DDD,这样的问题才是最重要的。

有很多DDD的实现,opensource的,但是每个是一个样子,每个有自己的理解。如果在一个简单项目里面做了DDD,或者是所谓的DDD,没有多少参考价值。 也尝试着DDD,但是越做到最后越是迷茫。难道充血了,难道加上了factory,换成了Repository就是DDD了吗?这样的DDD跟其他的又有什么本质的区别呢?

请有经验的多分享。
0 请登录后投票
   发表时间:2010-03-07  
楼主好像有些概念不是很明确,最好能辅以代码来说明。看了以后也感觉有一些与BigBlue提出的类似的疑惑,尤其是值对象啥的。

如果有代码说明可能就更容易看明白了。
0 请登录后投票
   发表时间:2010-03-08  
每个人心中都有个自己的DDD,即使他自认为得到了eric的真传。
0 请登录后投票
   发表时间:2010-12-10  
楼主对领域模型的理解我很赞同,但是楼主对领域模型的实施我没有搞懂,而且去掉service和dao我是反对的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics