主要内容:设计过程和质量、设计技术、设计模型、设计实例
软件设计定义:软件系统 或 组件的架构、构件、接口 和 其他特性的定义过程 及该过程的结果
软件设计的位置
- 软件工程生命周期中的一个活动
- 进行软件编码的基础
- 软件需求分析被转化为软件的内部结构
- 是连接用户需求和软件技术的桥梁
设计含义
-
将人们头脑中想象的事物表达成模型或文档的过程;这个过程的结果--模型或文档也被称为“设计”
-
设计=适用+艺术+质量
-
适用性:满足用户需求,可被应用和使用
-
艺术性:使用软件的体验应该是愉快的,赏心悦目
-
质量:不含任何妨碍其功能的缺陷
软件架构设计(有时称为顶层设计)
- 描述软件的顶层架构和组织,划分不同的组件
软件详细设计
- 详细描述各组件以便能够编码实现
注意:
-
软件设计主要为分解设计D-design
-
可以包括系列模式设计FP-design
-
不包括创新设计I-design
-
因为创新设计被认为是需求分析和需求规格定义的一部分
好的设计应该具有如下三个特点
- 设计必须实现在分析模型中包含的所有明确要求,必须满足客户所期望的所有隐含要求
- 设计必须是对编码人员、测试人员及后续的维护人员必须是可读可理解的
- 设计应提供该软件的完整视图,以从实现的角度解决数据、功能及行为等各领域方面的问题
设计指导原则
- 设计应该是一种架构
- 设计应该是模块化的
- 设计应该包含数据,体系结构,接口和组件各个方面
- 应该设计出系统所用的数据结构
- 应该设计出展现独立功能特性的各组件
- 应该设计出各组件与外部环境连接的各接口
- 设计由软件需求分析过程中获得信息驱动,采用可重复的方法导出
- 设计应该采用正确清楚地表示
设计质量属性
- 功能性
- 可用性
- 可靠性
- 性能
- 可支持性
- 包含三个属性:扩展性、适应性、可维护性
- 抽象
- 设计模式
- 模块化
- 信息隐藏
- 功能独立
- 细化
- 重构
- 含义:是感性认识世界的手段,是“忽略具体的信息将不同事物看成相同事物的过程”,是发现实物本质特征和方法的过程
- 抽象机制:参数化、规范化
- 规范化抽象
- 过程抽象
- 数据抽象
- 控制(迭代)抽象
含义
- 通用:在给定上下文环境中一类共同问题的共同解决方案
- 具体:一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
目的
- 为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性
范围
- 由面向对象的程序构造,到(可视化的)对象框架构建
含义
- 软件被划分为命名和功能相对独立的多个组件(通常称为模块),通过这些组件的集成来满足问题的需求
软件的模块性
- 程序可被智能管理的单一属性
模块化的理论依据
- 基于人类解决问题观测数据
模块化和软件成本
模块越多,集成成本(成本、工作量)会上升
模块化设计标准
- 模块化分解性
- 模块化组合性
- 模块化可理解性
- 模块化连续性
- 模块化保护
- 模块化基本问题
- 如何分解软件系统以达最佳的模块划分
- 信息隐藏原则
- 模块应该具有彼此相互隐藏的特性
- 即:模块定义和设计时应当保证模块内的信息(过程和数据)不可以被不需要这些信息的其他模块访问
- 特点
- 抽象有助于定义构成软件的过程(或信息)实体
- 信息隐藏原则定义和隐藏了模块内的过程细节和模块内的本地数据结构
- 含义
- 每个模块只解决了需求中特定的子功能并从程序结构的其他部分看该模块具有简单的接口
- 好处
- 易于开发:功能被划分,接口被简化
- 易于维护(和测试):次生影响有限,错误传递减少,模块重用
- 定性衡量标准
- 内聚性:模块的功能相对强度
- 耦合性:模块之间的相互依赖程度
- 含义
- 逐步求精的过程
- 与抽象的关系
- 抽象使设计师确定过程和数据,但不局限于底层细节
- 细化有助于设计者在设计过程中揭示底层细节
- 含义
- 不改变组件功能和行为条件下简化组件设计(或代码)的一种重组技术
- 方法
- 检查现有设计的冗余情况、未使用的设计元素、无效或不必要的算法、较差的构建方式或不恰当的数据结构,或任何其他可更改并导致更好设计的错误
使用者角度:软件≈功能组织+功能
设计者角度:软件≈数据设计+架构设计+接口设计+组件设计
- 模型输入
- 软件需求的数据模型、功能模型和行为模式
- 分类
- 数据设计
- 架构设计
- 接口设计
- 组件级设计
分析模型转换为软件设计分析
- 含义
- 数据设计(有时也被称为数据架构)构建高层抽象(客户/用户的数据视图)的数据模型、信息模型
- 相关概念
- 数据建模
- 数据结构
- 数据库
- 数据仓库
组件级别数据设计原则
- 功能和行为系统分析原则也适用于数据设计
- 确定所有的数据结构即其对应的操作
- 建立数据字典并在数据定义和程序设计中应用
- 低层次的数据设计应该推迟到设计的后期过程
- 数据结构的表示应该只对直接使用数据结构中数据的模块可见
- 开发有用的数据结构及其对应操作的程序库
- 软件设计和编程语言应该支持抽象数据类型的定义与实现
含义及内容
- 系统需要执行的函数功能组件集(如数据库、计算模块)
- 组件之间通信、协同和合作的连接器
- 组件集成构成系统的约束
- 设计人员通过分析其组成部分的已知特性理解系统整体特性的语义模型分析
风格和模式简要分类
- 数据中心架构
- 数据流体系架构
- 调用和返回架构
- 面向对象架构
- 面向对象的软件构件过程
- 层次架构
基本问题
-
控制结构
-
数据传递
高效用户界面设计有三条重要原则:
- 用户控制系统 (用户为中心)
- 减少用户记忆负担
- 保持界面一致
环境分析确定了用户接口操作的物理结构和社会结构
三种不同类型组件或模块
- 控制模块
- 问题域模块
- 基础模块
面向对象的组件级设计
- 以类设计为基础
- 原则:开闭原则、依赖倒置原则
- 概念:耦合、内聚
传统的组件级设计
结构化编程
面向对象是一种思维
步骤
- 识别对象(类)
- 识别每一对象(类)的状态
- 识别每一对象(类)的状态转换
- 识别每一对象(类)的功能
面向对象表达:UML
- 类图:描述对象(类)及其关系
- 状态图:描述对象(类)状态变化关系
- 次序图:描述对象的函数调用关系
- 包图:描述功能组命名空间的组织层次
含义
- 以部署环境创建开始,在整个生命周期阶段中处于逻辑设计和技术需求阶段
- 包含整个解决方案的逻辑架构和服务质量(QoS)需求
- 部署架构
- 实施规范
- 实施计划
- 迁移计划
- 安装计划
- 用户管理计划
- 测试计划
- 滚动淘汰计划
- 灾难恢复计划
- 操作计划(运行书)
- 培训计划
- 逻辑体系结构
- 服务质量要求
- 使用情况分析
- 用例
- 服务水平协议
- 总体拥有成本
- 业务目标
- 一般方法
- 估计处理器需求
- 估计安全运输的处理器需求
- 可用性和可扩展性的复制服务
- 设计分析
- 识别瓶颈
- 优化资源
- 管理风险