领域驱动设计
引子
没有不变的需求,世上的软件都改动过3次以上,唯一一个只改动过两次的软件的拥有者已经死了,死在去修改需求的路上
引用:OOAD
Ant design
Ant design:服务于企业级产品的设计体系
AntDesign的设计价值观(原则)是什么?
参考:AntDesign
对象
面向对象(Object-Orientation,简称OO):系统建模技术/编程思想
面向对象编程(Object-Orientation Programming,简称OOP):按照OO的方法学来开发程序的编程方式
面向对象设计(Object-Oriented Design,简称OOD):分析模型进行整理,生成设计模型提供给OOP作为开发依据
面向对象分析与设计(Object Oriented Analysis Design,简称OOAD):现代软件企业广为采用的一项有效技术
OOAD方法要求在设计中要映射现实世界中指定问题域中的对象和实体,例如:顾客、汽车和销售人员等。这就需要设计要尽可能地接近现实世界,即以最自然的方式表述实体。所以面向对象技术的优点即为能够构建与现实世界相对应的问题模型,并保持他们的结构、关系和行为为模式。
DDD
2004年 Eric Evans:
Domain-Driven Design: Tackling Complexity in the Heart of Software
DDD(Domain-Driven Design):一套综合软件系统分析和设计的面向对象建模方法
两个阶段:
- 设计领域模型
领域专家、设计人员、开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念 - 实现领域模型
用代码来实现该领域模型
领域驱动设计事实上是针对OOAD的一个扩展和延伸,DDD基于面向对象分析与设计技术,对技术架构进行了分层规划,同时对每个类进行了策略和类型的划分。
DDD分层架构.png- 展现层
负责向用户显示信息和解释用户命令,完成前端界面逻辑。这里的用户不一定是使用用户界面的人,也可以是另一个计算机系统。 - 应用层
它是很薄的一层,负责展现层与领域层之间的协调,也是与其它系统应用层进行交互的必要渠道。应用层要尽量简单,不包含业务规则或者知识,不保留业务对象的状态,只保留有应用任务的进度状态,更注重流程性的东西。它只为领域层中的领域对象协调任务,分配工作,使它们互相协作。 - 领域层
它是业务软件的核心所在,包含了业务所涉及的领域对象(实体、值对象)、领域服务以及它们之间的关系,负责表达业务概念、业务状态信息以及业务规则,具体表现形式就是领域模型。领域驱动设计提倡富领域模型,即尽量将业务逻辑归属到领域对象上,实在无法归属的部分则以领域服务的形式进行定义。 - 基础设施层
它向其他层提供通用的技术能力,为应用层传递消息(API 网关等),为领域层提供持久化机制(如数据库资源)等。
领域
一个领域的本质是一个问题域
确定系统的所属领域,系统的核心业务(要解决的关键问题),问题的范围边界就基本确定。问题域会根据需要逐层细分,因此领域可分解为子域,子域或可继续分为子子域。
DDD领域分布图.jpeg- 核心域
决定产品和企业独特竞争力的子域,如:machine - 通用子域
通用功能的子域,如:登陆认证 - 支撑子域
不是通用也不是企业核心竞争力的子域,如:通知
领域、微服务、中台
DDD微服务中台.jpeg微服务是技术实现和部署的范畴,实现领域或中台的业务逻辑,为前台应用提供服务。
- 领域根据限界上下文可以设计为多个微服务,而如果限界上下文过大,一个微服务也可能会包含多个子领域。
- 中台是由多个业务条线的共同需求所构成,是需要共享的业务功能和服务单元的集合,一个中台可由一个微服务来实现,也可根据领域驱动设计和微服务拆分原则细分为多个微服务,多个微服务功能集合共同组成一个中台。
问题
Inner API 所属领域?
参考
领域驱动设计
阿里盒马领域驱动设计实践
基于 DDD 的微服务设计和开发实战
当中台遇上 DDD,我们该如何设计微服务?
DDD实战课
什么是面向对象