领域驱动设计简称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. DB2 catalog
  2. 《C++STL基础及应用》读书笔记
  3. 图形处理(十二)拉普拉斯网格优化、最小二乘网格模型光顺
  4. GetModuleFileName 获取当前进程主模块完整路径
  5. 怎么在VS监视DataSet类型的数据
  6. mysql 并发_mysql如何处理高并发
  7. PHP5.1时间相差8小时问题解决。
  8. lamp 安装 mysql_linux lamp之离线安装mysql
  9. java启动应用_java 学习:在java中启动其他应用,由jenkins想到的
  10. android从子页面跳转回主页面注意
  11. Jflash源码分析
  12. vray渲染出图尺寸_3d最终渲染参数设置、vr相片级成品参数值
  13. 品优购架构和数据库结构
  14. 结算系统功能详解-上篇
  15. react插件,树状图(可自由定义子节点结构,大小,样式)
  16. STM32第二十一课(USB SLAVE, HAL)
  17. 钉钉发起审批流程分析
  18. 效率源应邀出席“第九届刑侦、禁毒、反恐新技术新产品应用交流暨高峰论坛”
  19. 百度网盘完美不限速下载,60MB/s,卢本伟修改!
  20. java oracle 流水号_Oracle生成流水号函数

热门文章

  1. [LeetCode] 679. 24 Game(回溯法)
  2. MarkdownPad2添加目录(输出为HTML时可用)
  3. 【转】地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法 C语言
  4. 软件整合--硬件整合--平台整合
  5. 头文件 ctype.h 以及函数 isalpha() tolower()
  6. Kafka万亿级消息实战干货~持续更新中
  7. html if语句_轻量html模版渲染库 cJinja
  8. Linux文本记录中文是?,linux操作手冊(中文).doc
  9. linux下安装mysql_Linux下安装mysql-8.0.20的教程详解
  10. spark的rdd的含义_Spark里边:到底是什么RDD