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

  Eric Evans的“Domain-Driven Design领域驱动设计”简称DDD,Evans DDD是一套综合软件系统分析和设计的面向对象建模方法,本站Jdon.com是国内公开最早讨论DDD网站之一,可订阅DDD专题。初学者学习DDD可从研究本站Jdon框架的DDD应用源码开始,戳这里开始。

  过去系统分析和系统设计都是分离的,正如我们国家“系统分析师” 和“系统设计师” 两种职称考试一样,这样割裂的结果导致,需求分析的结果无法直接进行设计编程,而能够进行编程运行的代码却扭曲需求,导致客户运行软件后才发现很多功能不是自己想要的,而且软件不能快速跟随需求变化。

  DDD则打破了这种隔阂,提出了领域模型概念,统一了分析和设计编程,使得软件能够更灵活快速跟随需求变化。见下面DDD与传统CRUD或过程脚本或者面向数据表等在开发效率上比较:

  服务器后端发展三个阶段:

  1. UI+DataBase的两层架构,这种面向数据库的架构(上图table module )没有灵活性。
  2. UI+Service+DataBase的多层SOA架构,这种服务+表模型的架构易使服务变得囊肿,难于维护拓展,伸缩性能差,见这里讨论或Spring Web 应用的最大败笔.
  3. DDD+SOA的事件驱动的CQRS读写分离架构,应付复杂业务逻辑,以聚合模型替代数据表模型,以并发的事件驱动替代串联的消息驱动。真正实现以业务实体为核心的灵活拓展。

  DDD革命性在于:领域模型准确反映了业务语言,而传统J2EE或Spring+Hibernate等事务性编程模型只关心数据,这些数据对象除了简单setter/getter方法外,没有任何业务方法,被比喻成失血模型,那么领域模型这种带有业务方法的充血模型到底好在哪里?

  以比赛Match为案例,比赛有“开始”和“结束”等业务行为,但是传统经典的方式是将“开始”和“结束”行为放在比赛的服务Service中,而不是放在比赛对象本身之中。我们不能因为用了计算机,用了数据库,用了框架,业务模型反而被技术框架给绑架,就像人虽然是由母亲生的,但是人的吃喝拉撒母亲不能替代,更不能以母爱名义肢解人的正常职责行为,如果是这样,这个人就是被母爱绑架了。

  提倡充血模型,实际就是让过去被肢解被黑crack的业务模型回归正常,当然这也会被一些先入为主或被洗过脑的程序员看成反而不正常,这更是极大可悲之处。看到领域模型代码,就看到业务需求,没有翻译没有转换,保证软件真正实现“拷贝不走样”。

  DDD最大的好处是:接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言,而不是数据。重点不同导致编程世界观不同。

  DDD是解决复杂中大型软件的一套行之有效方式,在国外已经成为主流。DDD认为很多原因造成软件的复杂性,我们不可能避免这些复杂性,能做的是对复杂的问题进行控制。而一个好的领域模型是控制复杂问题的关键。领域模型的价值在于提供一种通用的语言,使得领域专家和软件技术人员联系在一起,沟通无歧义。

  DDD在软件生产流程中定位i如下图,DDD落地实现离不开in-memory缓存、 CQRS、 DCI、 EDA或Event Source几大大相关领域。

From:http://www.jdon.com/ddd.html

转载于:https://www.cnblogs.com/cnlht/p/9495641.html

领域驱动设计(DDD:Domain-Driven Design)相关推荐

  1. 实施领域驱动设计(Implementing Domain Driven Design翻译)

    实施领域驱动设计(Implementing Domain Driven Design翻译) 引言 介绍 这是实现领域驱动的实用指南设计(DDD).虽然实现细节依赖于ABP 框架基础设施,但是核心概念. ...

  2. 初探领域驱动设计(Domain Driven Design)

    前言: 我个人在学习DDD的过程中,早期翻找各种资料的时候,看到了很多名词:战略设计.战术设计.聚合根.实体.值对象.界限上下文...这些繁多的名词定义配合上几乎少的可怜的实战例子,让我在翻阅了大量资 ...

  3. 领域模型驱动设计(Domain Driven Design)入门概述

    软件开发要干什么: 反映真实世界要自动化的业务流程 解决现实问题 领域Domain Domain特指软件关注的领域 在不能充分了解业务领域的情况下是不可能做出一个好的软件 领域建模 领域模型驱动设计 ...

  4. 【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得

    DDD做为软件设计方法于2004年提出,一直不温不火,最近几年突然火起来了,为啥呢?正所谓机会给有准备的人,因为微服务的流行,大家都跃跃欲试把传统单体软件转成微服务架构,但理论很丰满,现实很骨感,光是 ...

  5. 领域驱动设计(DDD)实践之路(一)

    本文首发于 vivo互联网技术 微信公众号  链接: https://mp.weixin.qq.com/s/gk-Hb84Dt7JqBRVkMqM7Eg   作者:张文博 领域驱动设计(Domain ...

  6. DDD(Domain Driven Design) 领域驱动设计从理论到实践 四

    - 接上 SOA 架构 ​     面向服务架构(Service Oriented Architecture,SOA)对于不同的人来说意思不同.这里梳理一下SOA原则: 服务契约 : 通过契约文档,服 ...

  7. DDD(domain driven design)-领域驱动设计

    domain driven design-领域驱动设计 领域驱动设计概述 背景 软件架构模式的演进 概念 分层架构与六边形架构 分层分包 复杂是我们软件生涯的一生之敌. 分层架构 & 面向过程 ...

  8. [理论]领域驱动设计 DDD 是啥,cqrs是啥

    父文章 如何成为一名架构师,架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客_架构师成长之路 [落地版]领域驱动落地 [理论版]领域驱动设计DDD 代码框架 · 语雀 子文章 如何写可维护 ...

  9. 领域驱动设计 (DDD)实例分析

    本文结合实例来分析下领域驱动设计 (DDD) 文章目录 啥是DDD 啥是驱动 DDD误解 啥时候用 啥是复杂 具体解决啥 为啥会耦合 咋解决耦合 咋做分治 咋做分界 模块 分层 咋落地 本文小结 啥是 ...

最新文章

  1. java计算器的重点解决问题_java计算器问题
  2. Swift 中的内存管理详解
  3. 端口扫描程序nmap使用详解
  4. 集中配置管理工具puppet安装使用
  5. 【正一专栏】王者的尊严和荣耀
  6. 今天开始在博客园正式安家!
  7. python去重复元素_python 去除单个list中的重复元素
  8. mysql5.6 1g内存_1G内存用MySQL5.6还是用MySQL5.5比较好
  9. addeventlistener事件参数_Vue的钩子事件和程序化侦听
  10. 两天,我把分布式事务搞完了
  11. 德克萨斯州ADRN组织支持12种加密货币捐赠 现已收到700美元ETH捐款
  12. asp.net中用后台代码创建datatable和html表格,ASP.NET中用后台代码创建DataTable和HTML表格...
  13. stackexchange.mysql_StackExchange.Redis客户端读写主从配置,以及哨兵配置。
  14. TKMybatis的使用大全和例子(example、Criteria、and、or)
  15. 如何采用类比法和类推法估算软件项目工作量
  16. Mixly 二次开发 自定义库 OLED
  17. 路由器连接光猫用桥接模式好还是用路由模式好?路由器桥接模式vs路由模式
  18. 通达信自带指标 均线多头排列(DTPL)
  19. 使用openocd调试Linux内核,OpenOCD-JTAG调试(示例代码)
  20. 电子商务网站的设计与实现(一):当前的一些购物体验和开发期望

热门文章

  1. 【源码解析】ArrayList源码解析
  2. 【laravel】laravel的基础学习笔记
  3. JQuery Smart UI 简介(五) — 框架设计【前篇】(前台UI层架构)
  4. 【编程题】简单的四则运算
  5. 弹指之间 -- Waltz
  6. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
  7. 关于Python中的self
  8. 解决忘记oracle管理员密码(转)
  9. WF初学者对工作流的认识
  10. MVC3 ActionResult 返回类型