收藏 分享(赏)

GIS工程讲义 第二讲工程原理与方法(3).ppt

上传人:hyngb9260 文档编号:9884059 上传时间:2019-09-15 格式:PPT 页数:131 大小:1.72MB
下载 相关 举报
GIS工程讲义 第二讲工程原理与方法(3).ppt_第1页
第1页 / 共131页
GIS工程讲义 第二讲工程原理与方法(3).ppt_第2页
第2页 / 共131页
GIS工程讲义 第二讲工程原理与方法(3).ppt_第3页
第3页 / 共131页
GIS工程讲义 第二讲工程原理与方法(3).ppt_第4页
第4页 / 共131页
GIS工程讲义 第二讲工程原理与方法(3).ppt_第5页
第5页 / 共131页
点击查看更多>>
资源描述

1、地理信息系统工程设计原理与方法(3) GIS工程总体设计与详细设计,程承旗 北京大学遥感所,总体位置,第四部分:总体设计 (software),总体设计的基本目的就是回答“概括地说,系统应该如何实现?”总体设计称为概要设计或初步设计。通过这个阶段的工作将划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等等,但是每个物理元素仍然处理黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。,一、总体设计的过程,总体设计过程通常由两个主要阶段组成::系统设计,确定系统的具体实现方

2、案;结构设计,确定系统结构。,设想供选择的方案,需求分析阶段得出的数据流图是总体设计的极好的出发点。数据流图中的某些处理可以逻辑地归并在一个子边界内作为组,另一些处理可放在另一个子边界内作为另一组,这些子边界通常意味着某种实现策略。 在总体设计的这个步骤中分析员仅仅一个边界一个边界地设想并且列出供选择的方案,并不评价这些方案。,12选取合理的方案,应该从前一步得到的一系列供选择的方案中选取若干个合理的方案,通常至少选取低成本、中等成本和高成本的三种方案,在判断哪些方案合理时应该考虑在问题定义和可行性研究阶段确定的工程规模和目标,有时可能还需要进一步征求用户的意见。 对每个合理的方案分析员都应该

3、准备下列四份资料: 1) 系统流程图; 2) 组成系统的物理元素清单; 3) 成本/效益分析; 4) 实现这个系统的进度计划。,13 推荐最佳方案,分析员应该综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划。 用户和有关的技术专家应该认真审查分析员所推荐的最佳系统,如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批,在使用部门的负责人也接受了分析员推荐的方案之后,将进入总体设计过程的下一个重要阶段结构设计。,14 功能分解,为了最终实现目标系统,必须设计出组成这个系统的所有程序和文件(或数据库)。对程序(特别

4、是复杂的大型程序)的设计,通常分为两个阶段完成;首先进行结构设计,然后进行过程设计。结构设计确定程序由哪些模块组成,以及这些模块之间的关系;过程设计确定每个模块的处理过程。结构设计是总体设计阶段的任务,过程设计是详细设计阶段的任务。 为确定软件结构,首先需要从实现角度把复杂的功能进一步分解。分析员结合算法描述仔细分析数据流图中的每个处理,如果一个处理的功能过分复杂,必须把它的功能适当地分解成一系列比较简单的功能,功能分析导致数据流图的进一步细化,同时还应该用IPO图或其他适当的工具简要描述细化后每个处理的算法。,15 设计软件结构,通常程序中的一个模块完成一个适当的子功能。应该把模块组织成良好

5、的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。软件结构(即由模块组成的层次系统)可以用层次图或结构图来描绘,后面将介绍这些图形工具。 如果数据流图已经细化到适当层次,则可以直接从数据流图映射出软件结构,这就是面向数据流的设计方法。,16 数据库设计,分析员应该在需求分析阶段对系统数据所做的分析的基础上进一步设计数据库。数据库设计通常包括下述四个步骤: 1) 模式设计 2) 子模式设计 3) 完整性和安全性设计 4) 优化,17制定测试计划,在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设

6、计时注意提高软件的可测试性。,18 书写文档,这个阶段应该完成的文档通常有下述几种: 1、 系统说明 主要内容包括用系统流程图描绘的系统构成方案,组成系统的物理元素清单,成本效益分析;对最佳方案的概括描述,精化的数据流图,用层次图或结构图描绘的软件结构、用IPO图或其他工具(例如,PDL语言)简要描述的各个模块的算法,模块间的接口关系以及需求、功能和模块三者之间的交叉参照关系等等。,2、 用户手册 根据总体设计阶段的结果,修改更正在需求分析阶段产生的初步的用户手册。 3、 测试计划 包括测试策略,测试方案,预期的测试结果,进度计划等等。 4、 详细的实现计划 5、 数据库设计结果,19审查和复

7、审,二、软件设计的概念和原理,模块是数据说明、要执行语句等对象的集合,它是单独命名的而且可通过名字来访问,过程、函数、子程序、宏等等都可作为模块。模块化就是把程序划分成若干个模块,每个模块完成一个子功能,把这些模块集总起来组成一个整体,可以完成指定的功能,满足问题的要求,函数E(x)确定解决问题x需要的工作时(时间)。对于两个问题P1和P2。 E(P1+P2)E(P1)+E(P2) 这个不等式导致“各个击破”的结论把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。 参看图1,当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本(工作量)确实减少了;但

8、是,随着模块数目增加,设计模块间接口所需要的工作量也将增加。根据这两个因素,得出了图中的总成本曲线。每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小。,21模块化 22抽象 软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方法描述的;当我们由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层。,23 信息隐蔽和局部化,应用模块化原理时,自然会产生的一个问题是:“为了得到最好的一组模块应该怎样分解软件呢?”信息隐蔽原理指出:应该这

9、样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。 所谓局部化是指把一些关系密切的软件元素物理地放得彼此靠近。在模块中使用局部数据元素是局部化的一个例子。 “隐蔽”意味着有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息。,24 模块独立,模块独立是抽象、信息隐蔽和局部化的直接结果。 模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚和耦合。耦合衡量不同模块彼此间互相依赖(连接)的紧密程度;内聚衡量一个模块内部各个元素彼此结合的紧密程度。,耦合,耦合是对一个软件结构内不同模块

10、之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度,进入或维护任何一个模块,而不需要对系统的其他模块有很多了解。此外,由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小。因此,模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。 如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合称为数据耦合。如果传递的信息中有控制信息(尽管有时这种控制信息以数据的形式出现,则这种耦合称为控制耦合。 当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合。公共环境可以是全程变量、共享的通信区、内存的公共覆盖区、任何存储介质上的文件

11、、物理设备等等。,最高程度的耦合是内容耦合。如果出现下列情况之一。两个模块间就发生内容耦合: 一个模块访问另一个模块的内部数据; 一个模块不通过正常入口而转到另一个模块的内部; 两个模块有一部分程序代码重叠(只可能出现在汇编程序中); 一个模块有多个入口(这意味着一个模块有几种功能)。 应该坚决避免使用内容耦合。 尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合。,内聚,内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展,。简单地说,理想内聚模块只做一件事情。 低内聚有如下几类:如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很

12、松散的凡叫做偶然内聚。如果一个模块完成的任务在逻辑上属于相同或相似的一类(例如,一个模块产生各种类型的全部输出),则称为逻辑内聚。如果一个模块包含的任务必须在同一段时间内执行(例如,模块完成各种初始化工作),就叫时间内聚。,中内聚主要有两类:如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据),则称为通信内聚。,高内聚也有两类:如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。如果模块内所有处理元素属于一个整体,

13、完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。,耦合和内聚的概念是Constantine,Yourdon,Myers和Stevens等人提出来的,按照他们的观点,如果给上述七种内聚的优劣评分,将得到如下结果: 功能内聚 10分 时间内聚 3分 顺序内聚 9分 逻辑内聚 1分 通信内聚 7分 偶然内聚 0分 过程内聚 5分,三、启发式规则,31 改进软件结构提高模块独立性 32 模块规模应该适中 一个模块的规模不应过大,最好能写在一页纸内(通常不超过60行语句),33 深度、宽度、扇出和扇入都应适当 深度表示软件结构中控制的层数,它往往粗略地显示一个系统的大小和复杂程度。 宽度是

14、软件结构内同一个层次上的模块总数的最大值。一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。 扇出是一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块;扇出过小(例如总是1)也不好。经验表明,一个设计得好的典型系统的平均扇出通常是3或4(扇出的上限通常是59),一个模块的扇入表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多,这是有好处的,但是,不能违背模块独立原理单纯追求高扇入。 观察大量软件系统后发现,设计得很好的软件结构通常顶层扇出比较高,中层扇出较少,底层扇入到公共的实用模块中去(底层模块有高扇入)。,34 模

15、块的作用域应该在 控制域之内,模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合,例如,在图2中模块A的控制域是A、B、C、D、E、F等模块的集合。 在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块。,35力争降低模块接口的复杂程度 模块接口复杂是软件发生错误的一个主要原因。 436设计单入口单出口的模块 这条启发式规则警告软件工程师不要使模块间出现内容耦合。,37 模块功能应该可以预测 以上列出的启发式规则多数是经验规律,对改进设计,提高软件质量,往往有重要的参考价值;但是,它们既不是设计的目标也不

16、是设计时应该普遍遵循的原理。,四、图形工具,层次图HIPO图,41层次图和HIPO图,层次图用来描绘软件的层次结构。虽然层次图的形式和描绘数据结构的层次方框图相同,但是表现的内容却完全不同,层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系。图3是层次图的一例子,最顶层的方框代表正文加工系统的主控模块,它调用下层模块完成正文加工的全部功能,第二层的模块控制完成正文加工的一个主要功能,例如“编辑”模块通过调用它的下属模块可以完成编辑功能中的任何一种。 层次图很适于在自顶向下设计软件的过程中使用。,HIPO图是美国IBM公司发明的“层次图加输入/处理/输出图

17、”的英文缩写。为了能使HIPO图具有可追踪性,在H图(层次图)里除了最顶层的方框之外,每个方框都加了编号。编号则和数据流图的编号规则相同,例如,图3加了编号后得到图4。 和H图中每个方框相对应,应该有一张IPO图描绘这个方框代表的模块的处理过程。有一点应该着重指出,那就是HIPO图中的每张IPO图内都应该明显地标出它所描绘的模块在H图中的编号,以便追踪了解这个模块在软件结构中的位置。,42 结构图,Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构图形工具,图中一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头(或直线)表示模块的

18、调用关系因为按照惯例总是图中位于上方的方框代表的模块调用下方的模块,即使不用箭头也不会产生二义性,为了简单起见,可以只用直线而不用箭头表示模块间的调用关系。,在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭头尾部的开头来区分:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。图5是结构图的一个例子。,此外还有一些附加的符号,可以表示模块的选择调用或循环调用。图6表示当模块M中某判定为真时调用模块A,为假时调用模块B。图7表示模块M循环用模块A、B和C。注意,层次图和结构图并不严格表示模块的调用次序。层次图和

19、结构图并不指明什么时候调用下层模块,通常上层模块中除了调用下层模块的语句之外还有其他语句,究竟是先执行调用下层模块的语句还是先执行其他语句,在图中丝毫没有指明。事实上,层次图和结构图只表明一个模块调用哪些模块,至于模块内还有没有其他成分则完全没有表示。,通常用层次图作为描绘软件结构的文档。结构图作为文档并不很合适,因为图上包含的信息太多有时反而降低了清晰程度。但是,利用IPO图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图的过程,却可以作为检查设计正确性和评价模块独立性的好方法。传送的每个数据元素都是完成模块功能所必须的吗?反之,完成模块功能必须的每个数据元素都传送来了吗?

20、所有数据元素都只和单一的功能有关吗?如果发现结构图上模块间的联系不容易解释,则应该考虑是否设计上有问题。,五、面向数据流的设计方法,面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。 在工程的需求分析阶段,信息流是一个关键考虑,通常用数据流图描绘信息在系统中加工和流动的情况。面向数据流的设计方法定义了一些不同的“映射”,利用这些映射可以把数据流图变换成软件结构。因为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法(简称SD方法),也就是基于数据流的设计方法。,51 概念,面向数据流的设计方法把信息流映射成软件结构,信

21、息流的类型决定了映射的方法。信息流有下述两种类型。,1、 变换流,根据基本系统模型,信息通常以“外部世界”的形式进入软件系统,经过处理以后再以“外部世界”的形式离开系统。 参看图8信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫作变换流。,2、 事务流,基本系统模型意味着变换流,因此,原则上所有信息流都可以归结为这一类。但是,当数据流图具有和图。9类似的形状时,这种数据流是“以事务为中心的”,也就是说,数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动

22、作序列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。图9中的处理T称为事务中心,它完成下述任务; 1) 接收输入数据(输入数据又称为事务) 2) 分析每个事务以确定它的类型; 3) 根据事务类型选取一条活动通路。,设计过程,图10说明了使用面向数据流方法逐步设计的过程。,52 变换分析,变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。下面通过一个例子说明变换分析的方法。,例子,假设的仪表板将完成下述功能: 1) 通过模-数转换实现传感器和微处理机接口; 2) 在发光二极管面板上显示数据; 3) 指示每小时英里数(mph)

23、,行驶的里程,每加仑油行驶的英里数(mpg)等等; 4) 指示加速或减速; 5) 超速警告:如果车速超过55英里/小时,则发出超速警告铃声。 在需求分析阶段应该对上述每条要求以及系统的其他特点进行全面的分析评价,建立起必要的文档资料,特别是数据流图。,设计步骤,第1步 复查基本系统模型 复查的目的是确保系统的输入数据和输出数据符合实际。 第2步 复查并精化数据流图。 假设在需求分析阶段产生的数字仪表板系统的数据流图如图11所示。 第3步 确定数据流图具有变换特性还是事务特性。 一个系统中的所有信息流都可以认为是变换流,但是,当遇到有明显事务特性的信息流时,建议采用事务分析方法进行设计。 数据沿

24、着两条输入通路进入系统,然后沿着五条通路离开,没有明显的事务中心。因此可以认为这个信息流具有变换流的总特征。 确定输入流和输出流的边界,从而孤立出变换中心。 对于汽车数字仪表板的例子,设计人员确定的流的边界如图12,第5步 完成“第一级分解” 软件结构代表对控制的自顶向下的分配,所谓分解就是分配控制的过程。 对于变换流的情况,数据流图被映射成一个特殊的软件结构,这个结构控制输入、变换和输出等信息处理过程。图13说明了第一级分解的方法。位于软件结构最顶层的控制模块Cm协调下述从属的控制功能: 输入信息处理控制模块Ca,协调对所有输入数据的接入; 变换中心控制模块Ct,管理对内部形式的数据的所有操

25、作; 输出信息处理控制Ce,协调输出信息的产生过程。 应该在能够完成控制功能并且保持好的耦合和内聚特性的前提下,尽量使第一级控制中的模块数目取最小值。 对于数字仪表板的例子,第一级分解得出的结构如图14所示。每个控制模块的名字表明了为它所控制的那些模块的功能。,第6步 完成“第二级分解” 所谓第二级分解就是把数据流图中的每个处理映射成软件结构中一个适当的模块。完成第二级分解的方法是,从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块Ce控制的一个低层模块;最后把变换中心内的每

26、个处理映射受Ct控制的一个模块。,对于数字仪表板系统的例子,第二级分解的结果分别用图16,17和18描绘。这三张图表示对软件结构的初步设计结果。虽然图中每个模块的名字 表明了它的基本功能,但是仍然应该为每个模块写出一个简要说明,描述: 进出该模块的信息(接口描述); 模块内部的信息; 过程陈述,包括主要判定点及任务等; 对约束和特殊特点的简短讨论。 这些描述是第一代的设计规格说明,在这个设计时期进一步的精化和补充是经常发生的。,第7步 使用设计度量和启发式规则对第一次分割得到的软件结构,总可以根据模块独立原理进行精化。为了产生合理的分解,得到尽可能高的内聚、尽可能松散的耦合,最重要的是,为了得

27、到一个易于实现、易于测试和易于维护和软件结构,应该对初步分割得到的模块进行再分解或合并。 具体到数字仪表板的例子,对于从前面的设计步骤得到的软件结构,还可以做许多修改,下面是某些可能的修改: 输入结构中的模块“转换成rpm”和“收集sps”可以合并; 模块“确定加速/减速”可以放在模块“计算mph”下面,以减少耦合; 模块“加速/减速显示”可以相应地放在模块“显示mph”的下面。 经过上述修改后的软件结构画在图19中。,上述七个设计步骤的目的是,开发软件的整体表示。也就是说,一旦确定了软件结构就可以把它作为一个整体来复查,从而能够评价和精化软件结构。在这个时期进行修改只需要很少的附加工作,但是

28、却能够对软件的质量特别是软件维护性产生深远的影响。 上述设计途径和“写程序”的差别。如果程序代码是对软件的唯一描述,那么软件开发人员将很难站在全局的高度来评价和精化软件,而且事实上也不能做到:“既见树木又见森林,53 事务分析,虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个显示的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。 事务分析 设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。 由事务流映射成的软件结构包括一个接收分支和一个发送分支。 对于一个大系统,常常把变换分析和事务分析应用

29、到同一个数据流图的不同部分,由此得到的子结构形成“构件”,可以利用它构造完整的软件结构。,54 设计优化,考虑设计优化问题时应该记住,“一个不能工作的最佳设计的价值是值得怀疑的”。 结构简单通常既表示设计风格优雅,又表明效率高。设计优化应该力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求的前提下使用最简单的数据结构。 1) 在不考虑时间因素的前提下开发并精化软件结构; 2) 在详细设计阶段选出最耗费时间的那模块,仔细地设计它们的处理过程(算法),以求提高效率; 3) 使用高级程序设计语言编写程序; 4) 在软件中孤立出那些大量占用处理机资源的模块; 5) 必要时重新设计或

30、用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率。上述优化方法遵守了一句格言:“先使它能工作,然后再使它快起来”。,46 小结,总体设计阶段的基本目的是用比较抽象概括的方式确定系统如何完成预定的任务,也就是说,应该确定系统的物理配置方案,并且进而确定组成系统的每个程序的结构。因此,总体设计阶段主要由两个小阶段组成,首先需要进行系统设计,从数据流图出发设想完成系统功能的若干合理的方案,分析员应该仔细分析比较这些方案,并且和用户共同先定一个最佳方案,然后进行软件结构设计,确定软件由哪些模块组成以及这些模块之间的动态调用关系。层次图和结构图是描绘软件结构的常用工具。,在进行软件结构设

31、计时应该遵循的最主要的原理是模块独立原理,也就是说,软件应该由一组完成相对独立的子功能的模块组成,这些模块彼此之间的接口关系应该尽量简单。 抽象是人类认识复杂事物时最有力的思维工具,在进行软件结构设计时的一种有效的方法是,由抽象到具体地分析和构造出软件的层次结构。,软件工程师在开发软件的长期实践中积累了丰富的经验,总结这些经验得出一些很有参考价值的启发式规则,它们往往能对如何改进软件设计给出宝贵的提示。在软件开发过程中既要充分重视和利用这些启发式规则,又要从实际情况出发避免生搬硬套。,自顶向下逐步求精是进行软件结构设计的常用途径;得是,如果已经有了详细的数据流图,也可以使用面向数据流的设计方法

32、,用形式化的方法由数据流图映射出软件结构。应该记住,这样映射出来的只是软件的初步结构,还必须根据设计原理并且参考启发式规则,认真分析和改进软件的初步结构,以得到质量更高的模块和更合理的软件结构。,在进行详细的过程设计和编写程序之前,首先进行结构设计,其好处在于可以在软件开发的早期站在全局高度对软件结构进行优化。在这个时期进行优化付出的代价不高,却可以使软件质量得到重大改进。,习题:用面向数据流的方法设计系统的软件结构- 房产管理系统,第五部分:详细设计,详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统 详细设计阶段的任务还不是具体地编写程序,而是要设计出程序的“蓝图”,以后程序员将根

33、据这个蓝图写出实际的程序代码。程序的“读者”有两个,那就是计算机和人,实际上对于长期使用的软件系统而言,人读程序的时间可能比写程序时间还要长得多。因此,衡量程序的质量不仅要看它的逻辑是否正确,性能是否满足要求,更主要的是要看它是否容易阅读和理解。详细设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是详细设计的逻辑基础。,1 1 结构程序设计,结构程序设计是一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。 有人认为结构程序设计的定义中还应该包括采用“主程序员组”这种人员组织

34、形式。 在总体设计阶段采用自顶向下逐步求精的方法,可以把一个复杂问题的解法分解和细化成一个由许多模块组成的层次结构的软件系统。在详细设计或编码阶段采用自顶向下逐步求精的方法,可以把一个模块的功能逐步分解细化为一系列具体的处理步骤或某种高级语言的语句。,1.2 详细设计的工具,描述程序处理过程的工具称为详细设计的工具,它们可以分为图形、表格和语言三类,对它们的基本要求都是能提供对设计的无歧义的描述,也就是应该能指明控制流程、处理功能、数据组织以及其他方面的实现细节,从而在编码阶段能把对设计的描述直接翻译成程序代码。,21程序流程图,程序流程图中使用的符号和系统流程图的符号很多是相同的。但是,程序

35、流程图中的箭头代表控制流而不是数据流,此外,程序流程图中还使用一些系统流程图中没有的符号,图3中列出了一些程序流程图中常用的然而在系统流程图中却并不使用的符号。 程序流程图的主要缺点如下: 1) 程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。 2) 程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。 3) 程序流程图不易表示数据结构。,22 盒图(N_S图),出于要有一种不允许违背结构程序设计精神的图形工具的考虑,Nassi和Shneider-man提出了盒图,又称为N-S图。它有下述特点

36、: 1) 功能域(即,一个特定控制结构的作用域)明确,可以从盒图上一眼就看出来。 2) 不可能任意转移控制,很容易确定局部和全程数据的作用域。 3) 很容易表现嵌套关系,也可以表示模块的层次结构。 图4给出了结构化控制结构的盒图表示,也给出了调用子程序的盒图表示方法。,23 PAD图,PAD是问题分析图(Problem Analysis Diagram)的英文缩写,自1973年由日本日立公司发明以后,已得到一定程度的推广。它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。图5给出PAD图的基本符号。,PAD图的主要优点如下: 1) 使用表示结构化控制结构的PAD符号所设计

37、出来的程序必然是结构化程序。 2) PAD图所描绘的程序结构十分清晰。图中最左面的竖线是程序的主线,即第一层结构。随着程序层的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。PAD图中竖线的总条数就是程序的层次数。 3) 用PAD图表现程序逻辑,易读、易懂、易记。PAD图是二维树开结构的图形,程序从图中最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点。 4) 容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成,从而可省去人工编码的工作,有利于提高软件可靠性和软件生产率。 5) 即可用于表示程序逻辑,也可用于描绘数据结构。 6) PAD图的符号

38、支持自顶向下、逐步求精方法的使用。开始时设计者可以定义一个抽象的程序,随着设计工作的深入而使用符号逐步增加细节,直至完成详细设计,如图6所示。,24 判定表,当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD图后面即将介绍的过程设计语言(PDL)者不易清楚地描述。然而判定表却能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。,25 判定树,判定树是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。,26 过程设计语言(PDL),PDL也称伪码,这是一个笼统的名称,现在有许多种不同的过程设计语言在使用。它是用正文形式表示数据和处理过程的设计工具。,27 模块开

39、发文件夹,每个开发文件夹中包含一个(或多个)模块的全部文档,文件夹的封皮上列出工程项目的名称、模块名字、程序员姓名、完成的日期、修改的日期、源程序行数、目标代码长度、对模块的简要描述,以及设计、编码、单元测试和集成测试等阶段的起止时间(预计的时间和实际时间)等等。文件夹内应该保存对模块详细设计结果的描述、源程序清单、测试期间修改的源程序清单、最终的源程序清单、测试软件(程序和测试驱动程序)和测试结果等等。,3、Jackson程序设计方法,前面介绍了面向数据流的设计方法,也就是根据数据流确定软件结构的方法,本节和下一节将分别介绍两种数据结构的设计方法,也就是用数据结构作为程序设计的基础。 面向数

40、据结构的设计方法的最终目标是得出对程序处理过程的描述。这种方法最适合于在详细设计阶段使用,也就是说,在完成了软件结构设计之后,可以使用面向数据结构的方法来设计每个模块的处理过程。 先介绍Jackson方法的工具Jackson图,然后介绍Jackson程序设计方法的基本步骤。,31、Jackson图,虽然程序中实际使用的数据结构种类繁多,但是它们的数据元素彼此间的逻辑关系却只有顺序、选择和重复三类,因此,逻辑数据结构也只有这三类。,1、 顺序结构 顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次。图8是表示顺序结构的Jackson图的一个例子。 2、 选择结构 选择结构的数据包

41、含两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。图9是表示三个中选一个结构的Jackson图。 3、 重复结构 重复结构的数据,根据使用时的条件由一个数据元素出现多次构成。图10是表示重复结构的Jackson图。,32 改进的Jackson图,Jackson图实质上是对层次方框图的一种精化。虽然Jackson图和描绘软件结构的层次图形式相当类似,但是含义却很不相同,即层次图中的一个方框通常代表一个模块;Jackson图即使在描绘程序结构时,一个方框也并不代表一个模块,通常一个方框只代表几个语句。,33 Jackson方法,五个步骤组成: 1、 分析并确定输入数据和输

42、出数据的逻辑结构,并用Jackson图描绘这些数据结构。 2、 找出输入数据结构和输出数据结构中有对应关系的数据单元。 3、 用三条规则从描述数据结构的Jackson图导出描述程序结构的Jackson图(见后) 4列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。 5用伪码表示程序。,三条规则: 第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应); ,第二,

43、根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。,总之,描绘程序结构的Jackson图应该综合输入数据结构和输出数据结构的层次关系而导出来。在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。,用伪码表示程序,Jackson方法中使用的伪码和Jackson图是完全对应的,下面是和三种基本结构对应的伪码。和图11(a)所示的顺序结构对应的伪码,其中seq

44、和end是关键字:A seqBCDA end,和图511(b)所示的选择结构对应的伪码,其中select condl、cond2和cond3分别是执行B、C或D的条件:B A Or cond2C A Or cond3D A end,和图511(d)所示重复结构对应的伪码,其中iter、until、while和end是关键字(重复结构有until和while两种形式),cond是条件:A iter until(或while) condBA end 下面的具体例子进一步说明Jackson结构程序设计方法,例 一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及

45、文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出字符串中的空格数,最后印出文件中空格的总个数。 对于这个简单例子而言,输入和输出数据的结构很容易确定。图12是用Jackson图描的输入/输出数据结构。(a)输入数据结构, (b)输出数据结构,确定了输入输出数据结构之后,下一步是分析确定在输入数据结构和输出数据结构中有对应关系的数据单元。在这个例子中哪些数据单元有对应关系呢?输出数据总是通过对输入数据的处理而得到的,因此在输入输出数据结构最高层次的两个单元(在这个例子中“正文文件”和“输出表格”)总是有对应关系的。这一对单元将和程序结构图中最顶层的方框(表程序

46、)相对应,也就是说经过程序的处理由正文文件得到输出表格,下面还有哪些有对应关系的单元呢?因为每处理输入数据中一个“字符串”之后,就可以得到输出数据中一个“串信息”,它们都是重复出现的数据单元,而且出现次序和重复次数都完全相同,因此,“字符串”和“串信息”也是一对有对应关系的单元。还有其他有对应关系的单元吗?为了回答这个问题我们依次考察输入数据结构中余下的每个数据单元。“字符”不可能和多个字符组成的“字符串”对应,和输出数据结构中其他数据单元也不能对应。“空格”能和“空格数”对应吗?显然,单个空格并不能决定一个记录中包含的空格个数,因此没有对应关系。,通过类似的考察发现,输入数据结构中余下的任何

47、一个单元在输出数据结构中都找不到对应的单元,也就是说,在这个例子中输入输出数据结构中只有上述两对有对应关系的单元。在图12中用一对虚线箭头把有对应关系的数据单元连接起来,以突出表明这种对应关系。,Jackson程序设计方法的第三步是从数据结构图导出程序结构图。按照前面已经讲述过的规则,这个步骤的大致过程是:首先,在描绘程序结构的Jackson图的最顶层画一个处理框“统计空格”,它与“正文文件”和“输出表格这对最顶层的数据单元相对应。但是接下来还不能立即画与另一对数据单元(“字符串”和“串信息”)相对应的处理框,因为在输出数据结构中“串信息”的上层还有“表格体”和“空格总数”两个数据单元,在程序

48、结构图的第二层应该有与这两个单元对应的处理框“程序体”和印总数”。因此,在程序结构图的第三层才是与“字符串”和“串信息”相对应的处理框-“处理字符串”。在程序结构图的第四层似乎应该是和“字符串”、“字符”及“空格数”等数据单元对应的处理框“印字符串”、“分析字符”及“印空格数”,这三个处理是顺序执行的。但是,“字符”是重复出现的数据单元,因此“分析字符”也应该是重复执行的处理。改进的Jackson图规定顺序执行的处理中不允许混有重复执行或选择执行的处理,所以在“分析字符”这个处理框上面又增加了一个处理框“分析字符串”。最后得到的程序结构图为图13。,Jackson程序设计方法的第四步是列出所有

49、操作和条件,并且把它们分配到程序结构图的适当位置。首先,列出统计空格个数需要的全部操作和条件如下:,(1)停止 (2)打开文件 (3)关闭文件 (4)印出字符串 (5)印出空格数目 (6)印出空格总数 (7)sum sum+1 (8)totalsum totalsum+sum(9)读入字符串 (10)sum:0(11)totalsum;0 (12)pointer:1(13)pointer:pointer+l I(1)文件结束1(2)字符串结束 S(3)字符是空格,在上面的操作表中,sum是保存空格个数的变量,totalsum是保存空格总数的变量,而pointer是用来指示当前分析的字符在字符串中的位置的变量。 经过简单分析不难把这些操作和条件分配到程序结构图的适当位置,结果为图14。,(1)停止 (2)打开文件 (3)关闭文件 (4)印出字符串 (5)印出空格数目 (6)印出空格总数 (7)sum sum+1 (8)totalsum totalsum+sum(9)读入字符串 (10)sum:0(11)totalsum;0 (12)pointer:1(13)pointer:pointer+l I(1)文件结束1(2)字符串结束 S(3)字符是空格,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报