4006-998-758
3000+课程任你选择
软件设计原则
研发学院 资深架构师 开课时间:2021-08-16
戴昊

现任创业AI公司研发技术总监负责带领团队研发计算机视觉、AI安防及大数据相关产品。15年+ 大型软件产品架构经验。曾为日本第一,世界第二的瑞穗银行(Mizuho Bank);世界第二大证券交易所 – 东京证券,五十铃汽车开发企业级系统。曾给深圳证券交易所,深圳证券,招商银行信用卡中心,平安金融,中国电信,DELL 讲授过企业级架构及重构与模式的课程。擅长企业级系统架构,领域驱动设计,重构与模式。


查看老师详情
课程内容

课程大纲


          软件设计原则、思路或最佳实践


一、           企业级架构设计概述

1. 认识分层架构

2. 分层架构的演化

3. 领域驱动架构的演进

4. 界限上下文与架构

5. 六边形架构

6. 端口与适配器

7. 整洁架构

8. CQRS架构

9. 在CQRS中处理具有最终一致性的查询模型

10.事件溯源 EventSouring

11.使用乐观锁处理并发更新

12.事件溯源和发布事件

13.幂等方式处理消息

14.使用快照提升性能

15.管道与过滤器

16.SAGA(消息驱动事务)

17.协同式与编排式

18.SAGA下实现隔离

软件设计中的核心原则   SOLID


二、单一职责原则

1. 次时代租车服务终端 (ARCS)的初步设计

2. 用例 (UseCase) 的作用 – 划分边界及概览

3. SRP的设计误区

4. 重构至 SRP 的方法1:提取类

5. 重构至 SRP 的方法2:Proxy模式

6. 前端代码 SRP重构:投票组件

7. 过程性代码的 SRP

违反直觉的真相:性能优化的步骤


三、开放封闭原则

1. 代码中的接线板是什么?

2. 编程价值观 – 沟通,简单,灵活

3. 如何做到对扩展开放,对修改封闭

4. 次时代租车服务终端 (ARCS)的促销需求

5. 笨拙的促销实现

6. 如何不修改代码而改变它的行为

7. 最简单的 OCP实现 – 策略模式

8. 前端代码重构:拆分复杂表达式

敏捷开发的精髓 – 只被第一颗子弹击中


四、里氏替换原则

1. 什么才是好的继承关系

2. 子类为什么要能透明的替换基类

3. 次时代租车服务终端 (ARCS)的新需求 – 电动轿车费用计算

4. 白盒复用 还是 黑盒复用

5. IS-A的精髓:针对属性还是针对行为

6. 契约式设计继承体系

7. 重构方法:提升为兄弟类

8. 前端代码重构:抽取函数

9. 如何才能让 次时代租车服务终端 (ARCS)的代码符合 LSP

这样做我们可能会引入什么新的问题?


五、接口隔离原则

1. 接口“变胖”的问题 – 接口污染

2. 佳能一体机的遗留接口问题

3. 如何实现接口分离 – 适配器模式

4. 类适配器 – 多继承

5. 对象适配器 – 委托

6. 使用单元测试来发现问题

7. 前端代码重构:使用模板方法重新组织逻辑

8. 次时代租车服务终端 (ARCS)在接口划分上的问题

9. 如何简化复杂的逻辑

10.       如何使用模板方法分离抽象与具体

案例:ATM机接口设计的演化


六、依赖倒置原则

1. 结构化设计理念的问题

2. 对象化设计理念

3. 依赖倒置到底倒置了什么

4. 如何分离关注点

5. DI-依赖注入解决的问题:讲对象的创建与使用分离

案例:消息队列设计的演化

领域层的设计与实践


七、实体 – 数据容器还是行为载体

6. 贫血模型

7. 如何避免贫血,实体与领域服务之间的分寸

8. 唯一标识

9. 委派标识

10.案例:实现实体层超类型(Layer Supertype)

11.实战 -任务分配执行系统 实体行为归属甄别


八、值对象 – 性能提升小帮手

1. 什么是值对象

2. 值对象的特征

3. 为什么值对象这么容易被忽略

4. 案例:地址建模与值对象

5. 案例:实现值对象层超类型


九、聚合 – 比类更高一层的封装

1. 聚合设计原则

2. 聚合设计的过程

3. 聚合的一致性边界

4. 一个事务中只处理一个聚合

5. UML 中的聚合 与 DDD 中的聚合

6. 聚合内实现事务一致性

7. 聚合外实现最终一致性

8. 案例:更新订单状态与库存扣减 Version 1.0

9. 案例:更新订单状态与库存扣减 Version 2.0

10.聚合设计的注意点

服务层的设计与实践


十、微服务的入口 - 应用服务

1. 用例 (Use Case) 与应用服务

2. 微服务的网关 与 应用服务 之间的关系

3. 应用服务中的 编排,转换,验证,转发

4. 工作单元 (Unit of Work)

5. 数据传输对象 (Data Transfer Object)

6. 事务脚本 (Transaction Script) 与领域模型

7. 依赖注入在应用服务中的使用

8. 案例:实现应用服务

9. 应用服务的关注点

10.实战 -任务分配执行系统 应用层构建


十一、领域服务 – 不是实体本身的行为都归它

1. 领域服务的幂等性

2. 案例:实现领域服务

3. 实战 -任务分配执行系统 领域服务层构建


十二、资源库 – 聚合的起点与终点

1. 集合特性

2. 资源库与数据访问层的区别

3. 资源库的误解

4. 资源库的实现要点

5. 案例:资源库的实现

6. 领域模型 VS数据模型

7. 案例:泛型资源库

实战 -任务分配执行系统 持久化

基于事件驱动的架构设计


十三、领域事件 – 保持最终一致性的信使

1. 领域事件是领域建模中极其重要的部分

2. 事务一致性,高并发下的窘境

3. 最终一致性,妥协带来高扩展性

4. 原则:一个事务中只对一个聚合进行修改

5. 案例:实现抽象事件源,发布事件源

6. 案例:实现抽象事件处理

7. 案例:实现领域事件的发布与订阅

8. 实战 -任务分配执行系统 任务分配领域逻辑


十四、微服务中基于事件的系统架构

1. 微服务之间如何稳健的发布与消费事件

2. 如何保证发布事件的原子性

3. 使用事件表发布事件

4. 案例:如何实现事件感知聚合根

5. 案例:如何实现事件感知资源库

6. 如何通过 AOP 进行通用的事件处理


十五、微服务形式下的CQRS

1. DDD中的典型写操作

2. 基于数据模型的读操作

3. 基于领域模型的读操作

4. 读写分离模型

5. 案例:电商系统中的读写分离场景

6. 单进程单实体 + 共享存储/共享模型:Inventory详情查询

7. 单进程单实体 + 共享存储/分离模型:Product摘要查询

8. 单进程跨实体 + 分离存储/分离模型:Product详情查询(包含Category信息)

9. 跨进程跨实体 + 分离存储/分离模型:Order详情查询(包含Product信息)


返回上一级