`

对领域驱动设计的初步认识(一)

    博客分类:
  • DDD
阅读更多
原文  http://www.jdon.com/jivejdon/thread/39449

flyzb



发表文章: 18
注册时间: 2010年10月01日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 1人关注

对领域驱动设计的初步认识(一) 2010年10月05日 12:22 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
标签 DDD领域驱动设计      软件观点    
2
顶一下
    首先声明,我只是看了《领域驱动设计精简版》和一些DDD文章(包括banq的),想谈谈自己的认识,如有不足希望大家指正。
    “领域驱动设计”,顾名思义,首先强调的是”领域“。这个词不是指技术上的任何东西,而是指”业务领域“,是说用领域的角度去分析和设计业务。
    可是在现实中我们有多少人又真的懂业务呢,那些低层次的程序员就不用说了,因为他们了解的业务甚至都不是第一手的,都是经过架构师们消化过的。至于那些架构师门了解的业务就是正确的吗,我看不见得。因为就中国的国情而言,尤其对于企业开发而言,处处充满着管理的不规范性,用户说的很多需求就是不规范的。按照这样的用户需求做出的软件只能是个怪胎,满足一时之需,时间一长就不能用了。原因是什么呢,因为用户是会逐步成长和规范的。
    那正确的做法应该是什么呢?答案很简单,向领域专家和专业书籍学习。同时要找出当前用户在业务不足之处在哪里,要在规范和现实之间找到一道桥梁。
    ”领域驱动设计“的另一层含义是”驱动设计“。显然,”设计“只是一种手段和工具,是为”领域“服务的。”设计”的过程和质量必须通过”领域模型 “来检验和验证,这也是测试驱动的本质。当然,我们要尽可能不要让设计工具本身的缺陷扭曲了“领域”本身,那就本末倒置了。这就是为什么banq要批判 “基于关系数据库的业务设计”以及坚持“域模型不要让技术污染了”。
    在生活中也是如此,如果你骑过车或者开过车,你的心中都有一辆你真正属于你的车,至于这个车是不是有轮子什么的都不重要,关键是能让自己舒适地出行。显然”舒适地出行“才是真正的业务领域,而是”轮子之类的“只是设计。
    做企业开发快10个年头了,遇到很多困惑和困扰,在我的心中也渐渐有一个真正的企业模型。对我来说,”领域驱动设计“其实也是一种”设计“。

[该贴被flyzb于2010-10-05 16:35修改过]
banq



发表文章: 11348
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 81人关注

1楼 对领域驱动设计的初步认识(一) 2010年10月06日 10:58 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
写得很好,不愧是有10年经验的老手,宏观微观都把握到位,对DDD认识也非常可观,也能对其非常精确的到位,这就是经验修行到家的自然体现,所以,看软件行业概念层出不穷,以为越年轻越容易掌握,实际相反,年轻了反而不容易掌握新概念,因为这些概念都是承上启下,没有经验,很难入门,也是很多年轻程序员对DDD难以理解,甚至忽视的根本原因。

再加上中国的计算机教育体系只培训程序员技术概念,要么是极其基础的数学编译原理,妄图让每个计算机专业毕业的人都能发明一套伟大的语言(国人人多,淹死老外),从来没有告知他们有一种实用技巧叫面向对象,等他们在实践中走了很多弯路之后,他们也可能就离开计算机行业,后来的人再重新走老路,可惜啊。有点跑题,打住了。

领域驱动设计和现在敏捷工程以及测试驱动都是浑然一体的,三者紧密结合,形成一套新的软件开发方式,而且已经开始普及和成熟,当然更有甚者专门开发出MDD工具或DSL来支持领域开发,这些都属于探索,还没有非常成功案例,见:InfoQ:模型驱动开发在哪里成功了?
zengogogo



发表文章:
注册时间: 2010年10月06日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言

对领域驱动设计的初步认识(一) 2010年10月06日 19:13 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
有道理
jdkbean



发表文章:
注册时间: 2009年01月09日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言

对领域驱动设计的初步认识(一) 2010年10月13日 13:07 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
迷糊了
xmuzyu



发表文章: 432
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 我在线上
我要关注该作者发言 18人关注

对领域驱动设计的初步认识(一) 2010年10月14日 01:55 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
楼主对领域驱动设计的领悟很到位,如果连软件要解决的问题是什么?这些问题是什么领域的问题都没搞清楚,我想这个软件虽然可以暂时实行了功能,但是它没有灵魂,而软件真正的生命力就体现在了领域模型上,正是领域模型让软件的生命力更强.

话又说回来了,并不是任何地方都适合领域驱动设计,领域驱动设计适合一些相对稳定的行业或者领域,比如泛金融,包括银行,保险等,物流,医疗健康等领域,这些领域概念相对稳定,所以领域相对稳定,也相对更容易通过领域分析分析出领域模型出来,但是对于目前发展迅速的互联网行业,我也一直在探索是否真的适合领域驱动设计呢?比如互联网的流行的社会化媒体,包括SNS,Twitter,Digg,Groupon,Flickr等,这些领域发展较快,并且变化也很快,领域模型如何做到快速适应变化,既然领域模型要经常变化,那么说明这个领域模型就有问题,一个真正的领域模型,我觉得应该是能体现领域实质的,是领域本质的抽象,并不会经常发生变化才对,因此我觉得对于这些快速发展的行业,可以利用面向对象的分析和设计,比如四色原型的分析方法,但是领域设计并不一定适合。


ps:我觉得如果不了领域概念做出来的软件,就跟充气娃娃一样没有生命力,即使表面做的再像,可是毕竟没有灵魂啊
daihoujian



发表文章:
注册时间: 2008年02月23日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言

1楼 对领域驱动设计的初步认识(一) 2010年10月14日 10:06 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
看到一片文章中有这么句话,“OOAD的基本主张,认为领域概念是相当稳定的,可视其为企业的基因(Gene)。如果企业信息系统也是建立在此基因上,则企业与系统的基因是一致的(Consistent),让企业与系统成为一体的(Unified)两面……”,我不知道OOAD的这些基本主张是否属实,也没地方能得到验证,如果是对的话,楼上说的面对快速变化的行业领域模型不适用的说法,就是错误的,只能说明你尚未把业务做到位,领域模型尚不成熟。
xmuzyu



发表文章: 432
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 我在线上
我要关注该作者发言 18人关注

回复:1楼 对领域驱动设计的初步认识(一) 2010年10月14日 12:15 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
顶一下
2010年10月14日 10:06 "daihoujian"的言论
看到一片文章中有这么句话,“OOAD的基本主张,认为领域概念是相当稳定的,可视其为企业的基因(Gene)。如果企业信息系统也是建立在此基因上,则企业与系统的基因是一致的(Consistent),让企业与系统成为一体的(Unified)两面… ...


首先任何事物都有它的适用性,软件行业不存在银弹,领域驱动设计也是,我们不能为了领域驱动设计而去领域驱动设计,还是要搞清楚它的适用范围,对于一些新兴行业,本身这个领域刚刚兴起,领域本来就不稳定,那怎么搞领域驱动设计,另外领域驱动设计中有个很关键的角色:领域专家,当一个领域刚刚兴起的时候,大家都处于探索阶段,很难抽取出一个合适的领域模型的。

另外我再说一下自己的一些想法,领域驱动设计中有实体的概念,这个概念我觉得大家不要把他等同于我们hibernate等底层持久框架的实体,领域驱动设计的实体是要讲究状态封装的,而hibernate/ibatis等框架必须要暴漏状态,比如必须有getter/setter等方法,因此这个地方需要注意,领域模型中的实体是我们面向业务的实体,没有技术上面的概念,我现在的做法就是领域模型中实体和数据库对应的那个实体对象是区别对待的。

另外一个问题,在一个分布式的系统中,每天系统之间的交互次数都非常大,比如目前我所在部门的系统之间通过远程接口调用次数每天都在数亿次,整个公司通过远程接口调用的次数每天在100+亿次,而有时候我们的领域模型实体对象往往因为充血行为,而具有太多的关联数据,而此时在系统之间传递的时候,必然会引来很大的网络开销,同时对象序列化也是一种开销,这个时候我们在系统之间传递对象的时候,就要考虑是否适合传递领域模型实体对象。

最后,领域驱动设计中还有一个关键概念就是界限上下文,这个概念很重要,比如有时候随着系统的发展,你会发现原来你模型中的某个属性是int类型的,但是发现int类型不够用了,要移除,要改为long类型的,这个时候如果你的领域模型是没有经过界限的,没有经过划分的,那么这一次改动就会牵扯到非常多的系统,包括系统客户端升级,服务器端升级等等,而且也许会牵扯到其它的数10个,甚至更多的系统的时候,这个成本是非常大的。举着例子也是想说,领域驱动设计中模型之间的隔离很重要,虽然领域模型是系统共享的,我们一定要划分清楚共享的范围.
[该贴被xmuzyu于2010-10-14 12:27修改过]
分享到:
评论

相关推荐

    经历学习历程,促进深度学习--以《小数的初步认识》为例.pdf

    【深度学习】指的是在教育领域中,通过设计和实施能够激发学生主动探索、深度思考的教学策略,以促进学生从被动接受知识转变为自主构建理解和技能的一种教学模式。在《小数的初步认识》这一课程中,深度学习的核心...

    促进学生深度学习的做法——以“乘法的初步认识”教学为例.pdf

    例如,在教授乘法的初步认识时,教师可以利用学生对加法的认知经验,通过实物、图形、线段、点数等多种素材来引导学生进行思考,使他们能够通过已有的加法知识来理解乘法的含义,从而深入理解乘法与加法的关系。...

    c++程序设计讲义 C++的初步认识 类和对象 运算符重载 继承与派生 多态性与虚函数 输入输出流

    C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动等各个领域。本讲义旨在帮助初学者理解和掌握C++的基础知识,特别是以下几个核心概念: 1. C++的初步认识:C++是C语言的扩展...

    财经信息管理系统实验报告1——管理信息系统的初步认识-1.doc

    综上所述,这个实验让参与者对管理信息系统有了初步的认识,特别是它在财经管理中的应用。通过顶尖酒店管理信息系统的实践,学生们了解到MIS如何帮助组织高效运作,同时也认识到系统易用性和功能完善的重要性。在...

    关于cadcam的初步认识本科学位论文.doc

    CAM(Computer-Aided Manufacturing)是指利用计算机辅助进行生产制造的过程,它将CAD设计的数据转化为可直接驱动生产设备的控制指令。CAM系统包括工艺规划、数控程序编制、工装设计、生产调度以及质量控制等环节。...

    VxWorks驱动编写

    在深入探讨VxWorks驱动程序编写之前,我们首先需要对VxWorks系统有一个基本的认识。VxWorks是由Wind River Systems开发的一款实时操作系统(RTOS),它以其高性能、高可靠性和灵活性著称,在航空航天、国防、网络...

    华清远见-驱动初级实验 包含程序和文档,6天的课程

    ”驱动示例,让学员对驱动开发有初步认识。 2. **第二天实验**:可能涉及I/O管理和中断处理,讲解如何与硬件设备进行通信,包括读写端口、使用DMA(直接内存访问)等。 3. **第三天实验**:通常会深入到设备驱动...

    宋宝华 linux设备驱动开发

    1. **Linux内核基础**:介绍Linux内核的基本架构、模块化设计以及设备模型,让读者对Linux内核有初步的认识。 2. **设备驱动分类**:讲述字符设备、块设备和网络设备等不同类型的驱动,以及它们在Linux中的处理方式...

    以问题驱动促深度学习.pdf

    这篇文章主要探讨了在数学教学中如何通过问题驱动来促进学生的深度学习,并以小学数学中“认识面积”的教学为例,具体展示了如何通过问题设计和课堂活动来激发学生对关键概念的理解和掌握。 知识点一:问题驱动教学...

    windows ce开发初步

    《Windows CE开发初步》 ...通过阅读《Windows CE开发初步》这份文档,你将能够建立起对Windows CE开发的全面认识,为你的嵌入式项目打下坚实的基础。无论你是初次接触还是希望深化理解,都能从中受益匪浅。

    学吧课堂:人工智能破解在线一对一魔咒.docx

    - **顺应人性的设计**:认识到学生普遍缺乏学习动力的问题,学吧课堂设计了一套激励机制,通过做题赢取金币的方式增加学习的乐趣。 - **个性化题目的推送**:基于学生的实际水平推送合适的题目,避免挫败感的同时...

    SCRATCH全套教案设计37979.doc

    * 评价标准包括学生对SCRATCH工作界面的认识、对程序设计的掌握、对造型设计的创新性等。 SCRATCH全套教案设计37979.doc提供了完整的教学资源和评价标准,旨在帮助学生学习SCRATCH编程语言和提高编程能力和逻辑思维...

    大班语言领域“我长大以后”活动设计.docx

    3. 激发想象力:展示不同职业的相关资料,让孩子对各种职业有一个初步的认知,从而激发他们的想象力。通过想象未来的样子和职业的可能性,孩子的思维空间得以拓宽。 活动准备设计及其分析: 活动前的准备工作包括...

    基于计算思维培养的 小学人工智能初步校本课程实践.docx

    驱动性问题是“如何设计一个智能化家具,让我们的居家生活更美好?”在这个过程中,学生需要学习和理解各种传感器的工作原理,运用编程技术实现家具的智能化。项目涵盖了计算思维的关键元素,如界定问题、分析数据、...

    借助问题驱动 促进深度学习.pdf

    例如,在《角的初步认识》的教学中,教师可从学生已经熟悉的生活物品三角尺入手,引导学生通过拼接三角尺探索不同的角。这种与学生生活经验紧密结合的问题设计,有助于学生更深刻地理解数学概念。 此外,教师在运用...

    第3章 创建你的第一个iPhone应用程序.pdf

    这个受限而又具有一般性的行为必然限制该对象认识一个事件对应用程序其它地方的影响,特别是当被影响的行为只存在于应用程序的时候。委托为定制对象提供一种方法,使它可以就应用程序特有的行为和复活对象进行通讯。...

    一年级(下册)第10课《让纸张更结实》教学设计说明.doc

    本课基于粤教科技版《科学》教材的“百变的纸”单元,通过一系列实践活动,让学生理解纸张在经过简单加工后可以变得更结实,并初步接触技术与工程领域的概念。 课程由三个活动构成。首先,活动1“哪种纸更结实”,...

    现代控制系统第十一版

    - **第一章**:本章主要介绍了控制系统的概念、基本组成和分类,通过多个设计示例(例如磁盘驱动读取系统、牵引驱动电机控制等)让读者对控制系统有一个初步的认识。其中,磁盘驱动读取系统是一个贯穿全书的重要实例...

    汽车发动机曲轴工艺设计 毕业设计.zip机械设计毕业设计

    综上所述,汽车发动机曲轴工艺设计不仅是机械工程领域的一项关键技术,也是教育领域中培养学生综合能力的重要实践项目。通过这样的毕业设计,学生能够全面掌握从理论到实践的转化过程,对汽车发动机曲轴的制造有深入...

    Python语言程序设计源代码.zip

    Python程序设计的书籍已经琳琅满目,每一本书都凝聚了作者对Python的理解和对程序设计的认识,都是作者编程开发和教学经验的总结,都折射出作者的专业背景。由于大数据专业学生对程序设计的要求不是很高,但又需要...

Global site tag (gtag.js) - Google Analytics