- 浏览: 118280 次
- 来自: ...
文章分类
最新评论
无论有没有软件支持, 无论软件是好是坏, 世界各地每个领域每天都发生着数以亿计可以理解的业务
领域驱动设计是一种设计方法, 试图解决的问题是软件的难以理解, 难以演化. 采用的方法是围绕业务概念来构建模型.
不过你也可以从两个角度来理解领域驱动设计: 作为设计结果的DDD和作为开发方法的DDD, 即 What and How.
作为结果的领域驱动设计是这样一种设计(What): 它建立了一个模型, 这个模型具有以下一些特征:
-
它是用Ubiquitous Language描述的, 可以用于未必懂编程的业务专家和开发团队之间的交流, 以及开发团队内部的交流, 以及代码中类和方法的名字.
-
它包含了业务领域中一些基本的概念, 以及概念之间的关系, 它们如何彼此合作, 完成业务领域的各种日常工作. 这些概念是与软件无关的, 无论你有没有用软件来建模它们, 它们每天都出现在从业人员的头脑中, 交谈中, 公司的账本中. 换句话说, 它反映了这个领域的知识. 任何理解了这个模型的人, 就理解了这个领域是如何运转的.
-
它很少是一个大而全的模型, 因为同一件事物, 在不同的业务场景中有不同的概念, 术语, 角色. 同一份数据, 在不同的场景中也有不同的含义和解读. 因此, 模型里的概念按照应用场景自然的分组, 它们与另外场景中的概念的关联则通过一种内在的映射来保持.
-
它是一种说明性的模型, 没有实现细节, 因为它将软件本身的技术复杂性分离出去, 而主要致力于描述业务领域. 这样模型的复杂性就只由业务领域的复杂性来决定. 而通常的结果是这会使它更简单.
这样的模型很容易随着业务的变化而变化, 至少不应该比业务本身的变化更困难, 更剧烈. 保守一点讲, 业务领域的变化比技术领域的变化缓慢的多, 模型反映业务, 因此也稳定的多. 当业务渐变时, 模型只需跟随做简单的调整. 业务其实并不复杂, 无论有没有软件支持, 每个领域每天都实际发生着数以亿计的从财务的角度可以追溯的,从从业人员的角度可以理解的, 从管理者的角度可以掌控的业务. 软件却难以正确表达的原因不在于业务本身多复杂, 而在于我们用的工具, 用的方法. DDD试图分离实现(solution domain)的复杂性, 还原业务(problem domain)的简单性, 并提供了相应的工具和方法支持.
这个模型描绘的前景是激动人心的, 但是如何实现 (How)? 我们需要实现技术的支持和开发过程实践的支持
书里描述了一些通用的构造块(Building Block), 即实现技术的支持:
-
Entity, Value Object and Aggregate
-
Repository and Factory
-
Layered Architecture, Module and Service etc.
-
Side-effect-free-function
-
Intention-revealing-interface, Specification and Assertion etc.
-
...
当然这些构造块并不是全部, 新的模式会不断被开发出来 弥合分析与设计及实现之间的Gap. 这些构造块也不是必需的. 虽然Eric在书里说设计必须考虑实现, 但实现并不非得就是书里提供的构造块, 比如 Entity, Value Object, Repository. 反过来说也可以: 用了Entity, Value Object, Repository等并不一定意味着你就是在进行DDD. 事实上, 类似Entity和Value Object这样的基本概念上的区别, Side effect free function这样的常识, 是任何一种设计, 任何一种设计方法都应该考虑的.
而更重要的是, 开发过程中哪些实践可以支持DDD的实现? 事实上这一部分是DDD的核心, 甚至你可以把它理解为What而不是How. 因此描述可以反过来: 我们无法保证最终能得出一个完美的领域模型, 我们只能在开发过程中尽力去改进我们手头的模型, 然后顺其自然. 因此如何改进模型才是关键, DDD提供了一些基本的方法来促成这种改进.
-
开发团队与领域专家的合作: 头脑风暴, 草图, 持续学习, 知识消化...
-
模型作为统一语言: 捕捉语言的不一致性; 通过对话改进模型.
-
绑定模型与设计实现: 消除分析和设计之间的Gap; 建模人员同时负责实现
-
把隐含概念转变为显式概念: 倾听表达用语, 检查不协调之处, 研究矛盾之处, 查阅书籍, 不断尝试重构
-
借力分析模式
-
借力设计模式, 尤其是类似策略模式这样偏重于模型概念而不是实现的模式.
-
更深层次的重构: 组建探索团队, 抓住每个模型与现实不匹配的时机, 将危机视为机会.
-
...
然而我们通常面临更多的现实约束, 比如我们不是每次都是从头开始建造一个新的系统, 我们不得不与遗留系统进行集成; 也不是只有我们一个开发团队, 我们需要与其他团队合作. Eric将解决这部分问题的方法叫做战略性设计(Strategic Design)
-
系统涉及面广, 规模庞大: Bounded Context, Context Map, System Metaphor, Responsibility Layers, Knowledge Level
-
多个团队并行开发, 彼此需要交互: Shared Kernel, Customer/Supplier Team, Conformist, Anticorruption Layer
-
有另外的系统(通常是遗留的)需要集成: Anticorruption Layer, 各走各路, Open Host Service, Published Language
-
有限的资源,无限的问题: 好钢用在刀刃上, Distill Core Domain
这确实是最困难的一部分, 如果在战略上选择了不合适的方向, 则前面的构造块, 领域模型只能算是局部优化. TaoWen说DDD这本书只看第四部分就可以了, 这也是一种Distill Core Domain吧.
发表评论
-
Architecture is layered
2004-12-11 11:57 379那天被问道软件架构师需要了解编程语言的细节吗? 呵呵,架构是 ... -
Thinking Everyday
2004-12-11 12:01 4371,编程语言的发展趋势 ... -
糟糕命名集锦
2004-12-11 16:50 5681,公交支线,如375和375 ... -
古代的软件开发 (一)
2005-02-19 16:45 6741,额外的中间层鞋子:人类发明鞋子的意义无论如何评价都不过分, ... -
访问控制 : 语言和平台
2005-03-15 19:27 610程序逻辑上的组织方式(如名称空间,包等)可以和部署时的分发 ... -
Thinking Everyday II
2005-03-17 15:11 6181, 是业务,不是技术,傻瓜 是集成,不是编程 是使用,不 ... -
内容与标准为王:下一代互联网与下一代搜索
2005-07-25 14:53 702第一代互联网混淆了真正的数据和它的表现形式,第一代搜索无法 ... -
个性与定制为王:下一代互联网和下一代门户
2005-07-28 11:28 599看一下现在我与互联网有关的生活:我有两三个常用的Web邮箱 ... -
泛型编程 vs. 面向对象
2005-08-10 14:30 815面向对象:封装(数据抽象)是基础,继承是手段,多态是目的 ... -
函数式编程 vs. 对象式编程
2005-08-10 14:44 647<<我爱我家>>有一集和平摔成了脑 ... -
用手机从ATM取钱
2005-11-21 22:49 692手机的以下两个特性,使它潜在的可能成为统一的支付和信用平 ... -
Web 3.0 : Unified Human-like Interaction
2006-01-14 16:31 696你还在到搜索引擎的主页上去搜索吗?你还登录新闻网站查询最新比赛 ... -
软件生物学
2006-01-14 16:59 647长久以来,软件的建筑学隐喻已经深入人心,可始终无法达到建筑 ... -
广义对象论
2006-01-25 15:31 687前几天本想接着以前的思维中对“3.2 Programming ... -
Thinking Everyday III
2006-03-26 14:17 7871, RAII让我告别了delete,IoC让我告别了ne ... -
简单至及的AOP和IOC
2006-03-26 14:21 659I. AOP的例子 1, Google To ... -
TDD: Tricky Driven Development
2007-05-10 07:07 590命名 测试用例的名字应该描述需求, 不要描述实现. ... -
Thinking Everyday IV
2007-05-15 04:36 5191, 实际上 C# 2.0 已经部 ... -
迭代本质论
2008-02-14 13:58 628新年伊始, 可能你又要制定一些计划了, 实际上, 你的生活在开 ... -
建筑的永恒之道
2004-08-10 18:31 6482,质 这种特质是任 ...
相关推荐
僵尸网络,也称为Botnet,是互联网安全领域的一大威胁,由大量被恶意软件感染的设备组成,这些设备在黑客的远程控制下进行恶意活动。这些受控设备,或称为“肉鸡”,可能位于家庭、学校、企业甚至政府机构中,它们在...
SIP: Understanding the Session Initiation Protocol, Fourth Edition 英文原版,第4版
Understanding the Netflix architecture and its performance can shed light on how to best optimize its design as well as on the design of similar on-demand streaming services. In this paper, we ...
SIP: Understanding the Session Initiation Protocol, Second Edition by Alan B. Johnston ISBN:1580536557 Artech House © 2004 (310 pages) Essential reading for anyone involved in the development and ...
2020 CSA Key Management in Cloud Services:Understanding Encryption’s Desired Outcomes and Limitations(云服务中的密钥管理:了解加密的预期结果和局限性) - 最新完整英文电子版(46页).zip
《SIP: Understanding the Session Initiation Protocol》第三版不仅是一本关于SIP协议的技术指南,也是一本深入了解互联网多媒体通信领域的宝贵资源。通过这本书,读者可以系统地学习SIP协议的各个方面,从而更好地...
本书《Wireless Networking: Understanding Internetworking Challenges》致力于详细、实用地解释现有的和新兴的无线网络技术与趋势,尽量减少理论背景信息的介绍。 在深入了解无线网络技术的过程中,本书不仅阐述...
领域驱动设计(DDD)是一种软件开发方法,旨在应对软件核心复杂性,通过深入理解和表达业务领域的知识来构建高质量的软件系统。在DDD中,模型不仅是技术实现的一部分,更是理解和沟通业务规则、流程和术语的关键工具...
本书的英文名为:Understanding GPS: Principles and Applications。由 Artech House, Boston, MA出版发行的经典之作。全面的介绍了卫星导航的基本概念,所用时间与坐标系,GPS系统的组成,卫星信号与特性,接收机的...
Matlab 科技专讲之《Understanding Kalman Filters》,该视频专讲包括7个视频,以及对应的英文字幕。(1)Why Use Kalman Filters;(2)State Observers;(3)Optimal State Estimator;(4)Optimal State ...
You’ll learn how to gain maximum value from Domain-Driven Design (DDD), define optimal supporting architecture, and succeed with modern UX-first design approaches. The author guides you through ...
由IETF SIP小组成员编著,相当权威。。内容广泛。。
Matlab 科技专讲之《Understanding PID Control》,该视频专讲包括7个视频,以及对应的英文字幕。(1)What is PID Control;(2)Expanding Beyond a Simple Integral;(3)Expanding Beyond a Simple Derivative...
Linux如此流行正是得益于它的特性丰富并且有效的网络协议栈。如果你曾经惊叹于Linux能够实现如此复杂的工作,或是你只是想通过现实中的例子学习现代网络,《深入理解Linux网络技术内幕》将会给你指导。...
Matlab 科技专讲之《Understanding Model Predictive Control》,该视频专讲包括7个视频,以及对应的英文字幕。(1)Why use MPC;(2)What is MPC;(3)MPC Design Parameters;(4)Adaptive, Gain-Scheduled ...
Matlab 科技专讲之《理解传感器融合与目标跟踪》,该视频专讲包括5个视频,以及对应的英文字幕。(1)什么是传感器融合;(2)融合磁力计、加速度计和陀螺仪来估计姿态;(3)融合GPS和IMU来估计位姿;...
世界最大的地球成像卫星星座的设计者和制造者Planet即将以3-5米的分辨率收集整个地球陆地表面的每日图像。尽管已经进行了大量的研究来跟踪森林的变化,但它通常取决于Landsat(30米像素)或MODIS(250米像素)的粗...