(十三)详细设计
详细设计基础
什么是详细设计
- 主要位于中低层设计
- 模块之内的设计,模块之内实现的机制
软件体系结构设计定义了模块的规格,详细设计实现了模块的细节设计机制
- 中层:对象规格
- 低层:对象实现
详细设计需要设计者考虑风格,功能和许多方面
Quality attributes in Detail Design
- 修改、维护、表现
详细设计的输入
我们有什么
- 需求规格说明
- 体系结构设计说明文档
从需求、体系结构设计到详细设计
详细设计从哪里开始
Context
- 模块之间的规格
- 实现的职责
需求:分析类图
- 需求:系统顺序图
- 软件体系结构:构件之间的接口
详细设计的输出
面向对象详细设计
面向对象设计的思想
职责
- 数据职责
- 行为职责
数据职责和行为职责在一起
职责驱动的分解:职责有不同程度的抽象,有大职责和小职责之分,大职责分配给高层次的部分
高内聚:模块内部联系紧密
低耦合:模块之间联系少一点,
职责不要覆盖,也不要缺少
代理:委派给其它模块实现职责
协作
对象之间必须是协作的
应用被分解为一系列不同的行为,交给不同的对象实现
面向对象的设计过程
通过职责建立静态设计模型
抽象对象的职责
类之间的关系
- 类之间的关系
- 类图
GRASP Patterns
描述如何将职责分配给类
高内聚,低耦合
信息专家
职责分配的原则:分配职责给有持有实现这个职责必须的信息的类
创建者
控制器
添加辅助类
- 接口类
- 记录类(数据类)
- 启动类
- 控制器类
- 实现数据类型的类
- 容器类
通过协作建立动态设计模型
抽象对象之间的协作
- 从小到大,将对象的小职责聚合形成大职责
- 从大到小,将大职责分配给各个小对象
- 同时运用,共同完成对协作的抽象
顺序图:可以用顺序图表示对象之间的协作,表达对象之间如何通过消息的传递来完成比较大的职责
状态图:
明确对象的创建
例子
人和心脏
Square
:Board
创建Square
,是组合关系
Piece
:如果某个选手固定一个颜色的棋子,Player
和Piece
是组合关系,Piece
由Player
创建(如果先有很多颜色的棋子,再由选手自由选择(Player
和Piece
不是一一对应)则是聚合关系,Piece
应该由MonopolyGame
创建)
Player
:MonopolyGame
和Player
是聚合关系
选择合适的控制风格
Controller
- 如何处理系统的事件
控制器模式:选择:
- 业务或全局组织
- 完全系统
- 模拟出来的对象
- 新的类
不好的设计,展示层直接调用了业务逻辑
好的设计,使用控制器在展示层和逻辑层之间进行隔离
控制风格
集中式
- 优点:容易找到决策在哪作的,如何作的,容易修改决策
- 缺点
- 控制器容易变得臃肿,大而复杂,难以理解和维护
- 控制器可能把其它组件看作数据仓库
- 增加耦合
- 破坏信息隐藏
一个例子
启发
避免大多数消息源与一个组件
让组件小一些
确保职责不会仅仅被分配到很少的部分
确保数据职责和行为职责一致
离散式
- 特点是有有许多部分包含着少量的数据和少量的职责
- 流控制难以理解
- 组件不能只靠自己完成太多任务,增加了耦合
- 难以隐藏信息
- 内聚低
- 模块化(modularity principle)准则难以被满足
启发
- 避免交流需要每一个部分都需要发送许多消息
委托式
为类间协作开发集成测试用例
详细设计的集成测试
解决模块内部的,类与类之间的协作
重点针对复杂逻辑,采用自顶向下或者自底向上的集成
Mock Object, 构造一些假的对象使未完成时也能够集成
结构化详细设计
降低复杂度的方法:同一层次分解;从低层次抽象出高层次
详细设计文档描述和评审
详细设计验证
- 评审
- 度量:模块化度量
- 测试:协作测试
详细设计的评审
详细程度视情况而定