这篇文章讨论领域驱动设计(DDD),DDD是建立在面向对象分析设计上开发软件的一种方法。 通过这篇文章我们解释什么是领域驱动设计,在现代开发周期中如何实现,使用DDD的优点和缺点。

什么是领域

定义DDD之前我们首先必须要说明在开发中”领域”的含义。领域在字典中的解释是:“活动或者知识的范围”,更深层次的来讲,软件工程中领域指的是软件应用的地方。 换句话说,在软件开发中,领域指的是”应用程序逻辑范围的知识和活动”

另一个在软件开发中常使用的术语是领域层或领域逻辑,对于开发者来说,说成是业务逻辑或许应该会更加熟悉。应用程序业务逻辑指的是业务对象如何与其他业务对象交互(如何生成对象,修改相关数据)这种更高级别的规则。

什么是领域驱动设计

最先介绍领域驱动设计的是在程序员 Eric Evans 2004年出版的《领域驱动设计:复杂软件核心复杂应对之道》书籍中,领域驱动设计是领域概念的扩展和应用,并且将它应用在软件开发中。它的目标是将软件相关部分连接到不断发展的模型中,以此更容易创建复杂的应用,DDD关注三个核心点:

.关注核心领域和核心领域逻辑。

.在领域模型中进行复杂性设计。

.与领域专家紧密合作,以此改进应用模型和解决新出现的领域问题。

Evans的《领域驱动设计:复杂软件核心复杂性解决之道》一书中定义了几个常用的术语,在实践DDD和讨论DDD的时候非常有用。

.Context(上下文):单词或者语句出现的环境,它决定了单词或语句的含义。关于模型的语句只能在上下文中理解。

.Model(模型):一个系统的抽象,用于描述领域的某个方面,并且能够用于解决领域相关的问题。

.Ubiquitous Language(统一语言):与领域模型相关的结构化语言,用于将团队成员的活动与软件连接起来。

.Bounded Context(上下文边界):模型定义的范围和适用范围的描述(比如,子系统,特定团队的工作)。

构建块

领域驱动设计同样也定义了几个连接领域模型的高层次概念,以此来修改,创建领域模型。

.Entity(实体):连续状态变化的对象,而不是传统使用属性来定义的对象。

.value object(值对象):一个不可变且有属性的对象,但是它没有唯一的标识符。

.Domain Event(领域事件):系统内记录与模型活动相关的分离事件的对象,系统内所有的事件都应该能够被跟踪,一个领域事件仅被领域专家关心的事件类型创建。

.Aggregate(聚合):根据组边界定义值对象和实体的聚合, 而不是允许单个实体或者值对象执行它自己所有的动作,聚合的对象都有一个统一的根对象(在书籍中写的是选择一个实体作为根),这样,外部对象不再直接访问聚合内部的单个对象或者实体,而是直接访问单一的聚合根对象,并且使用这个对象将指令传递给对应的分组。这个实践和设计模式编码相关联。

.Service(服务):本质上是来说,一个服务就是一个操作或者业务逻辑的组合,这样就表明了它在对象领域中不适用。换句话来说,如果某些功能必须存在且不能和实体或者值对象相关联,它可以定义为服务。

.Repositories(仓库):不要和常见的版本控制仓库相混淆,仓库在DDD里面的意思就是一个服务,它提供一个全局接口来访问特定聚合内部所有的实体类和值对象。应该包括创建,修改,删除聚合内部对象的方法。然而,通过使用仓库服务来构造数据查询的目的是删除业务逻辑对象模型中的数据查询方法。

.Factories(工厂):正如我们在设计模式文章里面讨论的那样,DDD建议使用工厂来创建复杂对象和聚合,保证客户端不用知道对象内部组成。

同样,DDD也着重强调越来越流行的持续集成实践,它要求所有开发团队使用同一个仓库共享代码,并且每天推送代码到仓库。在每天结束的时候自动检查代码仓库完,运行单元测试,回归测试等过程。这样就可以快速检测出潜在存在的问题并在下一次提交代码的时解决这个问题。

领域驱动设计优点

.沟通简单:团队成员使用与领域模型相关的统一语言来沟通会更加容易。通常来说,在讨论应用程序时DDD使用更少的技术行业术语,因为在先前建立的统一语言定义了更简单的术语来指代哪些更具有技术性的术语。

.提高灵活性:DDD基于面向对象分析和设计相关的概念,几乎领域模型内的任何东西都基于对象,因此十分便于分模块。这就可以对各个组件,整个系统作出持续性的修改。

.在接口上强调领域:DDD是围绕领域概念和领域专家建议进行构建的实践活动,与哪些首先强调UI/UX的应用程序不同,DDD总是会生成适合当前领域的应用程序。虽然需要明显的平衡,但是聚焦于DDD意味者能够产生一个与该领域用户有共鸣的产品。

领域驱动设计的缺点

.需要精力充沛的领域专家:即使有最精通技术的开发人员,如果团队内没有一个知道应用程序使用领域相关的领域专家,那也是没有意义的。在某些情形下,领域驱动设计需要一个或多个外部人员在整个软件开发生命周期中扮演领域专家的角色。

.鼓励迭代实践:虽然许多人觉得这是一个优势,不可否认,DDD实践强烈依赖连续迭代和持续集成来构建易于修改的项目。某些团队在实践这个的时候可能会遇到问题,特别是那些过去经验与不太灵活的开发模型有关,比如瀑布模型。

.不适用偏向技术型的项目:DDD适用于领域复杂的应用(业务逻辑复杂),它不适用于边界复杂的领域,类似这种领域都有高的技术复杂性。DDD着重强调需要领域专家生成正确的统一语言并且一起写出项目的领域模型,但是领域专家来极难把握具有极高技术复杂性的项目,因此可能导致全体团队成员没有完全理解技术上的要求和限制。

领域驱动设计-什么是领域驱动设计和怎么使用它相关推荐

  1. 我的领域驱动设计运用实例 - 领域啊领域

    一.前言 断断续续的也有在闲余时间接触领域驱动设计的相关知识,因为目前在工作中更多的还只是一名 crud boy,因此目前也只是对其中的某些知识点有知晓,实际使用的比较少,仅此而已.因此,趁着这个春节 ...

  2. 领域驱动设计战术模式--领域事件

    使用领域事件来捕获发生在领域中的一些事情. 领域驱动实践者发现他们可以通过了解更多发生在问题域中的事件,来更好的理解问题域.这些事件,就是领域事件,主要是与领域专家一起进行知识提炼环节中获得. 领域事 ...

  3. 架构设计 中台与领域驱动设计

    架构设计 中台与领域驱动设计 1. 中台与领域驱动关系 2. 中台概述 2.1 中台是什么 2.2 中台特点 2.3 中台分类 3. DDD领域驱动设计 3.1 什么是领域驱动设计 3.2 为什么用领 ...

  4. 领域驱动设计(3)模型驱动设计

    前面的章节强调过软件开发过程的重点:它必须以业务领域为中心. 我们说过让模型植根于领域.并精确反映出领域中的基础概念是建立模型的一个最重要的基础. 通用语言应该在建模过程中广泛尝试以推动软件专家和领域 ...

  5. 基于DDD(领域驱动设计)的微服务设计实例

    目录 一.战略设计: 1.产品愿景 2.场景分析 3.领域建模 1)提取领域对象 2)构建聚合 3)划分界限上下文 4.微服务拆分 二.战术设计 1.分析微服务领域对象 1)服务识别和设计 2)聚合内 ...

  6. 基于MM32SPIN360C芯片的低压无刷电机设计 电机开发板驱动有感 BLDC 的操作方法

    近年来,无刷直流电动机在众多领域中得到广泛应用.无论是电动汽车.家用电器,还是工业控制和医疗器械都有它的身影.无刷直流电动机之所以如此广受青睐,除了保持了有刷直流电动机优越的启动性能和调速性能外,其最 ...

  7. 肉肉谈对需求设计的想法--到底是功能驱动界面?还是界面驱动功能?

    所有的软件开发无非都离不开那几个阶段第一步:需求调研分析 第二步:概要设计 第三步:详细设计 第四步:编码 第五步:测试 第六步:软件交付准备 其实对于一个程序员来说,最为关心的当然是CODING,但 ...

  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离

    文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...

  9. [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)

    目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...

最新文章

  1. 【问题收录】INSTALL_FAILED_NO_MATCHING_ABIS
  2. 关于keras的class_weight与sample_weight(解决样本不均衡或类别不均衡问题)
  3. 共享之windows与Linux
  4. 如何做好SOC的一点点体会
  5. 牛腩新闻发布系统——后台前台整合技术
  6. LeetCode Roman to Integer(罗马数字转换)
  7. wordpress插件在服务器上的存储位置
  8. Elasticsearch7.15.2 修改IK分词器源码实现基于MySql8的词库热更新
  9. 解密:90后程序员青睐哪些互联网公司?
  10. 高考计算机专业最低分数线是多少,2021最低多少分可以稳上二本 高考二本分数线是多少...
  11. Linux 7配置named,centos7dns服务器配置文件name.conf权限问题
  12. 文件和文档的比较工具
  13. MySQL高可用架构故障自动转移插件MHA
  14. 分布式系统中Topology(Rack) Awareness的实现思路
  15. h5支付不能打开支付宝 ios_iOS解决H5支付跳转到支付App及返回原App问题
  16. Nginx安装成windows server 2016机器的服务
  17. 【ZZ】从入门到高阶,你需要刷哪些书?丨高中物理竞赛辅导书推荐
  18. html根据PC手机设置不同背景图,Html-根据不同的分辨率设置不同的背景图片
  19. 面包店算法c语言,Lamport面包店算法
  20. 常数乘以无穷大等于多少_请教一个数学问题:无穷大乘以无穷小等于多少?

热门文章

  1. 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析
  2. Python基础概念_9_输入输出
  3. 大学计算机应用技术基础,大学计算机应用技术基础实践教程(Windows7+Office2010/21世纪高等学校计算机规划教材...
  4. 如何建立java ssm工程_如何搭建一个ssm项目
  5. 命令行下操作MySQL数据库,各种命令的使用入门示例。(附图)
  6. 转载+记录数据增广的八种常用方式
  7. 将RHEL7/centos7系统网卡名称eno16777736改为eth0
  8. Windows中32位(x86)和64位(x64)解释
  9. 树回归源码分析(1)
  10. 全局变量名为 param1 var param1Value = webBrowser1.Document.InvokeScript(eval,new String[]{ param1}).To...