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

领域驱动设计简称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下面,相关人员都使用一种统一的语言,以此来保证团队成员之间沟通能畅通无阻;

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

时间: 2024-09-20 16:24:46

架构师速成6.8-设计开发思路-领域驱动的相关文章

架构师速成6.3-设计开发思路

面向对象,是一个伟大的设计思想,应该是软件开发史上的一次革命. 当然理解面向对象也很难,有好多人用着面向对象的语言,写着面向过程的逻辑,而且一写就是好多年.但是有高手,用c照样可以写出很牛的面向对象的程序.面向对象其实是一种思考问题的方式,重点如下: 面向对象是用来反映显示世界的,而不是强行创造世界. 这句话,说起来简单,但是做起来很难.现实世界中你绝对不会把狗腿,按在一个人身上,但是写程序的时候,你常常会创造出一个狗腿人. 有人还会创造一些一些稀奇古怪的万能类,或者融合了n种物种的怪物.或者只

架构师速成6.7-设计开发思路-uml

uml是什么东西?统一建模语言,一门语言,是用来进行软件设计的一门语言. 其实一门语言的诞生并不伟大,让大多数人都使用才足够伟大.uml就是一门伟大的语言,因为目前软件设计的唯一语言就是它. UML其实还是比较简单的,就那么几个图形,那么几种模式,但是因为他是唯一的语言,所以有设计能力的人都能很容易看懂你说的什么,这就是他的伟大之处. 我说一下在软件设计中最常用的几个,以及我的心得: 用例图,在了解用户需求时非常有效,他仅用来描述系统需要提供的功能,本身没有顺序,不要用来描述流程.注意使用扩展和

架构师速成-目录

天地会总舵,陈近南给了韦小宝一本武功秘笈,韦小宝说:"嗯?这么大一本我看要练个把月啊!" 陈近南说:"这本只不过是绝世武功的目录,那边才是绝世武功的秘笈!" 这就是架构速成的秘笈目录 架构师速成1-前言 架构师速成2-概述 架构师速成2.1-论成功 架构师速成2.2-论成功 架构师速成3-开发者境界 架构师速成4-幼儿园 架构师速成4.1-幼儿园要学会如何学习 架构师速成4.2-幼儿园要学会如何学习 架构师速成4.3-幼儿园要学会查找资料 架构师速成5-小学 架构师

架构师速成2-概述

成为一名合格的架构师,需要经历菜鸟.码农.资深码农.项目经理.技术经理.架构师等一系列的过程.为了让大家通俗易懂,我把整个过程按照大家熟知的上学的顺序排了一下,从幼儿园-小学-中学--一直到博士,至于博士后需要大家自己去实践和想象了.每个过程我都会进行统一的描述: 阶段:例如 幼儿园 需要做的事情:例如 学会一门编程语言 完成任务耗时:例如 2-5个月 升级标准:例如:能写出简单的计算器,接受用户输入的+-x/运算 风险:例如 有人打断 当然在正式开始之前,我还是要提示一下相关的风险: 任何行业

架构师速成-如何高效编程

今天看见有个csdn的征文大赛,谈谈如何高效编程,正好之前有些感触,先沉淀下来. 引子 赵云大喝一声,挺枪骤马杀入重围,左冲右突,如入无人之境.那枪浑身上下,若舞梨花:遍体纷纷,如飘瑞雪. 赵云是所有历史人物中我最喜欢的一个,如果放到现代,他走了it的道路,一定可以成为一个编程高手.为什么? 其实古时打仗也是一门技术活,需要有勇有谋,跟it没有什么太大的区别.打仗要修身.修技.修器才能左冲右突,如入无人之境,同样做it也要修身.修技.修器,才能高效编程,如入无人之境. 高效编程的修炼 何谓修身.

架构师速成-架构体系

经过这段时间的反思和整理,终于对架构有了一个较为明确的理解.架构是产品从无到有以及慢慢壮大过程中所需要的全部技术体系总称,架构过程: 配置.编码.测试.运维.监控分析.安全.运营等一系列技术体系的选型.取舍 技术选型基础上进行规划.设计.实现.迭代.制定相关规范 相关技术及规范运用到产品开发的整个过程中,并在产品迭代过程中对架构进行迭代优化 架构不止包含技术的框架,比如有人用了spring就觉得我已经是架构师了,其实架构并不是这么简单.我们以做一个新浪微博类似产品为例,现实应该是这样的: 产品初

架构师速成5-小学

很高兴你很快的进入了小学,小学的东西会让你更加的耀眼. 阶段: 小学 学时:2-3个月 升学标准 能自己制定目标及计划,get thing done. 可以轻松制作一个让你身旁人惊叹的ppt 能做一个简单的网站(或者客户端软件),数据能保存到数据库. 实践经验干货来了. 先说ppt吧,这个上一期已经讲了,如果你ppt做到出神入化,基本不需要做架构这么苦逼的事情了.因为你很容易成为老板的心腹,军师,走上人生正道.作为一个苦逼的小学程序员,很羡慕吧.那就再努力学一下,不用多久,你就会升职加薪,当上总

架构师速成3-开发者境界

修炼的境界自下而上分为: 筑基.开光.融合.心动.金丹.元婴.出窍.分神.合体.洞虚.大乘.渡劫 其实开发者也可以按照修炼的境界进行划分: 入门.对象.模式.框架.架构 1.入门 初学者就是为了把功能实现,不考虑其他,此时根本不考虑可读或者可修改性. 2.对象 以面向对象方式进行编码,把代码分开写到不同的对象中,能够进行跨对象的交互. 3.模式 关键点可以使用设计模式进行设计 4.框架 某一语言内部进行高度封装,使常用的功能开发步骤极度简化,提升开发效率,并极大降低对开发人员的要求.例如使用sp

架构师速成7.3-devops为什么很重要

evops是一个很高大上的名字,其实说的简单点就是开发和运维本身就是一个团队的,要干就一起把事情干好.谁出了问题,网站都不行.作为一个架构师,必须要devops,而且要知道如何推行devops. 首先要自动化,举个阿里的例子,阿里通过aone系统来实现半自动化部署: 开发人员开发代码先自测通过后,提交代码到git. 在aone中一键部署到日常环境.部署是自动化扫描依赖冲突,系统安全等问题. 测试接到部署成功的通知,进行测试,如果测试通过,则审批通过,可以线上发布. 线上运维人员一键部署到线上,部