1.总体设计
①总体设计又称为概要设计或初步设计。其基本目的就是回答“概括地说,系统应该如何实现”这个问题。
②总体设计过长一般分两个阶段组成:系统设计阶段,结构设计阶段。
③主要任务:1.确定系统的物理模型2.确定软件的体系结构
④软件设计包括了总体设计和详细设计
2.基本设计原理
- 模块化(使复杂问题“分而治之”)把程序划分为独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成制定的功能满足用户的需求。
- 抽象(抓事务本质特征,先不考虑细节)人们在现实世界中认识到一定事物、状态、过程之间总存在着某些相似的二方面,把这些相似的方面集中或概括起来,暂时忽略他们之间的差异,这就是抽象。
- 逐步求精(集中精力先解决主要问题,尽量推迟对细节的考虑)
- 信息隐藏和局部化(将某些模块的某些过程和数据隐藏起来,其他模块不能访问它)(把一些关系密切的软件元素物理地放得彼此靠近)
- 模块独立性(模块独立性是模块化、抽象、信息隐藏的直接产物)
①模块的独立成都可以有两个定性的标准度量,内聚和耦合
②内聚:一个模块内部各个元素彼此结合的紧密程度
耦合:不同模块之间彼此互相依赖的紧密程度。
③应注意以下问题:软件设计应追求高内聚、低耦合
尽量使用数据耦合,少用控制耦合和特征耦合,限制外部耦合和公共环境耦合的范围,不用内容耦合。尽量做到高内聚,中等程度的内聚也可以采用,坚决不使用低内聚。
④耦合性强弱分级
- 无直接耦合:如果两个模块分别从属于不同模块的控制和调用,它们之间 不传递任何信息,没有直接的联系,相互独立,称无直接耦合。
- 数据耦合:如果两个模块之间有调用关系,相互传递的信息以参数的形式 给出,而且传递的信息仅仅是简单的数据,则称为数据耦合。
- 控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。
- 特征耦合:如果两个模块之间传递的是数据结构,而且被调用模块不需要作为参数传递过来的整体数据结构,只需要使用数据结构其中一部分数据元素,则称为标记耦合。
- 公共环境耦合:两个或多个模块共用一个数据环境,称为公共环境耦合。
松的公共环境耦合:一个模块送数据,一个模块取数据
紧的:两个模块都又送又取
- 内容耦合:一个模块直接访问另一个模块的内部数据,一个模块不通过正常入口而转入另一个模块内部,一个模块有多个入口,这都属于内容耦合。
⑤内聚标志着模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。
内聚由弱到强分级:
- 偶然内聚: 一个模块完成一组任务,任务之间关系很松散。
- 逻辑内聚:将逻辑上相同或相似的一类任务放在同一个模块中,每次被调用时,由传送给模块的参数来确定该模块应完成的某一功能。
- 时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
- 过程内聚:一个模块内的处理元素是相关的,而且必须以特定次序执行。
- 通信内聚:如果模块中所有元素都使用相同的输入数据或者产生相同的输出数据,则称为通信内聚。
- 顺序内聚:一个模块中各个处理元素都紧密相关于同一个功能个且必须顺序执行,此模块的块内联系属顺序内聚。
- 功能内聚:模块内所有元素属于一个整体,共同完成一个单一功能,缺一不可,则称为功能内聚。
3.结构设计
①软件结构设计的两大主要手段:软件设计原理和启发规则
启发式规则:
1、改进软件结构提高copy模块独立性。
2、模块规模应该适中。
3、深度、宽度、扇出和扇入都应适当。
深度:软件结构中控制的层数,它往往能粗略的标志一个系统的大小和复杂程度。
宽度:软件结构内同一层次上的模块总数的最大值,一般说来宽度越大,系统越复杂。
扇出:扇出是一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块。
扇入:扇入表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块越多。
4、模块的作用域应该在控制域内。
5、力争降低模块接口的复杂程度。
6、设计单入口单出口的模块。
7、模块功能应该可以预测,避免过多限制。
②模块独立性是其应遵循的最主要原理
③描绘软件结构的常用工具:层次图、HIPO图、结构图(适合自顶向下设计软件过程中使用)
4.结构化设计方法
①结构化设计(SD)是一种面向数据流的设计方法,并基于模块化、自顶向下逐步求精、结构化程序设计等技术,可与结构化分析(SA)方法衔接
②一般把数据流图中的数据流划分为两种类型,一种是变换流,一种是事务流。
变换流:信息输入系统,由外部形式变为内部形式。进入系统的信息经过变换中心,加工处理,再输出系统,由内部形式再变为外部形式
事务流:数据沿着输入通路到达一个事务中心,事务中心根据事务的类型在若干个活动流中选择一个来执行
③变换分析的步骤:
- 重画数据流图
- 区分逻辑输入、逻辑输出和变换中心部分
- 进行一级分解,设计模块结构顶层和第一层
- 进行二级分解,设计模块结构的中、下层
5.详细分析
①根本目标是确定怎样具体地实现所要求的系统
②主要任务是过程设计。
过程设计应该在数据设计、体系结构设计和接口设计之后进行。
过程设计的主要内容是设计解题的详细步骤,即算法
③接口设计中,人机界面设计是一个重要组成部分,设计原理是一个迭代过程,反复琢磨逐步求精。用户界面设计是一个迭代的过程,通常先创建设计模型,再用原型实现这个设计模型,并由用户使用评估然后根据用户意见进行修改
④过程设计工具:
- 图形工具:程序流程图(直观,但逐步求精不理想,不易表示数据结构)、N-S(又叫盒图,容易确定数据作用域,容易表现嵌套关系)、PAD(又叫问题分析图,problem analysis diagram,PAD翻译成程序代码比较容易,支持逐步求精,支持表示程序逻辑,支持描绘数据结构)
- 表格工具:判定表(能表示复杂的条件组合和动作关系)、判定树(判定表的变种,表达简单,但是形式不唯一。PS:树的形式不唯一很好理解)
- 语言工具:PDL(过程设计语言或者伪代码,易于书写但是不够形象)
在过程设计中,有面向数据结构的设计方法,主要有Jackson方法和Warnier方法
⑤程序复杂程度的度量方法
- McCabe方法:根据程序控制流的复杂程度度量程序复杂度,度量结果成为程序的环形复杂度。此为重要内容:环形复杂度有三种计算方法①数一数流图的区域个数②V(G)=E-N+2;E是条数,N是结点数③V(G)=P+1;P是判定节点数目
- Halstead方法:根据程序中运算符和操作数的总数来度量程序的复杂度。
6.程序设计语言
7.效率
主要指处理机时间和存储器容量两个方面
应该从三个方面讨效率问题
- 程序运行时间
- 存储器效率
- 输入输出效率