领域驱动设计(DDD:Domain-Driven Design)

摘要:
反映真实世界中要自动化的业务流程。解决实际问题。DomainDomain是指软件关注的领域。做一个好的软件领域建模是不可能的。领域模型驱动设计。分层架构。实体值对象服务模块。聚合工厂资源库。层次结构:这个领域概念通常不属于实体或价值对象。要执行的操作涉及域中的其他对象操作,即无状态服务对象不再具有内置状态服务对象,从而在协调公共语言的开发中发挥重要作用。

软件开发要干什么:

反映真实世界要自动化的业务流程
解决现实问题

领域Domain

Domain特指软件关注的领域
在不能充分了解业务领域的情况下是不可能做出一个好的软件

领域建模

 领域驱动设计(DDD:Domain-Driven Design)第1张

 领域驱动设计(DDD:Domain-Driven Design)第2张

 领域驱动设计(DDD:Domain-Driven Design)第3张

 领域驱动设计(DDD:Domain-Driven Design)第4张

 领域模型驱动设计

  1. 分层架构
  2. 实体
  3. 值对象
  4. 服务
  5. 模块
  6. 聚合
  7. 工厂
  8. 资源库

分层架构

领域驱动设计(DDD:Domain-Driven Design)第5张
 
  • 将领域模型相关的代码集中到一个层中,把它从用户界面、应用和基础设施代码中分隔开来
  • 释放领域对象的显示自己、保存自己、管理应用任务等职责,让它专注于展现领域模型
  • 复杂的程序切分成层
  • 层中采用内聚的设计
  • 层仅依赖于它底下的那层

 
领域驱动设计(DDD:Domain-Driven Design)第6张
 

实体entity:有一类对象拥有唯一标识符
  • 能够跨越系统的生命周期甚至能超越软件系统的一系列的延续性和标识符
  • 这样的对象称为实体。
值对象-value Object
  • 对某个对象是什么不感兴趣,只关心它拥有的属性
  • 用来描述领域的特殊方面、且没有标识符的一个对象,叫做值对象
  • 能被简单的创建和丢弃,生命周期中不会被持久化
  • 值对象可以被共享,值对象应该不可变
服务-service(比webservice更细粒度服务描述)
  • 领域中的一些动词,代表了领域中的一个重要的行为,却不属于任何对象
    • 服务执行的操作涉及一个领域概念,这个领域概念通常不属于一个实体或者值对象
    • 被执行的操作涉及到领域中的其他的对象
    • 操作是无状态的
  • 服务对象不再拥有内置的状态
  • 服务对象担当重要的协调功能
  • 开发通用语言时,领域中的主要概念被引入到语言中,语言中的名词很容易被映射成对象。
语言中对应那些名词的动词变成那些对象的行为。但是有些领域中的动作,它们是一些动词,看上去却不属于任何对象。它们代表了领域中的一个重要的行为,所以不能忽略它们或者简单的把它们合并到某个实体或者值对象中。给一个对象增加这样的行为会破坏这个对象,让它看上去拥有了本该属于它的功能。

模块

  • 将相关领域模型提炼分类,分而治之
  • 将高关联度的模型分组到一个模块以提供尽可能大的内聚(以能完整完成任务为准)
  • 分层是水平划分
  • 模块是垂直划分(Domain内部)
 
领域驱动设计(DDD:Domain-Driven Design)第7张

 
领域驱动设计(DDD:Domain-Driven Design)第8张
 

 
领域驱动设计(DDD:Domain-Driven Design)第9张
 

 
领域驱动设计(DDD:Domain-Driven Design)第10张
 

参考架构概述

  • 领域驱动设计(DomainDriven Design)有一个官方的sample工程,名为DDDSample
  • 官网:http://dddsample.sourceforge.net/
  • 该工程给出了一种实践领域驱动设计的参考架构

架构概述

 
领域驱动设计(DDD:Domain-Driven Design)第11张
 

详细架构
 
领域驱动设计(DDD:Domain-Driven Design)第12张
 

架构详解:Interfaces-接口层
 
领域驱动设计(DDD:Domain-Driven Design)第13张
 
  • 该层包含与其他系统进行交互的接口与通信设施,在多数应用里
  • 可能提供包括WebServices、RMI或Rest等在内的一种或多种通信接口
  • 该层主要由Facade、DTO和Assembler三类组件构成,三类组件均是典型的J2EE模式
DTO
 
领域驱动设计(DDD:Domain-Driven Design)第14张
 
  • DTO- DataTransfer Object(数据传输对象),也常被称作VO-ValueObject(值对象)
  • DTO设计之初是为了将细粒度的领域对象包装为粗粒度的数据结构,减少网络通信并简化调用接口

DTO 作用

  1. 减少网络流量
  2. 简化远程对象和远程接口
  3. 传输更多的数据减少远程调用次数
  4. 避免将领域状态跨层次传递
  5. 由于同步和版本控制增加了复杂性
DTO 应用时序图
 
领域驱动设计(DDD:Domain-Driven Design)第15张
 

Assembler
 
领域驱动设计(DDD:Domain-Driven Design)第16张 
  • DTO与领域对象之间的相互转换工作多由Assembler承担
  • 因此Assembler几乎总是同DTO一起出现。
Assembler 实现方案
 
领域驱动设计(DDD:Domain-Driven Design)第17张
 

Façade
 
领域驱动设计(DDD:Domain-Driven Design)第18张 
  • 实践Facade的过程中最难把握的问题就是Facade的粒度问题。
  • 传统的Service均以实体为单位进行组织,而Facade应该具有更粗粒度的组织依据,较为合适的粒度依据有:
  • 一个高度内聚的模块一个Facade
  • 或者是一个“聚合”(特指领域驱动设计)一个Facade.
Facade 实现方案
 
领域驱动设计(DDD:Domain-Driven Design)第19张
 

Facade 应用时序图
领域驱动设计(DDD:Domain-Driven Design)第20张
 

Service
 
领域驱动设计(DDD:Domain-Driven Design)第21张
 

Service会与多种组件进行交互,这些组件包括:
  • 其他的Service
  • 领域对象
  • Repository
  • DAO
Service 应用时序图
 
领域驱动设计(DDD:Domain-Driven Design)第22张
 

Domain-领域层
 
领域驱动设计(DDD:Domain-Driven Design)第23张
 

} Domain层是整个系统的核心层,该层维护一个使用面向对象技术实现的领域模型,几乎全部的业务逻辑会在该层实现
} Domain层包含:
◦ Entity(实体)
◦ ValueObject(值对象)
◦ Domain Event(领域事件)
◦ Repository(仓储)等
Infrastructure-基础设施层
 
领域驱动设计(DDD:Domain-Driven Design)第24张
 
  • 基础设施层nfrastructure为Interfaces、Application和Domain三层提供支撑
  • 所有与具体平台、框架相关的实现会在Infrastructure中提供,避免三层特别是Domain层掺杂进这些实现,从而“污染”领域模型
  • Infrastructure中最常见的一类设施是对象持久化的具体实现
“传统”架构-贫血领域模型
 
领域驱动设计(DDD:Domain-Driven Design)第25张
 

DDD && SOA
  • DDD 领域模型驱动设计
  • SOA 面向服务的架构

免责声明:文章转载自《领域驱动设计(DDD:Domain-Driven Design)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mybatis 详解(六)------通过mapper接口加载映射文件CentOS 基本操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

由SpringMVC中RequetContextListener说起

零、引言 RequetContextListener从名字结尾Listener来看就知道属于监听器。 所谓监听器就是监听某种动作,在其开始(初始化)和结束(销毁)的时候进行某些操作。 由此可以猜测:该类用于在RequetContext(请求上下文对象)创建和销毁的时候进行某些操作(哪些操作?结尾总结!) 一、web.xml配置要使用该listener对象...

十年磨一剑 Delphi再传奇

         新年伊始,英巴卡迪诺公司(Embarcadero)就在其官网发布了“激动人心的RAD Studio2018年发展规划”公告(见下图)。公告中指出,将在于2018年发布10.3.X新版本,新版本兼容Ext JS前端开发,支持快速WEB应用软件开发。这是继去年Delphi正式支持64 位 Linux 服务器应用开发之后又一个重大利好消息。英巴...

js的原型链

开篇 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述。有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就说明你没有真正的理解。最近正在读《Javascript高级程序设计》,书中对原型对象和原型链的描述让我受益匪浅,下面仅用一个对比性的例子来说明。 我们经常会这...

JS-鼠标、键盘事件及事件对象/event

事件对象/event event包含了发生事件的所有信息内容,不如:发生事件类型,发生事件的元素,键盘按下状态等等 事件对象的创建,当事件发生时,游浏览器帮我们创建的,并通过参数的形式传递给事件处理程序的 事件获取方式 //IE window.event; ​ //非IE arguments[0]; //事件处理程序的参数,第一个参数默...

python的接口和抽象类

抽象基类有些面向对象的语言,如JAVA,支持接口,可以声明一个支持给定的一些方法方法,或者支持给定存取协议的类。抽象基类(或者ABCs)是Python里一个相同的特性。抽象基类由abc模块构成,包含了一个叫做ABCMeta的metaclass。这个metaclass由内置的isinstance()和issubclass()特别处理,并包含一批会被Pytho...

R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错

  R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错 笔者寄语:机器学习中交叉验证的方式是主要的模型评价方法,交叉验证中用到了哪些指标呢? 交叉验证将数据分为训练数据集、测试数据集,然后通过训练数据集进行训练,通过测试数据集进行测试,验证集进行验证。 模型预测效果评价,通常用相对绝对误差、平均绝对误差、根均方差、相对平方根误差等指标来衡...