ALPD学习笔记 3:从问题空间到方案空间,用领域模型指导软件实现

简介: # 从问题空间到实现空间:领域模型和涉及质量写好代码的普适性原则:易于理解,易于演进,低开发成本降低业务域和方案域的表示差距,易于演进,代码和模型的变化是统一且同步进化的![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/af2d4e63-8efa-4121-b2dd-7447c542f6fe.png)# 从模型到

从问题空间到实现空间:领域模型和涉及质量

写好代码的普适性原则:易于理解,易于演进,低开发成本
降低业务域和方案域的表示差距,易于演进,代码和模型的变化是统一且同步进化的

从模型到代码:DDD的4个构造块模式

实体 Entity

具有唯一标识来跟踪的具有重要业务意义的对象
这些对象会随着业务进展产生状态和属性的变更,但他们代表的业务对象不变
例如出行计划、支付单

值对象 Value Object

值对象仅仅用来描述特征,我们只关心对象的属性,不需要id
区分实体对象和值对象可以降低系统的复杂性
例如出行信息和费用信息是用来描述出行计划的特征的,相同的出行信息可以互换,不需要唯一标识

(领域)服务 Service

一些业务逻辑并不是直接与领域对象相关,它本身代表了一种商业策略或者业务处理过程。
服务自身是无状态的。即服务本身是不持有数据的。
例如费用计算、上车点计算等业务处理流程。

领域事件 Domain Event

领域事件本身是业务结构的反映,通过事件风暴等方式可以清晰地发现业务中的关键事件。
领域事件可以降低系统设计的复杂程度,例如事件溯源这种架构。
如果一个事件(例如系统宕机)并不是业务活动的结果,那么它不能称为领域事件。
领域事件是一种特殊的“值对象”,即一旦产生就不会被更改了。
领域事件如果在远程则必须要有id,但如果仅在本地就不一定。

注意事项

尽量使用值对象,大多数时候并不需要完整的实体信息
对于 “乘车人” 、 “发布人” 这类值对象也需要保存一个ID来支持必要时获取更多信息或者信息同步
对于生命周期不同的对象,慎用关联(例如 “上车点” 和 “预定义上车点” )
转换数据库视角为领域视角
慎用数据库外键,不要靠数据库来保证一致性

在领域层保障业务完整性:DDD的3个生命周期模式

聚合 Aggregates

聚合提高了对象系统的粒度,保证了业务逻辑的完整性,减少了错误产生的概率

  • 将实体和值对象划分为聚合并且围绕聚合来定义边界。
  • 作为一个整体来定义聚合的属性和不变量,并把其执行责任赋予聚合根(串联其它聚合对象的核心对象)或者指定的框架机制。贫血模型和充血模型
  • 一定要选择一个实体作为聚合的根,并仅允许外部对象持有对聚合根的引用,不可以持有对聚合根的局部对象的引用。聚合的核心作用就是封装业务的完整性,进而获得了知识丰富的行为。

为什么一个聚合不该包含其它聚合的聚合根?
生命周期一致性原则:同一个聚合里的生命周期是同步的,即如果聚合根消失,聚合内其他元素也都应该消失。
小聚合原则:在不破坏业务完整性的基础上,小聚合带来更大的灵活性
具体在代码实现中,一个聚合根引用另一个聚合根时,引用的时另一个聚合根的id,即将另一个聚合根视作当前聚合根下的一个值对象来处理。

工厂 Factories

因为聚合需要保证业务完整性,而对象并不是一次性构建出来的,我们应当使用工厂来解决聚合构造的完整性问题。
在设计模式中,工厂是用于分离构造和使用的。而在DDD中,工厂是用来保证聚合的构造的。
不一定使用的时工厂模式,也可以是 builder 或者静态方法,重要的是聚合根一次性被完整的构造出来。

资源库 Repositories

资源库是聚合的仓储机制,外部世界通过资源库,并且只能通过资源库来完成对聚合的访问。例如只有资源库可以提供数据库接口。
资源库以聚合的整体来管理对象,一个聚合只能有一个以聚合根命名的资源库。
资源库模式并不等价于持久化,更不是数据库访问层。

在产品代码中增加领域层:聚焦核心业务逻辑

  • 接口层

接口层数据校验,必要的数据补全,负责处理边界性事务

  • 应用层

容易变的业务逻辑

  • 领域层

稳定的业务逻辑
按照聚合来组织代码结构,用一个package来描述一个聚合,每个包里都有一个聚合根。
在领域层代码中体现业务逻辑和业务完整性。

  • 数据层

数据持久化,外部数据访问,消息收发

依赖倒置:接口是属于使用者来决定的。稳定性的领域层放在中间,提供对外接口。

目录
相关文章
|
数据库 容器
Flutter笔记:滚动之-无限滚动与动态加载的实现
Flutter笔记:滚动之-无限滚动与动态加载的实现
690 0
|
存储 前端开发 测试技术
DDD - 六边形架构和CQRS架构
DDD - 六边形架构和CQRS架构
1276 0
|
缓存 运维 安全
云巧组件标准
可组装式应用的理论,结合了云原生的理念和交付质量要求,云巧对云巧组件设计了六大维度的标准。根据这六大维度名称的英文首字母组成单词ACCORD
2694 0
|
5月前
|
Oracle Java 关系型数据库
适合 Java 新手的入门级学习资料推荐及高效学习资料整理
新手学习Java可从官方文档、在线课程(如Codecademy、Coursera)、经典书籍(如《Head First Java》《Java核心技术》)、菜鸟教程、廖雪峰教程等入手,结合LeetCode、HackerRank等平台练习,循序渐进掌握编程技能。
189 0
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
231 5
|
9月前
|
前端开发 数据可视化 安全
82.7K star!大气炫酷UI开源项目,超级火!
shadcn/ui 是一款基于 Radix UI 和 Tailwind CSS 构建的现代化 UI 组件库,专为追求设计品质与开发效率的开发者打造。不同于传统组件库,它提供完全可定制的组件代码模板,让开发者既能享受开箱即用的便利,又能保持对设计系统的完全掌控。
390 13
|
机器学习/深度学习 人工智能 调度
【AI系统】CANN 算子类型
本文介绍了算子的基本概念及其在编程和数学中的作用,重点探讨了CANN算子在AI编程和神经网络中的应用,特别是华为CANN算子在AI CPU上的架构和开发要求。CANN是华为推出的异构计算架构,旨在优化AI处理器的计算效率,支持多种AI框架,涵盖AI Core和AI CPU算子,以适应不同类型的计算需求。文中还详细说明了AI CPU算子的开发流程和适用场景,为开发者提供了宝贵的指导。
595 2
|
SQL 关系型数据库 MySQL
如何创建SQL数据库——初学者指南
在现代信息技术的浪潮中,数据库管理系统(DBMS)已经成为数据处理的核心工具之一。结构化查询语言(SQL)作为数据库管理系统的核心语言,在数据库创建、管理以及优化方面扮演着关键角色。本文将详细指导初学者如何使用SQL创建数据库,涉及的内容包括但不限于安装数据库系统、使用SQL命令创建数据库、设置用户
654 5
技术经验分享:htmla标签href属性【跳转和锚点】
技术经验分享:htmla标签href属性【跳转和锚点】
422 0