《第一篇 软件工程与软件过程 结构化设计.pptx》由会员分享,可在线阅读,更多相关《第一篇 软件工程与软件过程 结构化设计.pptx(106页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、4.6 面向数据流的设计方法 4.7 人机界面设计 4.8 过程设计4.9 过程设计的工具4.10 面向数据结构的设计方法4.11 小结第1页/共106页4.1 4.1 结构化设计与结构化分析的关系 软件设计必须依据对软件的需求来进行,结构化分析的结果为结构化设计提供了最基本的输入信息。第2页/共106页 分析模型(见3.3节)的每个元素都提供了创建设计模型时所需要的信息。图4.1描绘了软件设计过程中的信息流。由数据模型、功能模型和行为模型清楚地表示的软件需求被传送给软件设计者,他们使用适当的设计方法完成数据设计、体系结构设计、接口设计和过程设计。在软件设计期间我们所做出的决策,将最终决定软件
2、开发能否成功,更重要的是,这些设计决策将决定软件维护的难易程度。第3页/共106页图4.1 把分析模型转变成软件第4页/共106页4.2软件设计的概念和原理模块化 模块是由边界元素限定的相邻的程序元素(例如,数据说明,可执行的语句)的序列,而且有一个总体标识符来代表它。像Pascal或Ada这样的块结构语言中的Beginend对,或者C,C+和Java语言中的对,都是边界元素的例子。因此,过程、函数、子程序和宏等,都可作为模块。面向对象范型中的对象(见第6章)是模块,对象内的方法也是模块。模块是构成程序的基本构件。第5页/共106页图4.2 模块化和软件成本第6页/共106页 模块化就是把程序
3、划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。Meyer提出了五条标准,我们可以用这五条标准来评价一种设计方法定义有效的模块系统的能力。下面列出这五条标准。(1)模块可分解性 如果一种设计方法提供了把问题分解为子问题的系统化机制,它就能降低整个问题的复杂性,从而可以实现一种有效的模块化解决方案。第7页/共106页 (2)模块可组装性 如果一种设计方法能把现有的(可重用的)设计构件组装成新系统,它就能提供一种并非一切都从头开始做的模块化解决方案。(3)模块可理解性 如果可以把一个模块作为一种独立单元(无需参考其他模块)
4、来理解,那么,这样的模块是易于构造和易于修改的。(4)模块连续性 如果对系统需求的微小修改只导致对个别模块,而不是对整个系统的修改,则修改所引起的副作用将最小。第8页/共106页 (5)模块保护性 如果在一个模块内出现异常情况时,它的影响局限在该模块内部,则由错误引起的副作用将最小。采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分
5、工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。第9页/共106页抽象 人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。第10页/共106页逐步求精 逐步求精是人类解决复杂问题时采用的基本技术,也是许多软件工程技术(例如,规格说明技术,设计和实现技术、测试和集成技术)的基础。可以把逐步求精定义为:“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。”求
6、精实际上是细化过程。我们从在高抽象级别定义的功能陈述(或信息描述)开始。也就是说,该陈述仅仅概念性地描述了功能或信息,但是并没有提供功能的内部工作情况或信息的内部结构。求精要求设计者细化原始陈述,随着每个后续求精(细化)步骤的完成而提供越来越多的细节。第11页/共106页 抽象与求精是一对互补的概念。抽象使得设计者能够说明过程和数据,同时却忽略低层细节。事实上,可以把抽象看作是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法。求精则帮助设计者在设计过程中揭示出低层细节。这两个概念都有助于设计者在设计演化过程中创造出完整的设计模型。第12页/共106页信息隐藏 应用模块化原理时,自
7、然会产生的一个问题是:“为了得到最好的一组模块,应该怎样分解软件”。信息隐藏原理指出:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。第13页/共106页4.3 模块独立 “模块独立”概念是模块化、抽象、逐步求精和信息隐藏等概念的直接结果,也是完成有效的模块设计的基本标准。模块的独立程度可以由两个定性标准来度量,这两个标准分别称为内聚和耦合。耦合衡量不同模块彼此间互相依赖(连接)的紧密程度;内聚衡量一个模块内部各个元素彼此结合的紧密程度。以下分别详细阐述。第14页/共106页耦合 耦合是对一个软件结构内不同模块之间互连程度的度量。耦合强
8、弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。在软件设计中应该追求尽可能松散耦合的系统。在这样的系统中可以研究、测试或维护任何一个模块,而不需要对系统的其他模块有很多了解。此外,由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小。因此,模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。第15页/共106页 总之,耦合是影响软件复杂程度的一个重要因素。应该采取下述设计原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合。第16页/共106页内聚 内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化
9、概念的自然扩展。简单地说,理想内聚的模块只做一件事情。设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多;但是,低内聚很坏,不要使用。第17页/共106页 内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。内聚和耦合都是进行模块化设计的有力工具,但是实践表明内聚更重要,应该把更多注意力集中到提高模块的内聚程度上。事实上,没有必要精确确定内聚的级别。重要的是设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度降低模块间的耦合程度,从而获得较高的模块独立性。第18页/共106页4.4 启发规则 软件工程师们在开发计算
10、机软件的长期实践中积累了丰富的经验,总结这些经验得出了一些启发规则。这些启发规则虽然不像前两节讲述的基本原理那样普遍适用,但是在许多场合仍然能给软件工程师有益的启示,往往能帮助他们找到改进软件设计提高软件质量的途径,因此有助于实现有效的模块化。下面介绍几条常用的启发规则。第19页/共106页改进软件结构提高模块独立性模块规模应该适中深度、宽度、扇出和扇入都应适当模块的作用域应该在控制域之内力争降低模块接口的复杂程度设计单入口单出口的模块模块功能应该可以预测第20页/共106页图4.3 模块的作用域和控制第21页/共106页4.5 表示软件结构的图形工具层次图和HIPO图 通常使用层次图描绘软件
11、的层次结构。在图4.3中已经非正式地使用了层次图。在层次图中一个矩形框代表一个模块,框间的连线表示调用关系(位于上方的矩形框所代表的模块调用位于下方的矩形框所代表的模块)。第22页/共106页图4.4 正文加工系统的层次图第23页/共106页 HIPO图是美国IBM公司发明的“层次图加输入/处理/输出图”的英文缩写。为了使HIPO图具有可追踪性,在H图(即层次图)里除了顶层的方框之外,每个方框都加了编号。编号方法与本书第3章节中介绍的数据流图的编号方法相同,例如,把图44加了编号之后得到图4.5。第24页/共106页图4.5 正文加工系统的H图第25页/共106页图4.6 IPO图的一个例子第
12、26页/共106页图4.7 改进的IPO图(IPO表)的形式第27页/共106页结构图 Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具,图中一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头(或直线)表示模块的调用关系。在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭头尾部的形状来区分:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。图4.8是结构图的一个例子。第28页/共106页图4.8 结构图的例子产生第29页/共106页图
13、4.9 判定为真时调用A,为假时调用B第30页/共106页图4.10 模块M循环调用模块A,B,C第31页/共106页4.6 面向数据流的设计方法 面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。在软件工程的需求分析阶段,信息流是一个关键考虑因素,通常用数据流图描绘信息在系统中加工和流动的情况。面向数据流的设计方法定义了一些不同的“映射”,利用这些映射可以把数据流图变换成软件结构。因为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法,也就是基于数据流的设计方法。第32页/共106页概念 面向数据流的设计方法把信息流
14、映射成软件结构,信息流的类型决定了映射的方法。信息流有下述两种类型。1.变换流 2.事务流第33页/共106页图4.11 变换流第34页/共106页图4.12 事务流第35页/共106页图4.13 面向数据流方法的设计过程第36页/共106页变换分析 变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。下面通过一个例子说明变换分析的方法。1.例子第37页/共106页2.设计步骤(1)复查基本系统模型。(2)复查并精化数据流图。(3)确定数据流图具有变换特性还是事务特性。(4)确定输入流和输出流的边界,从而孤立出变换中心。(5)完成“第一级分解”
15、。(6)完成“第二级分解”。(7)使用设计度量和启发规则对第一次分割得到的软件结构进一步精化。第38页/共106页图4.14 数字仪表板系统的数据流图第39页/共106页图4.15 具有边界的数据流图第40页/共106页图4.16 第一级分解的方法第41页/共106页图4.17 数字仪表板系统的第一级分解第42页/共106页图4.18 第二级分解的方法第43页/共106页图4.19 未经精化的输入结构第44页/共106页图4.20 未经精化的变换结构第45页/共106页图4.21 未经精化的输出结构第46页/共106页图4.22精化后的数字仪表板系统的软件结构第47页/共106页 上述七个设计
16、步骤的目的是,开发出软件的整体表示。也就是说,一旦确定了软件结构就可以把它作为一个整体来复查,从而能够评价和精化软件结构。在这个时期进行修改只需要很少的附加工作,但是却能够对软件的质量特别是软件的可维护性产生深远的影响。第48页/共106页事务分析 虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。对于一个大系统,常常把变换分析和事务分析应用到同一个数据流图的不同部分,由此得到的子
17、结构形成“构件”,可以利用它们构造完整的软件结构。第49页/共106页图4.23 事务分析的映射方法第50页/共106页设计优化 考虑设计优化问题时应该记住,“一个不能工作的最佳设计的价值是值得怀疑的”。软件设计人员应该致力于开发能够满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得接收的软件。应该在设计的早期阶段尽量对软件结构进行精化。可以导出不同的软件结构,然后对它们进行评价和比较,力求得到“最好”的结果。这种优化的可能,是把软件结构设计和过程设计分开的真正优点之一。第51页/共106页4.7 人机界面设计 人机界面设计是接口设计的一个组成部分。对于交互式系统来说,人机界面
18、设计和数据设计、体系结构设计、过程设计一样重要。近年来,人机界面在系统中所占的比例越来越大,在个别系统中人机界面的设计工作量甚至占设计总量的一半以上。人机界面的设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命,因此,必须对人机界面设计给以足够重视。第52页/共106页人机界面设计问题 在设计用户界面的过程中,几乎总会遇到下述四个问题:系统响应时间、用户帮助设施、出错信息处理和命令交互。1.系统响应时间 系统响应时间是许多交互式系统用户经常抱怨的问题。一般说来,系统响应时间指从用户完成某个控制动作(例如,按回车键或点击鼠标),到软件给出预期的响应(输出或做动作)之间的这段时
19、间。系统响应时间有两个重要属性,分别是长度和易变性。第53页/共106页 2.用户帮助设施 几乎交互式系统的每个用户都需要帮助,当遇到复杂问题时甚至需要查看用户手册以寻找答案。大多数现代软件都提供联机帮助设施,这使得用户可以不离开用户界面就解决自己的问题。常见的帮助设施有集成的和附加的两类。3.出错信息处理 出错信息和警告信息,是出现问题时交互式系统给出的“坏消息”。出错信息设计得不好,将向用户提供无用的或误导的信息,反而增加了用户的挫折感。第54页/共106页 4.命令交互 命令行曾经是用户和系统软件交互的最常用方式,而且也曾经广泛地用于各种应用软件中。现在,面向窗口的、点击和拾取方式的界面
20、已经减少了用户对命令行的依赖,但是,许多高级用户仍然偏爱面向命令的交互方式。在多数情况下,用户既可以从菜单中选择软件功能也可以通过键盘命令序列调用软件功能。第55页/共106页 人机界面设计过程 用户界面设计是一个迭代的过程,也就是说,通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户的意见进行修改。第56页/共106页界面设计指南 用户界面设计主要依靠设计者的经验。总结众多设计者的经验而得出的设计指南,有助于设计者设计出友好、高效的人机界面。本节介绍三类人机界面设计指南。1.一般交互 一般交互指南涉及信息显示、数据输入和整体系统控制,因此,这些指南是全局性的,忽略
21、它们将承担较大风险。下面叙述一般交互指南。保持一致性。为人机界面中的菜单选择、命令输入、数据显示以及众多的其他功能,使用一致的格式。第57页/共106页 提供有意义的反馈。向用户提供视觉的和听觉的反馈,以保证在用户和界面之间建立双向通信。在执行有较大破坏性的动作之前要求用户确认。如果用户要删除一个文件,或覆盖一些重要信息,或请求终止一个程序运行,应该给出“您是否确实要”的信息,以请求用户确认他的命令。允许取消绝大多数操作。UNDO或REVERSE功能使众多终端用户避免了大量时间浪费。每个交互式应用系统都应该能方便地取消已完成的操作。减少在两次操作之间必须记忆的信息量。不应该期望用户能记住一大串
22、数字或名字,以便在下一步操作中使用它们。应该尽量减少记忆量。第58页/共106页 提高对话、移动和思考的效率。应该尽量减少击键次数,设计屏幕布局时应该考虑尽量减少鼠标移动的距离,应该尽量避免出现用户问:“这是什么意思”的情况。允许犯错误。系统应该保护自己不受致命错误的破坏。按功能对动作分类,并据此设计屏幕布局。下拉菜单的一个主要优点就是能按动作类型组织命令。实际上,设计者应该尽力提高命令和动作组织的“内聚性”。提供对工作内容敏感的帮助设施(参见471节)。用简单动词或动词短语作为命令名。过长的命令名难于识别和记忆,也会占据过多的菜单空间。第59页/共106页 2.信息显示 如果人机界面显示的信
23、息是不完整的,含糊的或难于理解的,则应用软件显然不能满足用户的需求。可以用多种不同方式“显示”信息:用文字、图片和声音;按位置、移动和大小;使用颜色、分辨率和省略。下面是关于信息显示的设计指南。只显示与当前工作内容有关的信息。用户在获得有关系统的特定功能的信息时,不必看到与之无关的数据、菜单和图形。不要用数据淹没用户,应该用便于用户迅速地吸取信息的方式来表示数据。例如,可以用图形或图表来取代巨大的表格。第60页/共106页 使用一致的标记、标准的缩写和可预知的颜色。显示的含义应该非常明确,用户不必参照其他信息源就能理解。允许用户保持可视化的语境。如果对图形显示进行缩放,原始的图像应该一直显示着
24、(以缩小的形式放在显示屏的一角),以使用户知道当前观察的图像部分在原图中所处的相对位置。产生有意义的出错信息(参见节)。使用大小写、缩进和文本分组以帮助理解。人机界面显示的信息大部分是文字,文字的布局和形式对用户从中吸取信息的难易程度有很大影响。第61页/共106页 使用窗口分隔不同类型的信息。利用窗口用户能够方便地“保存”多种不同类型的信息。使用“模拟”显示方式表示信息,以使信息更容易被用户吸取。例如,显示炼油厂储油罐的压力时,如果使用简单的数字表示压力,则不易引起用户注意。但是,如果用类似温度计的形式来表示压力,用垂直移动和颜色变化来指示危险的压力状况,就能引起用户的警觉,因为这样做为用户
25、提供了绝对和相对两方面的信息。高效率地使用显示屏。当使用多窗口时,应该有足够的空间使得每个窗口至少都能显示出一部分。此外,屏幕大小应该选得和应用系统的类型相配套(这实际上是一个系统工程问题)。第62页/共106页 3.数据输入 用户的大部分时间用在选择命令、键入数据和向系统提供输入。在许多应用系统中,键盘仍然是主要的输入介质,但是,鼠标、数字化仪和语音识别系统正迅速地成为重要的输入手段。下面是关于数据输入的设计指南。尽量减少用户的输入动作。最重要的是减少击键次数,这可以用下列方法实现:用鼠标从预定义的一组输入中选一个;用“滑动标尺”在给定的值域中指定输入值;利用宏把一次击键转变成更复杂的输入数
26、据集合。第63页/共106页 保持信息显示和数据输入之间的一致性。显示的视觉特征(例如,文字大小、颜色和位置)应该与输入域一致。允许用户自定义输入。专家级的用户可能希望定义自己专用的命令或略去某些类型的警告信息和动作确认,人机界面应该允许用户这样做。交互应该是灵活的,并且可调整成用户最喜欢的输入方式。用户类型与喜欢的输入方式有关,秘书可能非常喜欢键盘输入,而经理可能更喜欢使用鼠标之类的点击设备。使在当前动作语境中不适用的命令不起作用。这可使用户不去做那些肯定会导致错误的动作。第64页/共106页 让用户控制交互流。用户应该能够跳过不必要的动作,改变所需做的动作的顺序(在应用环境允许的前提下),
27、以及在不退出程序的情况下从错误状态中恢复正常。对所有输入动作都提供帮助(参见节)。消除冗余的输入。除非可能发生误解,否则不要要求用户指定工程输入的单位;不要要求用户在整钱数后面键入00;尽可能提供缺省值;绝对不要要求用户提供程序可以自动获得或计算出来的信息。第65页/共106页4.8 过程设计 过程设计应该在数据设计、体系结构设计和接口设计完成之后进行,它是详细设计阶段应该完成的主要任务。过程设计的任务还不是具体地编写程序,而是要设计出程序的“蓝图”,以后程序员将根据这个蓝图写出实际的程序代码。因此,过程设计的结果基本上决定了最终的程序代码的质量。考虑程序代码的质量时必须注意,程序的“读者”有
28、两个,那就是计算机和人。第66页/共106页 在软件的生命周期中,设计测试方案,诊断程序错误,修改和改进程序等都必须首先读懂程序。实际上对于长期使用的软件系统而言,人读程序的时间可能比写程序的时间还要长得多。因此,衡量程序的质量不仅要看它的逻辑是否正确,性能是否满足要求,更主要的是要看它是否容易阅读和理解。过程设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是过程设计的逻辑基础。第67页/共106页图424三种基本的控制结构(a)顺序结构,先执行A再执行B;(b)IF-THEN-ELSE型选择(分支)
29、结构;(c)DO-WHILE型循环结构第68页/共106页 结构程序设计的经典定义如下所述。如果一个程序的代码块仅仅通过顺序、选择和循环这三种控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。第69页/共106页 这个经典定义过于狭隘了,结构程序设计本质上并不是无GO TO语句的编程方法,而是一种使程序代码容易阅读、容易理解的编程方法。在大多数情况下,无GO TO的代码确实是容易阅读、容易理解的代码,但是,在某些情况下,为了达到容易阅读和容易理解的目的,反而需要使用GO TO语句。例如,当出现了错误条件时,重要的是在数据库崩溃或栈溢出之前,尽可能快地从当前程序退到
30、一个出错处理程序,实现这个目标的最好方法就是使用前向GO TO语句(或与之等效的专用语句),机械地使用三种基本控制结构实现这个目标反而会使程序晦涩难懂。因此,下述的结构程序设计的定义可能更全面一些。第70页/共106页 结构程序设计是尽可能少用GO TO语句的程序设计方法。最好仅在检测出错误时才使用GO TO语句,而且应该总是使用前向GO TO语句。如果只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这三种基本控制结构,则称为经典的结构程序设计;如果除了上述三种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构,则称为扩展的结构程序设计;如
31、果再加上允许使用LEAVE(或BREAK)结构,则称为修正的结构程序设计。第71页/共106页图425其他常用的控制结构(a)DO-UNTIL型循环结构;(b)多分支结构第72页/共106页4.9 过程设计的工具 描述程序处理过程的工具称为过程设计的工具,它们可以分为图形、表格和语言三类。程序流程图 程序流程图又称为程序框图,它是历史最悠久使用最广泛的描述过程设计的方法,然而它也是用得最混乱的一种方法。图4.26中列出了程序流程图中使用的各种符号。第73页/共106页 图4.26 程序流程图中使用的符号(a)选择(分支);(b)注释;(c)预先定义的处理;(d)多分支;(e)开始或停止;(f)
32、准备;(g)循环上界限;(h)循环下界限;(i)虚线;(j)省略符;(k)并行方式;(l)处理;(m)输入/输出;(n)连接;(o)换页连接;(p)控制流第74页/共106页盒图(N-S图)出于要有一种不允许违背结构程序设计精神的图形工具的考虑,Nassi和Shneiderman提出了盒图,又称为N-S图。图4.27给出了结构化控制结构的盒图表示,也给出了调用子程序的盒图表示方法。盒图没有箭头,因此不允许随意转移控制。坚持使用盒图作为详细设计的工具,可以使程序员逐步养成用结构化的方式思考问题和解决问题的习惯。第75页/共106页 图4.27 盒图的基本符号(a)顺序;(b)IF-THEN-EL
33、SE型分支;(c)CASE型多分支;(d)循环;(e)调用子程序A第76页/共106页图 PAD是问题分析图(Problem Analysis Diagram)的英文缩写,自1973年由日本日立公司发明以后,已得到一定程度的推广。它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。图4.28给出PAD图的基本符号。第77页/共106页图4.28PAD图的基本符号(a)顺序(先执行P1后执行P2);(b)选择(IF C THEN P1 ELSE P2);(c)CASE型多分支;(d)WHILE型循环(WHILE C DO P);(e)UNTIL型循环(REPEAT P UNT
34、IL C);(f)语句标号;(g)定义第78页/共106页图4.29 使用PAD图提供的定义功能来逐步求精的例子(a)初始的PAD图;(b)使用def符号细化处理框P2第79页/共106页判定表 当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD图或后面即将介绍的过程设计语言(PDL)都不易清楚地描述。然而判定表却能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。一张判定表由四部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。第
35、80页/共106页第81页/共106页判定树 判定表虽然能清晰地表示复杂的条件组合与应做的动作之间的对应关系,但其含义却不是一眼就能看出来的,初次接触这种工具的人要理解它需要有一个简短的学习过程。此外,当数据元素的值多于两个时(例如,节例子中假设对机票需细分为头等舱、二等舱和经济舱等多种级别时),判定表的简洁程度也将下降。判定树是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。第82页/共106页图4.30 用判定树表示计算行李费的算法第83页/共106页过程设计语言(PDL)PDL也称为伪码,这是一个笼统的名称,现在有许多种不同的过程设计语言在使用。它是用正文形式表示数
36、据和处理过程的设计工具。PDL具有严格的关键字外部语法,用于定义控制结构和数据结构;另一方面,PDL表示实际操作和条件的内部语法通常又是灵活自由的,以便可以适应各种工程项目的需要。因此,一般说来PDL是一种“混杂”语言,它使用一种语言(通常是某种自然语言)的词汇,同时却使用另一种语言(某种结构化的程序设计语言)的语法。第84页/共106页4.10 面向数据结构的设计方法 在许多应用领域中信息都有清楚的层次结构、输入数据、内部存储的信息(数据库或文件)以及输出数据都可能有独特的结构。数据结构既影响程序的结构又影响程序的处理过程,重复出现的数据通常由具有循环控制结构的程序来处理,选择数据(即,可能
37、出现也可能不出现的信息)要用带有分支控制结构的程序来处理。层次的数据组织通常和使用这些数据的程序的层次结构十分相似。第85页/共106页 面向数据结构的设计方法的最终目标是得出对程序处理过程的描述。这种设计方法并不明显地使用软件结构的概念,模块是设计过程的副产品,对于模块独立原理也没有给予应有的重视。因此,这种方法最适合于在详细设计阶段使用,也就是说,在完成了软件结构设计之后,可以使用面向数据结构的方法来设计每个模块的处理过程。第86页/共106页图 虽然程序中实际使用的数据结构种类繁多,但是它们的数据元素彼此间的逻辑关系却只有顺序、选择和重复三类,因此,逻辑数据结构也只有这三类。1.顺序结构
38、 顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次。图4.31是表示顺序结构的Jackson图的一个例子。第87页/共106页图4.31 A由B、C、D三个元素顺序组成(每个元素只出现一次,出现的次序依次是B、C和D)第88页/共106页 2.选择结构 选择结构的数据包含两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。图4.32是表示三个中选一个结构的Jackson图。第89页/共106页图4.32 根据条件A是B或C或D中的某一个(注意:在B、C和D的右上角有小圆圈做标记)第90页/共106页 3.重复结构 重复结构的数据,根据使用时的条件由一个数
39、据元素出现零次或多次构成。图433是表示重复结构的Jackson图。第91页/共106页图4.33 A由B出现N次(N0)组成(注意:在B的右上角有星号标记)第92页/共106页改进的Jackson图 方法 Jackson结构程序设计方法基本上由下述五个步骤组成。(1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。(2)找出输入数据结构和输出数据结构中有对应关系的数据单元。所谓有对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元必须重复的次序和次数都相同才可能有对应关系)。第93页/共106页图4.34改进的Jackson图(a
40、)顺序结构,B、C、D中任一个都不能是选择出现或重复出现的数据元素(即,不能是右上角有小圆或星号标记的元素);(b)选择结构,S右面括号中的数字i是分支条件的编号;(c)可选结构,A或者是元素B或者不出现(可选结构是选择结构的一种常见的特殊形式);(d)重复结构,循环结束条件的编号为i。第94页/共106页 (3)用下述三条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图。第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所
41、处的层次与它们之中在数据结构图中层次低的那个对应)。第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。第95页/共106页 第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。总之,描绘程序结构的Jackson图应该综合输入数据结构和输出数据结构的层次关系而导出来。在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位
42、置。用伪码表示程序。第96页/共106页 例一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。第97页/共106页图4.35 表示输入/输出数据结构的Jackson图(a)输入数据结构;(b)输出数据结构第98页/共106页图4.36 描绘统计空格程序结构的Jackson图第99页/共106页图4.37 把操作和条件分配到程序结构图的适当位置第100页/共106页4.11 小结 软件设计的目标是设计出所要开发的软件的模型,
43、传统的软件工程方法学采用结构化设计技术完成软件设计工作。软件设计在软件工程过程中处于技术核心地位,是软件开发过程中决定软件产品质量的关键阶段。软件设计必须依据对软件产品的需求来进行,因此,结构化设计把结构化分析的结果作为基本输入信息。由数据模型、功能模型和行为模型描述的软件需求被传送给软件设计者,以便他们采用适当的设计方法完成数据设计、体系结构设计、接口设计和过程设计。第101页/共106页 为了获得高质量的软件设计结果,应该遵循模块化、抽象、逐步求精、信息隐藏和模块独立等基本设计原理,特别是其中的模块独立原理,对软件体系结构设计和接口设计具有非常重要、十分具体的指导作用。总结众多软件工程师在
44、开发软件的长期实践中所积累的丰富经验,形成了一些启发规则,这些启发规则虽然不像上述基本原理那样普遍适用,但在许多场合仍然能给软件设计者以有益的启示,有助于设计出有效模块化的软件。第102页/共106页 通常,使用层次图或结构图表示软件结构,这些图形工具具有形象直观、容易理解的优点,读者应该学会用这类图形描绘软件结构。面向数据流的设计方法是设计软件体系结构的一种系统化的方法,它定义了一些映射规则,可以把数据流图变换成软件的初步结构。得出软件的初步结构之后,还必须根据好设计的标准,同基本设计原理和启发规则为指南,对所得到的软件结构进行仔细优化,才能设计出令人满意的软件体系结构。第103页/共106
45、页 人机界面设计是接口设计的一个组成部分。对于交互式系统来说,人机界面设计和数据设计、体系结构设计、过程设计一样重要。人机界面的质量直接影响用户对软件产品的接受程度,因此,必须对人机界面设计给予足够重视。在设计人机界面的过程中,必须充分重视并认真处理好系统响应时间、用户帮助设施、出错信息处理和命令交互等四个设计问题。用户界面设计是一个迭代过程,通常,先创建设计模型,接下来用原型实现这个设计模型并由用户试用和评估原型,然后根据用户意见修改原型,直到用户满意为止。总结人们在设计人机界面过程中积累的经验,得出了一些关于用户界面设计的指南,认真对待这些设计指南有助于设计出友好、高效的人机界面。第104页/共106页 过程设计应该在数据设计、体系结构设计和接口设计完成之后进行,它是详细设计阶段的主要任务。过程设计的目标不仅是保证算法正确,更重要的是设计出的处理过程应该尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是过程设计的逻辑基础。描述程序处理过程的工具,可分为图形、表格和语言三类,这三类工具各有所长,读者应该能够根据需要选用适当的工具。在许多应用领域中信息都有清楚的层次结构,在开发这类应用系统时可以采用面向数据结构的设计方法完成过程设计。第105页/共106页感谢您的观看!第106页/共106页
限制150内