养成好习惯,先设计后编码,规避绝大多数问题
软件设计
名词释义
概要设计:
将需求转化为数据结构和软件的系统结构
详细设计:
即过程设计,通过对系统结构进行细化,得到软件的详细数据结构和算法
设计维度
- 数据设计: 将实体关系图中描述的对象和关系,以及数据字典中描述的详细数据内容转化为数据结构的定义
- 体系结构设计: 划分软件系统模块及模块之间的关系
- 接口设计: 根据数据流图中定义软件内部各成分之间、软件与其他协同系统之间及软件与用户之间的交互机制
- 过程设计: 即详细设计,把结构成分转换成软件的过程性描述
如: 前端组件接收到的参数参数(数据设计),父子组件设计(体系结构设计),父子组件通信设计(接口设计),具体实现(过程设计)
概要设计
原则:模块化;抽象;自顶向下,逐步细化;信息隐蔽独立(核心)
模块独立性
准则: 模块间的耦合和模块的内聚
模块耦合
耦合松散,可测试性和可维护性会提高。
范式:尽量数据耦合,少用控制耦合,限制公共耦合,完全不用内容耦合
- 非直接耦合: 即偶然耦合,通过主模块的控制和调用来实现的。如: Vue component
- 数据耦合: 一个模块访问另一个模块时,彼此之间通过参数交换数据信息。
- 标记耦合: 一组模块通过参数传递记录信息,这组模块共享了该记录。如: 子组件直接对传入的对象属性进行操作
- 控制耦合: 一个模块通过传送控制信息来控制另一个模块的功能。如: 自定义组件渲染
- 外部耦合: 一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息。如: 在模块A中,修改B中引用到的变量值a
- 公共耦合: 一组模块访问同一个公共数据环境,如: 使用状态管理,往状态里传入数据和接收状态里的数据
- 内容耦合: 有四个场景。一个模块直接(或通过不正常入口)访问另一模块内部数据;两个模块有一部分代码重叠;一个模块有多个入口。
模块内聚
- 偶然内聚
- 逻辑内聚
- 时间内聚
- 通信内聚
- 信息内聚
- 功能内聚
概要设计说明书
主要内容包括:
- 引言: 编写说明书的目的、背景,定义所用到的术语和缩略语,以及列出文档中所引用的参考资料等
- 概要设计: 用于说明软件的需求规格、运行环境要求、处理流程及软件体系结构等
- 运行设计: 用于说明软件的运行模块组合、运行控制方式及运行时间等
- 模块设计: 用于说明软件中各模块的功能、性能及接口等
- 数据设计: 用于说明软件系统所涉及的数据对象及数据结构的设计
- 出错处理设计: 用于说明软件系统可能出现的各种错误及可采取的处理措施
体系结构工具
结构图
又称SC图(Structure Chart),反映程序中各模块之间的调用关系和联系
形态特征:
- 扇入: 表明多少个上级模块直接调用它。越大越好
- 扇出: 表明一个模块直接控制(调用)的模块数目。扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块;扇出过小意味着结构图的深度增加,增大了模块接口的复杂性,而且增加了调用和返回的时间,降低了工作效率。好的设计平均扇出通常是3或4
- 深度: 层数越多,程序越复杂,程序的可理解性也随之下降。
- 宽度: 表示同一层次模块总书的最大值
基本符号
用于标识模块,方框内标明模块名称
用于描述模块间调用关系
表示信息传递,空心表示传递的信息是数据,实心表示传递的是控制信息,箭头上标明信息名称
菱形表示模块A选择调用模块B或模块C
圆弧表示模块A循环调用模块B和模块C
层次图加输入/处理/输出图
又称HIPO(Hierarchy Plus Input/Processing/Output)图。
H图
层次图(Hierarchy Chart)表明各功能模块隶属关系。
IPO图
IPO图表明模块的数据输入、数据加工和数据输出之间的关系。
概要设计的启发式规则
- 提高模块独立性: 高内聚低耦合
- 模块大小要适中: 模块中的语句大概50~150行之间
- 模块应具有高扇入和适当的扇出: 顶层扇出大,中层扇出小,底层扇入大,呈瓮形结构
- 软件结构中的深度和宽度不宜过大: 深度和宽度之间要做平衡和折衷
- 模块的作用域应处于控制欲之内: 最佳结构是父级模块控制下一级子模块
- 尽量降低模块的接口复杂度: 减少接口传送的信息个数以及确保实参和形参的一致性和对应性
- 设计单入口、单出口的模块
- 模块功能应该可以预测: 相同的输入对应的输出一致
面向数据流的设计方法
结构化设计(SD)是基于数据流的设计方法,它是基于模块化、自顶向下、逐步细化等结构化程序设计技术的一种软件体系结构设计方法
SD方法实施步骤
- 研究、分析和审查数据流图。从软件的需求规格说明中弄清数据流的加功过程,对于发现的问题及时解决。
- 根据数据流图确定数据处理的类型。典型的数据流有两种类型:变换流和事务流,针对两种不同类型分别进行分析处理。
- 由数据流图推导出系统的初始结构图。
- 利用启发式规则改进系统初始化结构图,直到得到符合要求的结构图为止。
- 修订和补充数据字典
数据流
变换流
信息沿数据通路,先通过物理输入,由系统变换为逻辑输入,然后通过变换中心处理,再将信息的逻辑输出变换为物理输出。具有这种特性的信息称为变换流。
变换型系统结构图由输入、中心变换和输出三部分组成
事务流
信息沿数据通路到达一个处理中心(事务中心),根据信息类型决定从若干动作序列中选择一个来执行,这样的信息流称为事务流。
事务型软件结构图由事务中心和高层模块组成
详细设计
过程设计工具
程序流程图
是一种描述程序的控制结构流程和指令执行情况的有向图
程序流程图中的符号:
五种基本控制结构
- 顺序型: 由几个连续的加工处理步骤依次排列构成
- 选择型: 根据逻辑条件中判断表达式的取值来选择执行哪个加工处理步骤
- 先判定型循环: 当循环控制条件成立时,重复执行特定的加工步骤
- 后判定型循环: 重复执行特定的加工处理步骤,直到循环控制条件成立时停止
- 多情况选择型: 列出多种加工情况,程序根据控制变量的取值,选择执行其一
盒图
又称N-S图(Nassi-Shneiderman),一种结构化程序设计的图形工具
问题分析图
又称PAD图(Problem Analysis Diagram, PAD)
其他
- 判定表: 表格
- 判定树: 树型
- PDL预研: 是一种用于描述功能模块的算法设计和加工细节语言,称为过程设计语言,是一种伪代码
数据库设计
步骤
- 数据需求分析
进行数据库设计必须准确了解用户数据需求。需求分析是软件设计的基础,也是数据库设计的基础。需求分析是否充分、准确,决定了在其基础上构建的数据库的质量与效率。
- 概念结构设计
将需求分析得到的用户需求进行综合、归纳与抽象,形成信息结构即为概念模型,这一过程就是概念结构设计。描述概念模型的有力工具是ER图,其反映的是数据库实体概念、属性及联系
概念结构设计要求:
- 能真实、充分反映现实世界,包括事物和事物之间的联系,能满足用户对数据处理要求
- 易于理解
- 易于修改
- 易于向关系型、网状型、层次型等各种数据模型转换
概念结构设计的方法:
- 自顶向下法: 先定义全局概念结构的框架,向下逐步细化
- 自底向上法: 先定义各局部的概念结构,把他们集合起来得到全局概念结构
- 逐步扩张法: 先定义核心概念结构,然后向外扩充,以滚雪球的方式逐步生产其他概念结构,直至形成总体概念结构
- 混合策略: 自顶向下和自底向上的结合,自顶向下设计一个全局概念结构的框架,以它为骨架集成自底向上设计的各局部概念结构
- 逻辑结构设计
将ER图转换为选用DBMS产品(数据库管理系统)支持的数据模型相符合的逻辑结构。如:将多对多关系转化为数据库自持的一多或多一关系
- 物理结构设计
- 确定所有数据库文件的名称、字段、类型和宽度
- 确定所有数据库文件需要建立的索引
- 数据库的实施
将数据库的逻辑设计和物理设计用数据定义语言描述出来
- 建立数据库结构
- 数据载入
- 应用程序的编写和调试
- 数据库系统的试运行
接口设计
系统的接口是由穿越系统边界的数据流定义的。穿过系统便捷的数据流代表了系统的输入和输出
接口类型
主要包括三个方面:
- 系统内模块之间的接口(内部接口)
- 目标系统与其他软硬件之间的接口(外部接口)
- 系统与用户之间的接口(人机交互界面)
应用程序编程接口
又称API(Application Programming Interface),是软件系统不同组成部分衔接的约定。
详细设计说明书
一、 引言
- 编写的目的: 编写详细设计说明书的目的,指明预期读者
- 背景: 项目相关信息,包括项目名称、提出者、开发者以及最终用户等
- 定义: 列出专业术语和外语缩写词的名称
- 参考资料: 相关参考资料的标题、作者等
二、系统的结构
描述每个模块及子程序的名称、标识符、功能及他们的层次结构与调用关系
三、程序n(标识符)设计说明
- 程序描述: 描述设计目的及程序特点
- 功能
- 性能
- 输入项
- 输出项
- 算法
- 流程逻辑: 以图表的形式描述程序的流程逻辑
- 接口
- 存储分配: 存储文件的存储方式及分配情况
- 注释设计
- 限制条件: 在运行环境种受到的限制
- 测试计划
- 尚未解决的问题