课程大纲
软件设计原则、思路或最佳实践 | |
一、 企业级架构设计概述 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信息) |