前边三篇博客,分别从软件工程学科的角度,软件计划角度,软件需求角度三个方面来写的.我们做好了计划,确定了软件的可执行性,我们开始针对软件来做各种需求分析,有了需求,我们就可以开始真正到我们软件的设计阶段了,这章,总结有关软件设计的相关知识!
下边我们先来看这张图,是关于这章要总结的结构:
这五个方面,看似没有联系,其实却有着不可分割的关系.面向过程的软件设计,首先我们需要明白,我们需要做什么,有什么样的目标;其次,要完成这些任务,我们需要知道一些必备的基础知识;三,对于面向过程的开发,模块是里边的主要单元,而对于模块最重要的特性就是独立性,这是我们完成其它任务的基础; 四,等明白了模块的相关属性等.需要我们开始设计,首先就是概要设计,即先设计我们这款软件的结构——结构化设计方法;完成了结构设计,还有我们的详细设计,即模块设计,这里设计到了具体细节的编程技巧知识;五,最后,需要我们把软件的其它组成部分设计好,数据,文件设计,对于过程设计,就是使这些东西过程化,使之成为一体。 当然,对于最后的编写设计文档,我这里就没有标出来,这是哪个阶段都需要一个重要流程。下边,我来分块总结这些。
一,任务:对于从技术观点划分的,1,数据结构,其实就是我们每款软件数据结构的设计;2,系统结构设计,定义系统各主要成分之间的关系就是,使之构成框架;3,过程设计,就是把结构成分转化为软件的过程性描述,使之成为一个有流动的程序。 对于从管理阶段划分的概要设计,和详细设计这个就是框架的设计和细化的设计。在这里让大家看一下软件设计的过程:
二,软件设计的基础:
1,自顶向下,逐步细化:这是我们设计的一种方法,一种思想。
2,软件结构:包括模块结构和数据结构两部分。
3,程序结构:表明了程序各个部件的组织情况,是软件过程的表示。看这张图:
对里边的名词,我做一下简单解释:
深度:表示层次数,这个为5
宽度:表示任意一层模块的宽度,最多的为
系统的宽度,这个为7
扇出:每个模块的附载子模块,例如,M的扇出为3
ABC,扇出越大,模块受其它模块的影响越大.
扇入:表示进入模块的入口,例如T模块的扇入是4
4,大家看这几个结构图(反映程序中模块调用之间的层次调用关系和联系,信息传递):
下边这张图,画模块的一些规则:
5,模块化:是指整个软件被划分为若干个单独命令和可编址的部分,称之为模块,将其组装起来可以供满足整个系统的需求。
6,抽象化:分为过程的抽象(从系统定义到实现,每进展一步都可以看做是对软件解决方法的抽象化过程的一次细化)和数据抽象(描述数据对象的细节,定义其相关的操作)
7,信息隐蔽:每个模块的实现的细节对于其它模块来说是隐蔽的。也就相当于下边要说的模块的独立。
三,模块的独立性:
首先我们要知道模块的三个基本属性:功能(实现什么),逻辑(内部怎样),状态(使用的条件与环境)。当然在描述一个模块时,我们也可以通过外部特性和内部特性来描述。
对于模块的独立性:是指每个模块只涉及要求的具体的子功能,而和软件系统其它的模块的接口是简单的。这里我们一般通过模块间的耦合和模块的内聚来度量。
耦合是指模块之间相互连接的紧密程度的度量;内聚是指模块的功能强度。独立性较强的模块应该是高内聚低耦合。下边我们看两张图:
1,模块间的耦合与独立性的关系图:
2,模块的内聚与独立性的关系图:
对于其中具体的耦合和内聚,我们可以通过字面意思理解,当然,我这里也给出连接:耦合,内聚。而,我们要做到的是高内聚低耦合!
四,结构化设计方法:
就是通过研究,分析和审查数据流图,从软件的需求规格说明中弄清楚数据加工流程,然后根基数据流程图决定问题的类型,这里分为变换型和事务型两种,进行分析处理。下边我来介绍这两种类型:
这里我先说下结构图的几种模块图:
(1),变换型系统结构图:先看一下的变换型的三大步,其中找到变换数据的过程为关键,其特点为一条输入一条输出:
这里我给大家举个例子(由数据流图向变换型转换):
(2),事务型系统结构图:从分析数据流图开始自顶向下,逐步分解,建立结系统构图。它是接受一项任务,经过事务处理中心,可以选择不同的模块进行操作,也就是一项输入,多项输出。这里确定事务中心是重点,大家看例图:
在这里我向大家提示一下事务型系统结构图的分析过程:
1,识别事务源(这也是重点);2,规定适当的事务型结构;3,识别各种事务和他们定义的操作;4,注意利用公用模块;5,对每个事物,或对密切联系的一组事务,建立一个事务处理模块;6,对事务处理模块规定他们全部的下层操作模块;7,对操作模块规定他们全部细节模块!
在这两项设计完以后,我们需要做的时,先对模块进行说明:1,为每个模块写一份处理说明;2,为每一个模块提供一份接口说明;3,确定全局数据结构和局部数据结构;4,指出所有的设计约束和限制;5,进行概要设计评审。
五,最后一项,设计软件的数据,文件和过程:
1,对于数据设计,这里只向大家提出它的原则:a,用于软件的系统化方法也适用于数据;b,确定所有的数据结构和在每种数据结构上施加的操作;c,应当建立一个数据词典并用它来定义数据和软件的设计;d,底层数据设计的决策应推迟到设计过程的后期进行;e,数据结构的表示只限于哪些必须直接使用该数据结构内数据的模块才能知道;f,应当建立一个存放有效数据结构及相关操作的库;g,软件设计和程序设计语言应当支持抽象数据类型的定义和实现。
2,文件设计:主要分为两个过程:1,逻辑设计(1,整理必须的数据元素;2,分析数据间的关系;3,确定文件的逻辑设计。)2,物理设计(1,理解文件的特性;2,确定文件的组织方式,例如顺序文件,直接存取文件;3,确定文件的存储介质;4,确定文件的记录格式;5,估算存取时间和存储容量等问题。)
3,过程设计:要决定各个模块的实现算法,并精确的表达这些算法。这里有几种方式来表达:
a,程序流程图的物种基本控制结构图:
在这里我给出程序流程图的符号:
当然,也给出一个例子,供参考理解:
b,N-S图,也叫盒图,它的五种基本控制结构的画法:
c,问题分析图(PAD图),五种基本结构的画法:
给出一个例子,共参考理解:
这里谈一下PAD图的优点:(当然这些都是比较来说的,这三种图可以比较着学习)
1,一定是结构化的
2,比较清晰
3,程序的结构易懂,便于记忆
4,很容易的将PAD图转换为高级语言的程序
5,可以描述数据结构
6,支持自顶向下的逐步求精的过程
当然我们还可以利用判定表这种表格工具,和伪代码这种文字工具,来实现这些设计,这里不再一个个描述。
最后,我还是要把形成文档的提纲写一下:
总上而言为程序设计的总体过程:这里就是针对软件系统程序,为了去实现其功能,而先设计模型的过程。说简单一点就是盖房子前,我们画的那些图纸等设计方案!