- 浏览: 160853 次
- 来自: ...
文章分类
- 全部博客 (151)
- Liferay.in.Action (3)
- 集群 (12)
- web (5)
- jna (2)
- 数据库 (7)
- Terracotta (11)
- xml (1)
- Hibernate (3)
- Jdbc (2)
- DDD (10)
- nosql (7)
- 云存储 (3)
- 云产品 (7)
- 云计算 (26)
- Hadoop (11)
- 虚拟化 (5)
- REST (3)
- 程序人生 (11)
- google (2)
- 安全应用 (5)
- LDAP (0)
- 安全技术 (5)
- android (4)
- 网络妙语 (1)
- HTML5 (1)
- 搜索引擎 (1)
- 架构设计 (5)
- redis (3)
- Cassandra (2)
最新评论
-
liwanfeng:
情况是这样的,你的文件我觉得还是比较小,我现在需要处理的XML ...
dom4j处理大文件
原文 http://www.jdon.com/jivejdon/thread/39481
flyzb
发表文章: 18
注册时间: 2010年10月01日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 1人关注
对领域驱动设计的初步认识(三) 2010年10月19日 00:41 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
标签 DDD领域驱动设计 软件观点
1
顶一下
首先声明,《领域驱动设计》对我来说只是一种建模技术,我讨论的前提是在面对企业多业务集成(如ERP、MES、HR、多项目、PDM、MRO)模式下的如何解决业务建模的问题。我提出的观点也许并不适合小项目甚至中型的单项目,因为技术架构和项目复杂度是相适应的。
经过多年的企业实战,我对企业业务模型有了一定的认识,但关键是目前感觉还是技术滞后于业务的问题。我认为记住很多模式没有什么用处,带着问题在模式中寻找答案才是正确的使用方式,让那种解决方案的思想融入到你的模型当中,然后彻底地忘掉那些所谓的模式名词。
上次我说“领域模型应该具有柔性”,这是我花了5年时间来打磨一个项目的过程中亲身感悟出来的。这让我意识到业务建模应该回归自然:一谈起来建模技术,就离不开国外提出的OO、 EDA之类的东西,其实我们的老祖宗早就有了“摸脉”的说法,现在的SOA、ESB之类的东西是不是就像打造一个企业的“神经脉络”,而“OO”是不是就像“神经元”,它们之间的通讯就是靠生物电脉冲,这就是消息驱动。呵呵,当你在项目开发中感觉不自然的时候,那一定是你的模型出问题了,当然麻木除外。
好了,回归正题。首先,谈一下“领域驱动建模”的入手问题。由于我针对的是大项目,所以我特别强调整体思考,进行自上而下的进行大的业务划分,先确定不同业务领域的边界。《领域驱动设计》一书中只是强调了业务的水平分割,然而在大项目里还有垂直分割,注意垂直分割不完全等同于包的划分。目前有一种非常错误的做法,就是一上来就开始对象建模,然后再进行归类划分模块;正确的做法应该是前期以确认领域边界功能为主,后期以确认领域内的对象模型为主。
关于领域的切分,《领域驱动设计》没有过多谈及,其实方法就是不断对企业业务知识的学习和分析。当你对一个业务认识不清的时候,最好的办法就是不同企业环境下去分析这个业务,那这个业务的所有发展变化就清楚了,这就像那些生物学家总是喜欢通过长期的野外考查来学习知识。这个工作做好了,项目就成功了50%。
领域的边界就是服务,也是对外提供服务的唯一入口(这点可能和banq不一致)。领域服务和领域对象模型是一个业务领域的2个不同侧面。领域服务强调是从外向内看,反映了“外部对业务领域的使用功能”;领域对象模型强调业务领域就像一个独立的具有一定自主能力的生命体,反映了“业务领域的内部运行机制”。
领域对象模型的功能是不能对外暴露的,不然会造成外部对领域对象的耦合。我就亲身体验过域对象到处暴露而造成整个系统形成了一个领域对象相互关联的蜘蛛网,当项目小时无所谓,而一旦项目变大需要不同的部分独自发展而无法切割开来。另外一个原因是领域模型是不断变化的,比如“添加一个user对象” 这个功能。一开始,就是业务很简单,认为放到User对象中就OK了;但是后来业务复杂了,“领导说了怎么随便创建用户呢,必须先审批”;最后业务更复杂了,“在不同的企业里这个审批的流程还不一样”。大家看一下,对于外部而言,如果一开始就调用的user域对象的方法就惨了,因为后来增加的业务应该是 user与其他对象协作一起完成的,不能放在User内部,但是放在服务里就没问题了,外界只关心提供必要的创建user的信息就OK了,不关心内部怎实现的,怎么变化的,甚至于内部有没有User这个对象都没关系。注意服务里的addUser和User里的add方法是同时存在的,但侧重点不同。服务里的ADDUser是业务方法,而User的add方法仅仅是对象方法,前者调用后者。这就是封装,同时也支持了一定的柔性。这也是为什么在小项目里,有人觉得服务里写add,对象里写add没什么区别,甚至对象里写add更简单明了的原因了。
什么样的对象适合作为聚合根的领域对象呢?一般而言,user在大多数情况下都不是领域对象,而customer可以是。因为user是泛指,除了在HR中user可以是领域对象。你可以想象一下,在一个企业里有好几个不同的单业务系统,都是基于领域驱动设计的;在这些不同的业务场景下,user 都可以聚合根,这很正常,因为人可以干不同的事情。但如果把这些业务集成起来就有问题了。所以说作为聚合根的领域对象应该是业务场景类,而不应该是类似 user的这样的类。当然,在小项目或者单项目是不存在这样的问题的。
User作为另外一个域中的对象,在其他领域内如何引用呢?大家都知道,其实大多数业务应用中只需要一个仅仅包含UserId和UserName 属性的对象就够了,显示足以。所以User在其他域里是值对象,但却不需要引用像rich domain中的那样的User.
呵呵,这个帖子的观点也许有些不同,让讨论更猛烈些吧。
[该贴被flyzb于2010-10-19 09:03修改过]
xiaosanaiq
发表文章:
注册时间: 2009年12月29日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月19日 11:19 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
哇塞。。太帅了。。呵呵。。
相当深刻啊。。
SpeedVan
发表文章: 49
注册时间: 2010年08月24日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月19日 16:57 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
后面像道出了DCI的模型了,你可以去看看。至于文中水平分割,垂直分割···这么抽象?没听过这样的说法,数据库倒听过。事务有串行事务(同步,如流程),有并行事务(异步,如响应)。至于你所说的并行划分,是指寻找服务(找到业务就横着放着一起,关联时才联系起来)??
分层就分层,不分服务,只有分析设计领域时才,分析出服务。至于包划分,这些是人为的,根据状况设计的,目的是使项目更加清晰(你完全可以只有一个包,分析设计的逻辑仍然在里面的,但这样的项目不易读)。
xmuzyu
发表文章: 432
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 我在线上
我要关注该作者发言 18人关注
对领域驱动设计的初步认识(三) 2010年10月19日 19:27 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
呵呵,讨论越来越深入,不错。
下面说说我的理解:
我个人觉得如果仅仅按照<<领域驱动设计>>这本书上面讲的东西去领域建模会有点困难,为啥呢?首先一个复杂的业务系统,逻辑必然很复杂,那么逻辑放到哪里呢?领域模型实体对象?还是领域服务呢?领域驱动设计没有明确的告诉我们到底哪些逻辑放到实体对象里,哪些业务逻辑放到领域服务里,我倒是觉得结合四色原型的分析方法会更好,四色原型用一句话概括就是:一个具有某种描述(蓝色DES)的实体对象(绿色PPT),以某种角色(黄色)在某个时间段内(红色 MI)对某个实体进行了某种操作(红色MI),最终产生了某种结果(绿色PPT),那么我目前的做法就是业务逻辑的操作是在角色里面,这种操作是角色所具有的(类似DCI中的场景),而具体如何做的是由红色MI模型去做的,而MI模型做的过程中又会和实体对象进行协作,这样就比较清晰一点.
PS:大家还有什么其它的想法,也分享下。
banq
发表文章: 11348
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 81人关注
回复:对领域驱动设计的初步认识(三) 2010年10月20日 07:54 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月19日 00:41 "flyzb"的言论
现在的SOA、ESB之类的东西是不是就像打造一个企业的“神经脉络”,而“OO”是不是就像“神经元”,它们之间的通讯就是靠生物电脉冲,这就是消息驱动 ...
非常厉害的比喻,这是只有宏观思维的人才会有这样形象描述。
楼主对服务和实体模型的区别描述也非常不错,为解决松耦合,DDD还提出专门的防腐层。
>这也是为什么在小项目里,有人觉得服务里写add,对象里写add没什么区别,甚至对象里写add更简单明了的原因了。
现在很多初学者会将业务逻辑写在服务中(他们甚至不会写两个add方法),User或Customer这样的实体模型都是贫血模型,只有setter/getter,没有其他业务方法如add等,这些都是典型的面向数据库编程思路。
[该贴被banq于2010-10-20 07:55修改过]
ipom
发表文章: 1
注册时间: 2010年04月21日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月20日 11:41 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
看了LZ的这三篇初步认识,收获颇大
SpeedVan
发表文章: 49
注册时间: 2010年08月24日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月20日 13:25 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月19日 00:41 "flyzb"的言论
现在的SOA、ESB之类的东西是不是就像打造一个企业的“神经脉络”,而“OO”是不是就像“神经元”,它们之间的通讯就是靠生物电脉冲,这就是消息驱动。 ...
这比喻有一点问题,“‘OO’是不是就像‘神经元’”,OO作为一种思维怎么却成为了SOA、ESB等架构和技术的组件?作为“神经元”,我觉得更应该是“类”、“技术”、“内嵌架构”等一些具体的内在的东西。而反过来OO应该对应着生物界或者经脉界的世界观(例如对一般人而言只知道神经,但没有神经元等认识,或者在其他世界观中,神经已不再是神经,例如不是OO的话,对象就不是对象)。嘛,只是对这比喻分析一下而已。
回正题,比较同意 xmuzyu ,在DDD中对设计依然很模糊,因为缺少针对业务的具体分配的准则,但业务的分配通常就是我们设计的一个难点,也是一直以来,最头痛的地方(看看贫血和充血模型争了多久)。其实以前banq已经说了,分析与设计,而我们学了很多设计,却缺少了一种科学的分析所支持。而分析很多人都自成一套,有些很不规范,有些很不科学,有些甚至不可取。而四色和DCI的确一套不错的分析与设计方案。
回过头来看DDD,本人感觉它更多的是带我们进入领域世界,让我们认清领域模型就是现实模型的直接映射,不应该被入侵和破坏。同时为了创造出一个纯领域环境,也给出了设计方案。
flyzb
发表文章: 18
注册时间: 2010年10月01日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 1人关注
1楼 对领域驱动设计的初步认识(三) 2010年10月20日 15:22 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
在上一个帖子里,我强调了——"领域驱动设计" = “问题域模型驱动领域建模” + “领域建模驱动软件实现”。其中我认为“问题域模型驱动领域建模”比“领域建模驱动软件实现”更重要。可是从大家的回复看,强调后者的居多,也就是重视技术研究的居多,重视业务研究的少。说实话,IBM、微软之类的技术实力很强,但为什么没有一个通吃的企业管理软件,就是企业业务太复杂多变了。
关于水平分割和垂直分割的问题,我想有过大项目和业务集成经验的人都能明白。水平分割就是分层,而垂直分割是按照不同领域做的业务组件分割(可以看看IBM的CBM的资料)。
关于“神经脉络和神经元”只是一种比喻,我还没有想以此提升到理论的高度,只是想表达以一种“自然观”去审视各种建模技术。不要被各种技术名词所诱惑,需要掌握的是各种建模技术的问题领域,这才是“领域驱动设计”的真谛。
我和banq不同。banq是布道者,希望通过各种技术的介绍让大家迈入领域设计的大门;我是实战者,各种技术只是用了就忘掉的工具,心中只有一个属于我自己的企业领域模型。
[该贴被flyzb于2010-10-20 15:24修改过]
xmuzyu
发表文章: 432
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 我在线上
我要关注该作者发言 18人关注
回复:1楼 对领域驱动设计的初步认识(三) 2010年10月20日 16:00 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月20日 15:22 "flyzb"的言论
我和banq不同。banq是布道者,希望通过各种技术的介绍让大家迈入领域设计的大门;我是实战者,各种技术只是用了就忘掉的工具,心中只有一个属于我自己的企业领域模型。 ...
你好,请问你在实战中采用什么样的建模技术手段来实现领域模型,其实领域驱动设计不仅告诉我们软件的问题域的重要性,同时也提供了一种分析领域的技术方法论,但是目前我觉得只是按照领域驱动设计那本书的实体,值对象,领域服务,聚合,仓库这些概念不够,比如什么样子的行为属于实体,聚合跟,什么样子的行为属于领域服务,如何界定,如何去划分,这个有时候很难把握,这也许就是建模艺术性的体现吧,不能以对错来区分,只能通过不断的重构,优化使其更加接近领域实质。
PS:最后还请flyzb分享一下,你在实战过程中采用的建模技术,比如怎么判断逻辑属于实体,还是领域服务?还有领域服务和四色原型中的角色以及MI模型的联系等,我目前觉得思想原型中的角色概念很重要,它是逻辑的拥有者,而具体逻辑的实现者应该是MI去实现,实现的过程中MI也许还会包含MI-detail。
SpeedVan
发表文章: 49
注册时间: 2010年08月24日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月20日 16:15 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
先谢了CBM介绍,刚入道的我很需要对这方面的知识面扩展,否则很难交流。
其实大家都很注重建模的,因为建模的合理性和科学性,直接影响软件灵活性和扩展性。而四色是一种对模型的分析方法,DCI是则是一种设计方法。建模必须经过分析和设计的,模型是变化的,所以我们需要自己认为一种比较好的分析和设计方法来指导建模。
而你所说的可能是如何去获取领域模型(也就是客观世界的应用领域,应用边界),这是领域专家所需要的技能。但这方面是需要对一个领域不断积累的,不是一朝一夕的事,但实现的思想和技术可以更快掌握。在掌握一套能实现成品的技术后,去积累不是更好?当然同时更好,但现实不允许(工作需要,我们不是 freelancher)。所以为什么这里讨论得更多的是实现。而讨论获取的领域则需要指定是那方面的领域,然后再让这方面专业的领域专家再讨论(一般就是用例图,涉及类的就进入实现了)。(如:借贷,财务等领域不是一般人所能分析得到的,当然一个领域专家所认识的不止一个领域的)只是考虑领域,不考虑实现的话,就像MVC一样,在实现时就会迷惘和困难。
[该贴被SpeedVan于2010-10-20 16:19修改过]
[该贴被SpeedVan于2010-10-20 16:58修改过]
yananay
发表文章: 91
注册时间: 2005年02月23日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月21日 00:05 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
"对于外部而言,如果一开始就调用的user域对象的方法就惨了,因为后来增加的业务应该是user与其他对象协作一起完成的,不能放在User内部,但是放在服务里就没问题了"
严重错误。照你这么说,如果一个领域对象需要和另一个领域对象交互,就必须放到服务里了?
就这个问题来说,如果后来增加审批什么的流程,应该需要采取一些手段(例如参考一些设计模式)去解决他,或则你分析以下,是否审批的流程,就是一个领域模型。
其他的不说了。总之,我并不觉得大项目有多了不起,领域模型的作者,做过多少年的大项目呢?我也不觉得某个成熟的理论会依照上下文的场景而变得不同。
flyzb
发表文章: 18
注册时间: 2010年10月01日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 1人关注
对领域驱动设计的初步认识(三) 2010年10月19日 00:41 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
标签 DDD领域驱动设计 软件观点
1
顶一下
首先声明,《领域驱动设计》对我来说只是一种建模技术,我讨论的前提是在面对企业多业务集成(如ERP、MES、HR、多项目、PDM、MRO)模式下的如何解决业务建模的问题。我提出的观点也许并不适合小项目甚至中型的单项目,因为技术架构和项目复杂度是相适应的。
经过多年的企业实战,我对企业业务模型有了一定的认识,但关键是目前感觉还是技术滞后于业务的问题。我认为记住很多模式没有什么用处,带着问题在模式中寻找答案才是正确的使用方式,让那种解决方案的思想融入到你的模型当中,然后彻底地忘掉那些所谓的模式名词。
上次我说“领域模型应该具有柔性”,这是我花了5年时间来打磨一个项目的过程中亲身感悟出来的。这让我意识到业务建模应该回归自然:一谈起来建模技术,就离不开国外提出的OO、 EDA之类的东西,其实我们的老祖宗早就有了“摸脉”的说法,现在的SOA、ESB之类的东西是不是就像打造一个企业的“神经脉络”,而“OO”是不是就像“神经元”,它们之间的通讯就是靠生物电脉冲,这就是消息驱动。呵呵,当你在项目开发中感觉不自然的时候,那一定是你的模型出问题了,当然麻木除外。
好了,回归正题。首先,谈一下“领域驱动建模”的入手问题。由于我针对的是大项目,所以我特别强调整体思考,进行自上而下的进行大的业务划分,先确定不同业务领域的边界。《领域驱动设计》一书中只是强调了业务的水平分割,然而在大项目里还有垂直分割,注意垂直分割不完全等同于包的划分。目前有一种非常错误的做法,就是一上来就开始对象建模,然后再进行归类划分模块;正确的做法应该是前期以确认领域边界功能为主,后期以确认领域内的对象模型为主。
关于领域的切分,《领域驱动设计》没有过多谈及,其实方法就是不断对企业业务知识的学习和分析。当你对一个业务认识不清的时候,最好的办法就是不同企业环境下去分析这个业务,那这个业务的所有发展变化就清楚了,这就像那些生物学家总是喜欢通过长期的野外考查来学习知识。这个工作做好了,项目就成功了50%。
领域的边界就是服务,也是对外提供服务的唯一入口(这点可能和banq不一致)。领域服务和领域对象模型是一个业务领域的2个不同侧面。领域服务强调是从外向内看,反映了“外部对业务领域的使用功能”;领域对象模型强调业务领域就像一个独立的具有一定自主能力的生命体,反映了“业务领域的内部运行机制”。
领域对象模型的功能是不能对外暴露的,不然会造成外部对领域对象的耦合。我就亲身体验过域对象到处暴露而造成整个系统形成了一个领域对象相互关联的蜘蛛网,当项目小时无所谓,而一旦项目变大需要不同的部分独自发展而无法切割开来。另外一个原因是领域模型是不断变化的,比如“添加一个user对象” 这个功能。一开始,就是业务很简单,认为放到User对象中就OK了;但是后来业务复杂了,“领导说了怎么随便创建用户呢,必须先审批”;最后业务更复杂了,“在不同的企业里这个审批的流程还不一样”。大家看一下,对于外部而言,如果一开始就调用的user域对象的方法就惨了,因为后来增加的业务应该是 user与其他对象协作一起完成的,不能放在User内部,但是放在服务里就没问题了,外界只关心提供必要的创建user的信息就OK了,不关心内部怎实现的,怎么变化的,甚至于内部有没有User这个对象都没关系。注意服务里的addUser和User里的add方法是同时存在的,但侧重点不同。服务里的ADDUser是业务方法,而User的add方法仅仅是对象方法,前者调用后者。这就是封装,同时也支持了一定的柔性。这也是为什么在小项目里,有人觉得服务里写add,对象里写add没什么区别,甚至对象里写add更简单明了的原因了。
什么样的对象适合作为聚合根的领域对象呢?一般而言,user在大多数情况下都不是领域对象,而customer可以是。因为user是泛指,除了在HR中user可以是领域对象。你可以想象一下,在一个企业里有好几个不同的单业务系统,都是基于领域驱动设计的;在这些不同的业务场景下,user 都可以聚合根,这很正常,因为人可以干不同的事情。但如果把这些业务集成起来就有问题了。所以说作为聚合根的领域对象应该是业务场景类,而不应该是类似 user的这样的类。当然,在小项目或者单项目是不存在这样的问题的。
User作为另外一个域中的对象,在其他领域内如何引用呢?大家都知道,其实大多数业务应用中只需要一个仅仅包含UserId和UserName 属性的对象就够了,显示足以。所以User在其他域里是值对象,但却不需要引用像rich domain中的那样的User.
呵呵,这个帖子的观点也许有些不同,让讨论更猛烈些吧。
[该贴被flyzb于2010-10-19 09:03修改过]
xiaosanaiq
发表文章:
注册时间: 2009年12月29日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月19日 11:19 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
哇塞。。太帅了。。呵呵。。
相当深刻啊。。
SpeedVan
发表文章: 49
注册时间: 2010年08月24日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月19日 16:57 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
后面像道出了DCI的模型了,你可以去看看。至于文中水平分割,垂直分割···这么抽象?没听过这样的说法,数据库倒听过。事务有串行事务(同步,如流程),有并行事务(异步,如响应)。至于你所说的并行划分,是指寻找服务(找到业务就横着放着一起,关联时才联系起来)??
分层就分层,不分服务,只有分析设计领域时才,分析出服务。至于包划分,这些是人为的,根据状况设计的,目的是使项目更加清晰(你完全可以只有一个包,分析设计的逻辑仍然在里面的,但这样的项目不易读)。
xmuzyu
发表文章: 432
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 我在线上
我要关注该作者发言 18人关注
对领域驱动设计的初步认识(三) 2010年10月19日 19:27 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
呵呵,讨论越来越深入,不错。
下面说说我的理解:
我个人觉得如果仅仅按照<<领域驱动设计>>这本书上面讲的东西去领域建模会有点困难,为啥呢?首先一个复杂的业务系统,逻辑必然很复杂,那么逻辑放到哪里呢?领域模型实体对象?还是领域服务呢?领域驱动设计没有明确的告诉我们到底哪些逻辑放到实体对象里,哪些业务逻辑放到领域服务里,我倒是觉得结合四色原型的分析方法会更好,四色原型用一句话概括就是:一个具有某种描述(蓝色DES)的实体对象(绿色PPT),以某种角色(黄色)在某个时间段内(红色 MI)对某个实体进行了某种操作(红色MI),最终产生了某种结果(绿色PPT),那么我目前的做法就是业务逻辑的操作是在角色里面,这种操作是角色所具有的(类似DCI中的场景),而具体如何做的是由红色MI模型去做的,而MI模型做的过程中又会和实体对象进行协作,这样就比较清晰一点.
PS:大家还有什么其它的想法,也分享下。
banq
发表文章: 11348
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 81人关注
回复:对领域驱动设计的初步认识(三) 2010年10月20日 07:54 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月19日 00:41 "flyzb"的言论
现在的SOA、ESB之类的东西是不是就像打造一个企业的“神经脉络”,而“OO”是不是就像“神经元”,它们之间的通讯就是靠生物电脉冲,这就是消息驱动 ...
非常厉害的比喻,这是只有宏观思维的人才会有这样形象描述。
楼主对服务和实体模型的区别描述也非常不错,为解决松耦合,DDD还提出专门的防腐层。
>这也是为什么在小项目里,有人觉得服务里写add,对象里写add没什么区别,甚至对象里写add更简单明了的原因了。
现在很多初学者会将业务逻辑写在服务中(他们甚至不会写两个add方法),User或Customer这样的实体模型都是贫血模型,只有setter/getter,没有其他业务方法如add等,这些都是典型的面向数据库编程思路。
[该贴被banq于2010-10-20 07:55修改过]
ipom
发表文章: 1
注册时间: 2010年04月21日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月20日 11:41 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
看了LZ的这三篇初步认识,收获颇大
SpeedVan
发表文章: 49
注册时间: 2010年08月24日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月20日 13:25 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月19日 00:41 "flyzb"的言论
现在的SOA、ESB之类的东西是不是就像打造一个企业的“神经脉络”,而“OO”是不是就像“神经元”,它们之间的通讯就是靠生物电脉冲,这就是消息驱动。 ...
这比喻有一点问题,“‘OO’是不是就像‘神经元’”,OO作为一种思维怎么却成为了SOA、ESB等架构和技术的组件?作为“神经元”,我觉得更应该是“类”、“技术”、“内嵌架构”等一些具体的内在的东西。而反过来OO应该对应着生物界或者经脉界的世界观(例如对一般人而言只知道神经,但没有神经元等认识,或者在其他世界观中,神经已不再是神经,例如不是OO的话,对象就不是对象)。嘛,只是对这比喻分析一下而已。
回正题,比较同意 xmuzyu ,在DDD中对设计依然很模糊,因为缺少针对业务的具体分配的准则,但业务的分配通常就是我们设计的一个难点,也是一直以来,最头痛的地方(看看贫血和充血模型争了多久)。其实以前banq已经说了,分析与设计,而我们学了很多设计,却缺少了一种科学的分析所支持。而分析很多人都自成一套,有些很不规范,有些很不科学,有些甚至不可取。而四色和DCI的确一套不错的分析与设计方案。
回过头来看DDD,本人感觉它更多的是带我们进入领域世界,让我们认清领域模型就是现实模型的直接映射,不应该被入侵和破坏。同时为了创造出一个纯领域环境,也给出了设计方案。
flyzb
发表文章: 18
注册时间: 2010年10月01日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 1人关注
1楼 对领域驱动设计的初步认识(三) 2010年10月20日 15:22 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
在上一个帖子里,我强调了——"领域驱动设计" = “问题域模型驱动领域建模” + “领域建模驱动软件实现”。其中我认为“问题域模型驱动领域建模”比“领域建模驱动软件实现”更重要。可是从大家的回复看,强调后者的居多,也就是重视技术研究的居多,重视业务研究的少。说实话,IBM、微软之类的技术实力很强,但为什么没有一个通吃的企业管理软件,就是企业业务太复杂多变了。
关于水平分割和垂直分割的问题,我想有过大项目和业务集成经验的人都能明白。水平分割就是分层,而垂直分割是按照不同领域做的业务组件分割(可以看看IBM的CBM的资料)。
关于“神经脉络和神经元”只是一种比喻,我还没有想以此提升到理论的高度,只是想表达以一种“自然观”去审视各种建模技术。不要被各种技术名词所诱惑,需要掌握的是各种建模技术的问题领域,这才是“领域驱动设计”的真谛。
我和banq不同。banq是布道者,希望通过各种技术的介绍让大家迈入领域设计的大门;我是实战者,各种技术只是用了就忘掉的工具,心中只有一个属于我自己的企业领域模型。
[该贴被flyzb于2010-10-20 15:24修改过]
xmuzyu
发表文章: 432
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 我在线上
我要关注该作者发言 18人关注
回复:1楼 对领域驱动设计的初步认识(三) 2010年10月20日 16:00 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月20日 15:22 "flyzb"的言论
我和banq不同。banq是布道者,希望通过各种技术的介绍让大家迈入领域设计的大门;我是实战者,各种技术只是用了就忘掉的工具,心中只有一个属于我自己的企业领域模型。 ...
你好,请问你在实战中采用什么样的建模技术手段来实现领域模型,其实领域驱动设计不仅告诉我们软件的问题域的重要性,同时也提供了一种分析领域的技术方法论,但是目前我觉得只是按照领域驱动设计那本书的实体,值对象,领域服务,聚合,仓库这些概念不够,比如什么样子的行为属于实体,聚合跟,什么样子的行为属于领域服务,如何界定,如何去划分,这个有时候很难把握,这也许就是建模艺术性的体现吧,不能以对错来区分,只能通过不断的重构,优化使其更加接近领域实质。
PS:最后还请flyzb分享一下,你在实战过程中采用的建模技术,比如怎么判断逻辑属于实体,还是领域服务?还有领域服务和四色原型中的角色以及MI模型的联系等,我目前觉得思想原型中的角色概念很重要,它是逻辑的拥有者,而具体逻辑的实现者应该是MI去实现,实现的过程中MI也许还会包含MI-detail。
SpeedVan
发表文章: 49
注册时间: 2010年08月24日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月20日 16:15 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
先谢了CBM介绍,刚入道的我很需要对这方面的知识面扩展,否则很难交流。
其实大家都很注重建模的,因为建模的合理性和科学性,直接影响软件灵活性和扩展性。而四色是一种对模型的分析方法,DCI是则是一种设计方法。建模必须经过分析和设计的,模型是变化的,所以我们需要自己认为一种比较好的分析和设计方法来指导建模。
而你所说的可能是如何去获取领域模型(也就是客观世界的应用领域,应用边界),这是领域专家所需要的技能。但这方面是需要对一个领域不断积累的,不是一朝一夕的事,但实现的思想和技术可以更快掌握。在掌握一套能实现成品的技术后,去积累不是更好?当然同时更好,但现实不允许(工作需要,我们不是 freelancher)。所以为什么这里讨论得更多的是实现。而讨论获取的领域则需要指定是那方面的领域,然后再让这方面专业的领域专家再讨论(一般就是用例图,涉及类的就进入实现了)。(如:借贷,财务等领域不是一般人所能分析得到的,当然一个领域专家所认识的不止一个领域的)只是考虑领域,不考虑实现的话,就像MVC一样,在实现时就会迷惘和困难。
[该贴被SpeedVan于2010-10-20 16:19修改过]
[该贴被SpeedVan于2010-10-20 16:58修改过]
yananay
发表文章: 91
注册时间: 2005年02月23日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
对领域驱动设计的初步认识(三) 2010年10月21日 00:05 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
"对于外部而言,如果一开始就调用的user域对象的方法就惨了,因为后来增加的业务应该是user与其他对象协作一起完成的,不能放在User内部,但是放在服务里就没问题了"
严重错误。照你这么说,如果一个领域对象需要和另一个领域对象交互,就必须放到服务里了?
就这个问题来说,如果后来增加审批什么的流程,应该需要采取一些手段(例如参考一些设计模式)去解决他,或则你分析以下,是否审批的流程,就是一个领域模型。
其他的不说了。总之,我并不觉得大项目有多了不起,领域模型的作者,做过多少年的大项目呢?我也不觉得某个成熟的理论会依照上下文的场景而变得不同。
发表评论
-
Domain Events异步应用-2
2010-11-03 22:43 992原文 http://www.jdon.com/jive ... -
Domain Events异步应用-1
2010-11-03 22:38 975原文 http://www.jdon.com/jive ... -
Domain Events – 救世主
2010-11-03 22:34 972原文 http://www.jdon.com/jivejdon ... -
使用CQRS重新考虑架构
2010-11-03 22:25 1585原文 http://www.jdon.com/jivejdon ... -
DDD的革命: CQRS和Event Sourcing
2010-11-03 22:19 1318原文 http://www.jdon.com/jivejdon ... -
架构的演化和不断新兴的设计
2010-11-03 22:14 883原文 http://www.jdon.com/jivejdon ... -
浅谈领域驱动设计
2010-10-21 22:46 733原文 http://www.blogjava.ne ... -
对领域驱动设计的初步认识(一)
2010-10-21 21:50 865原文 http://www.jdon.com/ji ... -
对领域驱动设计的初步认识(二)
2010-10-21 21:46 858原文 http://www.jdon.com/jivejdon ...
相关推荐
例如,在教授乘法的初步认识时,教师可以利用学生对加法的认知经验,通过实物、图形、线段、点数等多种素材来引导学生进行思考,使他们能够通过已有的加法知识来理解乘法的含义,从而深入理解乘法与加法的关系。...
在《小数的初步认识》中,设计如“你见过小数吗?”、“你还知道哪些不同的小数?”以及“小数 ‘小’ 吗?”这样的驱动问题,旨在引起学生对小数的兴趣,逐步揭示小数的本质,帮助他们从生活实例中感知小数的存在和...
综上所述,这个实验让参与者对管理信息系统有了初步的认识,特别是它在财经管理中的应用。通过顶尖酒店管理信息系统的实践,学生们了解到MIS如何帮助组织高效运作,同时也认识到系统易用性和功能完善的重要性。在...
CAM(Computer-Aided Manufacturing)是指利用计算机辅助进行生产制造的过程,它将CAD设计的数据转化为可直接驱动生产设备的控制指令。CAM系统包括工艺规划、数控程序编制、工装设计、生产调度以及质量控制等环节。...
1. C++的初步认识:C++是C语言的扩展,由Bjarne Stroustrup在1983年提出,它引入了类和对象的概念,支持面向对象编程(OOP)。C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持...
”驱动示例,让学员对驱动开发有初步认识。 2. **第二天实验**:可能涉及I/O管理和中断处理,讲解如何与硬件设备进行通信,包括读写端口、使用DMA(直接内存访问)等。 3. **第三天实验**:通常会深入到设备驱动...
接着,文档详细解析了多轴器的基本概念,包括其定义和分类,让读者对多轴器有初步的认识。1.3.1章节简单介绍了多轴器,指出它是实现多轴联动加工的关键设备;1.3.2章节则列举了多轴器的不同类型,如立式、卧式、五轴...
1. **Linux内核基础**:介绍Linux内核的基本架构、模块化设计以及设备模型,让读者对Linux内核有初步的认识。 2. **设备驱动分类**:讲述字符设备、块设备和网络设备等不同类型的驱动,以及它们在Linux中的处理方式...
在深入探讨VxWorks驱动程序编写之前,我们首先需要对VxWorks系统有一个基本的认识。VxWorks是由Wind River Systems开发的一款实时操作系统(RTOS),它以其高性能、高可靠性和灵活性著称,在航空航天、国防、网络...
这篇文章主要探讨了在数学教学中如何通过问题驱动来促进学生的深度学习,并以小学数学中“认识面积”的教学为例,具体展示了如何通过问题设计和课堂活动来激发学生对关键概念的理解和掌握。 知识点一:问题驱动教学...
《Windows CE开发初步》 ...通过阅读《Windows CE开发初步》这份文档,你将能够建立起对Windows CE开发的全面认识,为你的嵌入式项目打下坚实的基础。无论你是初次接触还是希望深化理解,都能从中受益匪浅。
* 评价标准包括学生对SCRATCH工作界面的认识、对程序设计的掌握、对造型设计的创新性等。 SCRATCH全套教案设计37979.doc提供了完整的教学资源和评价标准,旨在帮助学生学习SCRATCH编程语言和提高编程能力和逻辑思维...
【大班语言领域“我长大以后”活动设计】 在大班阶段,针对孩子们的语言教育,设计以“我长大以后”为主题的活动,旨在提前启发孩子们对未来职业的兴趣和理想,培养他们的创新思维、毅力和自主学习能力。这样的教育...
在教学前,学生已经对计算机有初步认识,并且通过上一节课了解了Windows的基础知识。教学内容的重点在于掌握打开、移动和改变窗口大小的操作,这对于后续学习其他应用软件至关重要。 教学目标分为三个领域:认识...
第四课“玩游戏牌——初步认识软件”是软件概念的引入,通过简单的游戏活动,让学生初步体验软件的功能和使用方法,理解软件是如何与硬件配合完成任务的。 接下来的课程专注于“画图”软件的使用,从第五课开始,...
《汽车发动机曲轴工艺设计》是一项重要的机械设计毕业设计,主要涵盖了汽车...通过这样的毕业设计,学生能够全面掌握从理论到实践的转化过程,对汽车发动机曲轴的制造有深入的认识,从而为汽车工业的发展做出贡献。
这种学习方式激发了学生的兴趣,增强了他们对人工智能服务于生活价值的认识。 总结来说,小学人工智能初步课程通过精心设计的内容和有效的教学模式,尤其是项目化学习,能够有效地培养学生的计算思维和其他关键素养...
例如,在《角的初步认识》的教学中,教师可从学生已经熟悉的生活物品三角尺入手,引导学生通过拼接三角尺探索不同的角。这种与学生生活经验紧密结合的问题设计,有助于学生更深刻地理解数学概念。 此外,教师在运用...
《3DMAX+VRAY效果图表现》课程设计思路是基于项目驱动的形式,由教师布置项目,学生自主操作,教师辅导,成果点评分享,以此来加深学生对3DMAX软件的认识,为后续的各项课程打下基础。 三、课程容 《3DMAX+VRAY...
标题中的“数字化农业政策支持体系初步建立”表明我国在农业领域正逐步推进信息化与农业的深度融合,通过政策引导和技术支持,提升农业的现代化水平。这一过程涵盖了智慧农业、架构设计等多个方面,旨在利用信息技术...