领域驱动设计简称DDD,很好的名字,先来普及一下相关的名词缩写:

测试驱动设计 TDD,行为驱动设计 BDD,面向对象设计 OOD,面向过程设计 OPD。

设计思路和方法是一项专门的技能,区别于设计模式,编程语言。UML是设计的工具,设计方法是设计的灵魂,而且设计方法并没有好坏之分。关键是你需要掌握各种设计方法,在做项目时信手拈来,才是真正的高手。为什么要讲领域驱动设计,因为在做大型系统时,领域驱动设计会让你事半功倍,得心应手。

网上找到一篇总结的文章,写到比我写的好,那就直接转帖吧http://www.cnblogs.com/netfocus/p/4492486.html,原帖地址。

  1. 领域驱动设计(DDD)是一种基于模型驱动的软件设计方式。它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题。Eric Ivans为领域驱动设计提出了大量的最佳实践和经验技巧。只有对领域的不断深入认识,才能得到一个解决领域核心问题的领域模型。如果一个应用的复杂性不是在技术方面的,而是在领域本身,即领域内的业务很复杂,那这种应用,使用领域驱动设计的价值就越大。
  2. 领域驱动开发也是一种敏捷开发过程(极限编程,XP),强调迭代开发。在迭代过程中,强调开发人员与领域专家需要保持密切的合作关系。极限编程假设我们能通过不断快速重构完善设计。所以,对开发人员的要求非常高。
  3. 领域驱动设计提出了一套核心构造块(Building Blocks,如聚合、实体、值对象、领域服务、领域工厂、仓储、领域事件,等),这些构造块是对面向对象领域建模的一些核心最佳实践的浓缩。这些构造块可以使得我们的设计更加标准、有序。
  4. 统一语言(Ubiquitous Language),是领域驱动设计中一个非常重要的概念。任何一个领域驱动设计的项目,都需要一种通用语言,一套通用的词汇。因为没有通用的语言,就没有一致的概念,沟通就会遇到障碍,最后的领域模型和软件也就无法满足领域内的真实业务需求。通用语言是领域专家和开发人员在对领域问题的沟通、需求的讨论、开发计划的制定、领域模型的设计,以及开发人员之间对领域模型的具体编码落地实现,等一系列过程中,所有人员使用的一种通用语言。话句话说,就是无论是沟通时所用的词汇、还是领域模型中的概念、还是代码中出现的类名与方法,只要是相同的意思,那就应该使用相同的词汇。可以看出,这种通用语言不是一下子就可以形成,而是在一个各方人员讨论的过程中,不断发现、明确,与精炼出来的。
  5. 领域模型是领域驱动设计的核心。统一语言中的所有关键词汇,在领域模型上应该都能找到。各方人员沟通时,都应该以领域模型为基础。通过讨论的不断深入,大家对领域的认识也会不断深入,领域模型也会不断得到完善,统一语言的词汇也会不断丰富和精准。需要特别强调的是,开发人员应该尽量保证代码实现和领域模型相绑定,时刻保持代码与模型的一致。如果不绑定,那代码就会慢慢和模型相脱节,就会出现像我们以前那样的设计文档和代码相脱节一样的问题,甚至模型还会起到误导作用。通过这样一种思路,我们确保语言、模型、代码三者紧密绑定,确保最后实现出来的软件可以准确无误的实现业务需求,并且还能让我们的软件可以快速的和业务同时演进。而不像传统的开发方式那样,分析、设计、实现三个阶段完全脱节,最后出来的软件没有很好的满足业务需求,也不能在未来很快的跟业务需求一起演进。所以,领域模型同时承载了分析的结果和设计的结果,这里的分析是指对领域内业务需求的分析,设计是指对模型的设计以及软件的设计。所以,我们的领域模型,不能只考虑业务需求,还要同时考虑软件设计的原则,是一种综合考虑的、平衡的设计结果。
  6. 领域模型可以复用,因为特定的领域模型解决的都是某个特定的问题域;比如淘宝网有个商品中心,有个商品模型,核心概念有商品分类、商品;商品模型负责解决电子商务领域中的商品目录(Product Catalog)子域。后来阿里又出了个天猫,也会有商品中心,但是这两个商品中心基本是一样的问题域。所以,我们可以复用之前淘宝实现的商品中心领域模型,并复用之前淘宝商品中心的解决方案,来解决天猫的商品维护和展示。当然,这个只是我个人的认识,一个例子。具体阿里是否是一个商品中心同时解决淘宝和天猫的业务,没具体调研过。
  7. Bounded Context,属于一种软件构件,作用是用来对领域模型进行划分。Bounded Context有两层含义:
    • Bounded,即有边界的,表示领域模型有边界;这个边界定义了模型的适用范围,以便让负责该模型的团队知道什么该在模型中实现,什么不该;
    • Context,即领域模型的产生是在某个上下文中产生的;上下文是一个和环境相关的概念。比如一次头脑风暴会议大家达成了一个模型,那这次会议的讨论就是该模型的上下文;比如某本书中谈到了某个东西,那这个东西的上下文就是那本书,那个东西要有意义的前提离不开那本书这个上下文;所以,上下文是模型有意义的前提;
  8. 领域建模的方法有很多种,我分享一下自己的一种基于场景为核心的分析方法。大概的思路是:
    • 通过与领域专家和业务需求人员沟通,找出领域中的关键业务场景;
    • 针对每个业务场景分析出有哪些场景参与者,哪些参与者以对象(聚合)的形式参与,哪些参与者以服务的形式参与;
    • 分析每个场景参与者对象的基本状态特征;
    • 分析每个场景参与者对象分别扮演什么角色参与场景,整个场景的完整交互过程是怎样的,对象在参与场景的过程中执行了哪些交互行为;
    • 分析如何记录和跟踪这一次交互行为,分析这次交互行为会产生哪些额外的信息;
    • 上面,只是简单列了一下条目,具体的描述,请参看我的另一篇文章,有详细的叙述。
  9. 关于领域(Domain)、领域模型(Domain Model)、边界上下文(Bounded Context)的关系
    • 领域就是问题域,问题空间;
    • 领域模型是一种模型,表达了领域中哪些业务需求以及业务规则必须被满足;
    • 每一个领域中的问题,都会有一个对应的领域模型去解决;
    • Bounded Context的作用是用来对领域模型进行划分;
    • 划分领域就是对问题空间的划分,通俗的理解,就是将大问题拆分为小问题;
    • 划分Bounded Context就是将一个大的领域模型划分为多个小的领域模型;
    • 可以把Bounded Context看成是一种解决方案空间,所以,Bounded Context也可以理解为是对解决方案空间的划分;
    • 理论上,一个Domain可能会对应多个Bounded Context;同样,一个Bounded Context可能也会对应多个Domain;所以他们之间没有绝对的关系。主要是他们划分的依据不同,一个是针对领域(问题空间),一个是针对领域模型(解决方案空间);理想情况,一个Domain最好对应一个Bounded Context;
  10. 关于Domain、Sub Domain、Core Domain、Generic Domain,以及Shared Kernal的理解:
    • 一个领域(Domain)会拆分为多个子领域(Sub Domain);
    • 子领域中最核心(最重要)的那个叫Core Domain;我们应该讲团队的核心资源用在核心子域上,因为它是产品成败的关键;
    • 除了Core Domain外,其他的是支撑子域(Supporting Subdomain);
    • 有些支撑子域比较特殊,因为它解决的是一类通用问题,比如账号和权限;这类子域我们叫做通用子域(Generic Subdomain);通常,通用子域对应的Bounded Context,会跨域多个子域;
    • 多个子领域有时会有相交的部分,我们称作共享内核(Shared Kernel);体现到代码上,就是同一份代码,在两个领域模型中复用;
    • 一般只有Domain比较大的时候,我们才会划分出Sub Domain;
  11. 为什么一个大的领域模型需要划分?因为,通常一个大的领域模型需要多个团队合作完成。如果多个团队基于一个共同的领域模型工作,由于每个团队的关注点不同,且一些看似叫法一样的概念,对于不同的团队,其背后的意思完全不同。所以,这样的概念含义模糊会给团队以及成员之间的合作带来很大的困扰。所以,我们需要通过一种手段(Bounded Context),将领域模型划分为不同的部分,确保同一个Bounded Context内的领域模型所表达的概念含义明确。然后,同一个Bounded Context下面,相关人员都使用一种统一的语言,以此来保证团队成员之间沟通能畅通无阻;

当然,如果有时间还是看看《领域驱动设计》这本书吧。

架构师速成6.8-设计开发思路-领域驱动相关推荐

  1. Apache架构师的30条设计原则!

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 作者:Srinath 来源:ImportSource 本文作者叫 Srinath,是一位科学家 ...

  2. python架构师是做什么的_【图片】架构师速成-一个10多年架构师的总结_架构师吧_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 架构师速成5-小学 很高兴你很快的进入了小学,小学的东西会让你更加的耀眼. 阶段: 小学 学时:2-3个月 升学标准 能自己制定目标及计划,get thi ...

  3. python有架构师吗_运维架构师-Python 自动化运维开发-021

    *运维架构师-Python 自动化运维开发-021 十.文件操作 4.Python里的目录 所有文件都包含在各个不同的目录下,不过Python也能轻松处理.os模块有许多方法能帮你创建,删除和更改目录 ...

  4. python cs架构 运维_运维架构师-Python 自动化运维开发-005

    *运维架构师-Python 自动化运维开发-005 四.Ipython 交互式解释器 1.Ipython 简介 IPython外加一个文本编辑器 Windows系统下是IPython加notepad+ ...

  5. 架构师速成4.6-软技能和硬技能

    架构师速成4.6-软技能和硬技能 在投职和面试的过程中.雇主一般会查看求职者的两种技能:硬技能与软技能. 硬技能就是可以通过培训或可以easy量化的技能.硬技能包含以下这些: 熟练的外语能力 文凭或证 ...

  6. python executemany执行延迟_运维架构师-Python 自动化运维开发-031

    *运维架构师-Python 自动化运维开发-031 十九.Python3 操作数据库 1.Python3 操作 MySQL 1.基本介绍 Python3 操作 MySQL 数据库 可以使用的模块是 p ...

  7. python运维开发培训_运维架构师-Python 自动化运维开发-014

    运维架构师-Python 自动化运维开发-014 九.标准数据类型 1.为什么编程语言中要有类型 类型有以下几个重要角色:对机器而言,类型描述了内存中的电荷是怎么解释的. 对编译器或者解释器而言,类型 ...

  8. python 自动运维架构师_运维架构师-Python 自动化运维开发-013

    *运维架构师-Python 自动化运维开发-013 5.常用快捷键(附加课余研究) 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在下方新建行并移到新行行首 ...

  9. 【转载】架构师速成-如何高效编程

    引子 赵云大喝一声,挺枪骤马杀入重围,左冲右突,如入无人之境.那枪浑身上下,若舞梨花:遍体纷纷,如飘瑞雪. 赵云是所有历史人物中我最喜欢的一个,如果放到现代,他走了it的道路,一定可以成为一个编程高手 ...

最新文章

  1. 智能车竞赛动力锂电池
  2. Python闭包与延迟绑定
  3. linux jar命令找不到 -bash: jar: command not found
  4. 亚洲诚信服务器显示F,在Apache2服务器上部署SSL证书
  5. php数据库图片读取不出来,图片显示不出来,但是数据库里有显示
  6. Android之修改app名字客户需要升级需要注意的问题
  7. Spring MVC : 概念模型 HandlerMethod(转载)
  8. Taro+react开发(32) Please use the ‘new‘ operator, this DOM object constructor cannot be called as a fu
  9. Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)
  10. SpringCloud Eureka服务治理
  11. 图论 —— 弦图 —— LexBFS 算法
  12. 上海的雨什么时候才可以停...
  13. [渝粤教育] 西南科技大学 应用文写作 在线考试复习资料
  14. c语言输入身高计算标准体重_体质测试 | 身高 / 体重测试评分标准及方法
  15. c语言函数平方根公式,c语言求平方根公式
  16. 免费10分钟邮箱上线啦~~
  17. Merkle tree proof
  18. python下载电影天堂视频_Python抓取电影天堂电影信息的代码
  19. 【百度云破解】Aria2GUI使用教程
  20. 三星原生android手机,非原生系统??三星Android Go手机曝光

热门文章

  1. Highcharts之折线图
  2. DB服务器中的参数优化
  3. COM, COM+ and .NET 程序集的区别
  4. 配置修改Nginx支持 PATHINFO
  5. 搭建开发环境tomcat起不来
  6. 在安卓模拟器中,adb安装apk常见错误
  7. 接计算机专业怎样备考,专接本考试计算机专业复习指南.pdf
  8. html判断输入是否为空格,javascript怎么判断是否为空格?
  9. win10如何截屏_win10系统电脑截屏的多种操作方法
  10. JavaScript——正则表达式