卓越软件设计的五个指标 |
简单性 |
- 简单设计的四个要素
- 通过所有测试
- 无重复代码
- 体现设计意图
- 较少的类、方法
|
可重用性 |
|
可读性 |
- 软件的成本
- 体现设计意图
- 体现业务价值
- 代码的命名与格式
|
可测试性 |
|
可扩展性
|
|
案例实践: |
- Hadoop的版本变迁看简单设计:
通过比较两个版本的Hadoop实现,讲解如何保证设计的简单性(对Context模式的分析)
- Email Server代码分析:
从面向过程式代码分析设计问题,然后运用简单设计的四个要素对代码进行改进(对Observer模式与Chain
Of Responsibility模式的探讨、分析与比较)
- 权限认证系统:
通过抽象达到可重用设计,并简化客户端调用,协作合理,形成可扩展的认证机制(对Chain
Of Responsibility、Template Method模式的探讨与分析)
|
设计匠艺的提炼与修行 |
职责的分配原则 |
- DRY原则
- 程序等于数据加逻辑
- 高内聚低耦合
- 如无必要勿增实体
|
职责的合理分配 |
|
识别代码的坏味道 |
- Chain Method
- Feature Envy
- Shotgun Surgery
- Divergent Change
- Large Class
- Middle Man
|
职责分配的本质 |
- 职责驱动设计
- 时序图与职责分配
- 如何识别对象的职责
|
探索式方法
|
- 方法分组
- 观察隐藏的方法
- 寻找变化点
- 寻找方法和内部变量的关系
- 寻找主要职责
|
架构层级的职责分离 |
- 识别包图的坏味道
- 包的共同复用原则
- 如何划分组件或包
- 架构质量属性的考虑
|
职责分离的好处 |
- 高内聚松耦合
- 稳定
- 细粒度
- 变化可独自演化
- 避免类爆炸
|
案例 |
- 代码坏味道识别
提供多个代码案例,讲解如何识别代码坏味道,并针对代码坏味道进行重构,从而改善代码的设计与结构
- Web参数处理:
分析如何寻找对象的职责,讲解如何合理分配对象职责,了解职责分配对设计的改善
- 报表引擎
分析如何划分系统模块
内容:双向依赖与循环依赖和包或模块的重用(对包重用原则的探讨分析)
- 培训系统
培训系统对票处理的方式,分析职责的变化与分离(对Bridge模式的探讨与分析)
|
抽象的本质 |
|
抽象需要遵循的原则 |
|
抽象对设计的改善 |
- 抽象对设计的简化
- 抽象能避免重复
- 抽象保证对设计的一致性
|
扩展式设计 |
- 分离职责各司其职
- 利用抽象统一接口
- 引用接口预留空白
|
案例实践: |
- 项目管理系统
通过对业务模型的分析,理解抽象对于建模的重要性,从而提高设计的质量,内容包括:
- 消息队列
通过分析JMS、MSMQ、RabbitMQ和NServiceBus的设计,理解抽象的含义,内容包括:
- 抽象与接口
- 接口隔离原则
- 按意图设计
- Fa?ade模式
- 企业集成模式
- CIMS基于消息的分布式架构
通过对服务的统一抽象,以及对消息处理的职责分配,建立一个协作合理的分布式架构,内容包括:
- Command模式
- Publisher – Subscriber模式
- Message Bus模式
- Message Translator模式
- Lookup模式
- ORM
- 订单系统
进一步理解职责分离与抽象应对变化,逐步改善设计。内容包括: Specification模式,Simple
Factory模式,Chain Of Responsibility模式
|
场景驱动设计 |
场景驱动设计的6W原则 |
- Who:角色
- When:时序与协作
- Where:边界与上下文
- Why:价值
- What:功能
- HOW:实现
|
职责的三层图 |
- 业务价值:服务层
- 业务功能:领域层
- 业务实现:基础设施层
|
场景驱动设计过程 |
- 识别与分析场景
- 场景的三个目标层次
- 概要目标
- 用户目标
- 子功能
- 场景的角色入口
- 场景的边界与上下文
- 业务场景的活动流程
- 识别职责
- 通过业务的三层图建立职责层级
- 名词动词法
- 模型分类
- 领域建模
- 构建面向对象的虚拟世界
- 识别现实世界:业务目标、业务价值与用户意图
- 抽象:概念分类、统一概念、抽象模型、共性分析与可变性分析
- 领域驱动设计
|
案例实践:多租户服务订阅系统 |
根据一个真实案例,通过对需求进行分析以及编写用户故事,完整而统一地讲解了场景驱动设计过程中,如何识别场景与职责,如何进行领域建模与设计。
- 第一次迭代:租户的服务订阅,内容包括:
- 合理的职责分配
- 领域驱动设计中的实体与聚合根
- 时序图
- Repository模式与Factory模式辨析
- 第二次迭代:特定用户的服务订阅,内容包括:
- 第三次迭代:需求发生变化,需要引入服务套餐。此时应该如何更改之前的设计,使得变化对设计的影响降到最低。内容包括:
- Change Name重构
- Extract Interface重构
- Composite模式
- 第四次迭代:需要实现如下功能:
内容包括:
如何合理地运用面向对象设计与设计模式对以上功能进行设计:
|