《清华大学郑人杰殷仁昆教授软件工程讲义03.ppt》由会员分享,可在线阅读,更多相关《清华大学郑人杰殷仁昆教授软件工程讲义03.ppt(94页珍藏版)》请在三一办公上搜索。
1、软件工程,1,软件工程第三章 软件设计,3.1 软件设计的概念3.2 功能独立性3.3 结构化设计方法3.4 过程设计,清华大学计算机系 殷人昆,软件工程,2,3.1 软件设计的概念,软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务,即软件设计是确定系统的物理模型。从技术观点来看,软件设计包括数据设计、体系结构设计、接口设计、过程设计。数据设计将实体关系图中描述的对象和关系,以及数据字典中描述的详细数据内容转化为数据结构的定义。,软件工程,3,体系结构设计定义软件系统各主要成份之间的关系。接口设计根据数据流图定义软件内部各成份之间、软件与其它协同系统之间及软件与用户之间的
2、交互机制。过程设计则是把结构成份转换成软件的过程性描述。,软件工程,4,软件工程,5,从工程管理角度来看,软件设计分两步完成:概要设计和详细设计。概要设计将软件需求转化为软件体系结构确定系统级接口全局数据结构或数据库模式。详细设计确立每个模块的实现算法和局部数据结构用适当方法表示算法和数据结构的细节,软件工程,6,软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构。,软件工程,7,软件设计既是过程又是模型。设计过程是一系列的迭代步骤,使设计人员能够描述目标系统的各个侧面。设计模型首先描述目标系统的整体架构,然后逐步细化架构得到构造每个细节的指导原则,从而得到
3、系统的一系列不同的视图。良好的设计原则可为设计过程导航。衡量设计过程的技术原则:设计必须实现分析模型中描述的所有显式需求,必须满足用户希望的所有隐式需求。,衡量软件设计的原则,软件工程,8,对于开发者和未来的维护者而言,设计必须是可读的、可理解的,使得将来易于编程、易于测试、易于维护。设计应该给出软件的全貌,包括从实现角度可看到的数据、功能、行为。衡量设计模型的技术原则设计模型应该是一个分层结构。该结构:使用可识别的设计模式搭建系统结构。用显示良好设计特征的构件构成。可以用演化的方式实现。设计应当模块化。,软件工程,9,设计应当包含数据、体系结构、接口和构件(模块)的清晰的视图。设计应当根据将
4、要实现的对象和数据模式导出合适的数据结构。设计应当建立具有独立功能特征的构件。设计应当建立能够降低模块与外部环境之间复杂连接的接口。设计模型应当通过使用软件需求信息所驱动的可重复的方法导出。Davis的软件设计原则设计应具有可跟踪性,能回溯到软件需求;,软件工程,10,设计不必每次都从头做起,可以复用已有的设计模式和数据模式。设计应当缩小软件与现实世界中问题的“智力距离”,尽量逼近问题领域的结构;设计应具有一致性和集成性。整个系统应具有统一的风格和格式,具有良好的接口。设计结果应能适应未来可能的变更;设计不是编码,编码也不是设计。设计模型的抽象级别比源代码高。在编码级别上唯一的设计决策是补充一
5、些实现细节。,软件工程,11,设计应具有容错性和异常处理能力。对于异常数据、事件、操作条件等能够平滑处理。在建立设计方案时就应能评估设计质量,而不是在系统编码之后。应坚持设计评审,减少概念性(语义性)的错误。1)设计应遵循抽象化的原则,包含数据抽象和过程抽象。,软件设计的主要手段,软件工程,12,过程抽象 是指在软件设计中将处理过程的实现细节隐藏在数据抽象中,可以直接通过模块接口使用这些处理操作。数据抽象 是指采用抽象数据类型表示数据,实现数据封装,使得使用者可通过接口使用数据而不必关心数据结构的实现。设计应遵循自顶向下、逐步细化的原则,建立一个层次的结构。将软件体系结构自顶向下,对过程细节和
6、数据细节从抽象到具体,逐层细化,直到用编程语言的语句能够实现为止。,软件工程,13,设计应当遵循模块化的原则。每个模块可独立地开发、测试,最后组装成完整的程序。其出发点是本着将一种复杂问题“分而治之”的原则。其目的是使程序的结构清晰,容易阅读、理解、测试、修改。Meyer的良好模块设计方法的标准模块可分解性 可将系统按问题子问题分解的原则分解成系统的模块层次结构;模块可组装性 可利用已有的设计构件组装成新系统,不必一切从头开始。,软件工程,14,模块可理解性 一个模块可不参考其他模块而被理解;模块连续性 对软件需求的一些微小变更只导致对某个模块的修改而整个系统不用大动;模块保护 将模块内出现异
7、常情况的影响范围限制在模块内部;设计应遵循信息隐蔽的原则。Patnas主张在开发时,将每个程序的成分隐藏在模块内,定义每一个模块时尽可能少地显露其内部的处理。,软件工程,15,每个模块的实现细节对于其它模块是隐蔽的,将来修改软件时偶然引入错误所造成的影响就可以局限在一个或几个模块内部,不致波及到软件的其它部分。在可预见将来可能修改的场合,信息隐蔽可以提高软件的可修改性、可测试性和可移植性。,软件工程,16,3.2 功能独立性,功能独立性是抽象、模块化和信息隐蔽的直接产物。如果一个模块能够独立于其他模块被编程、测试和修改,则该模块具有功能独立性。1978年Myers提出用两个准则来度量功能独立性
8、,即模块间的耦合和模块的内聚。内聚性:内聚是一个模块内部各个元素彼此结合的紧密程度的度量。耦合性:耦合是模块间互相连接的紧密程度的度量,它取决于各个模块之间接口的复杂度、调用方式以及哪些信息通过接口。,软件工程,17,模块间的耦合,模块之间耦合性越强,功能独立性越差,这样形成的模块结构界面不好。,软件工程,18,非直接耦合(Nondirect Coupling),两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。非直接耦合的模块独立性最强。,软件工程,19,数据耦合(Data Coupling),一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公
9、共数据结构或外部变量)来交换输入、输出信息的。,软件工程,20,标记耦合(Stamp Coupling),一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。,软件工程,21,控制耦合(Control Coupling),如果一个模块通过传送开关、标志、名字等控制参数,明显地控制选择另一模块的功能,就是控制耦合。,软件工程,22,外部耦合(External Coupling)一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。公共耦合(Common Coupling)若一组模块都访问同一个公共
10、数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。,软件工程,23,公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只是两模块间有公共数据环境,则公共耦合有两种情况。松散公共耦合和紧密公共耦合。,松散的公共耦合,紧密的公共耦合,软件工程,24,如果发生下列情形,模块之间就是内容耦合:一个模块直接访问另一个模块的内部数据;一个模块不通过正常入口转到另一模块内部;两个模块有一部分程序代码重迭(只可能出现在汇编语言中);一个模块有多个入口。,内容耦合(Content Coupling),软件工程,25,c,进入另一模块内部,模块代码重叠
11、,模块多个入口,软件工程,26,模块内聚,模块内聚性越强,功能独立性越好,对于形成的模块结构有比较好的作用。要求模块结构达到高内聚,低耦合。,软件工程,27,一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。功能内聚模块的功能独立性最强。,功能内聚(Functional Cohesion),软件工程,28,这种模块完成多个功能,各个功能相互独立但都在同一数据结构上操作,每一项功能有一个唯一的入口点。这个模块将根据不同的要求,确定该执行哪一个功能。由于这个模块的所有功能都是基于同一个
12、数据结构(符号表),因此,它是一个信息内聚的模块。信息内聚模块可以看成是多个功能内聚模块的组合,并且达到信息的隐蔽。,信息内聚(Informational Cohesion),软件工程,29,初始化,插入,删除,查找,修改,符 号 表,软件工程,30,如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。模块内各个功能是紧密相连的。,通信内聚(Communication Cohesion),软件工程,31,软件工程,32,使用流程图做为工具设计程序时,如果流程图太大,可以把流程图中的某一部分划出组成模块,就得到过
13、程内聚模块。例如,把流程图中的循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。,过程内聚(Procedural Cohesion),软件工程,33,时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如,初始化模块和终止模块就是时间内聚模块。,时间内聚(Classical Cohesion),软件工程,34,这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。,逻辑内聚(Logical Cohesion),软件工程,35,当几个模块内正好有一段代码是
14、相同的,将它们抽取出来形成单独的模块,即巧合内聚模块。这种模块没有独立功能,各部分之间没有联系,或联系很松散。,巧合内聚(Coincidental Cohesion),软件工程,36,结构化设计(structured design,SD)是一种面向数据流的设计方法,它可以与SA方法衔接。结构化设计是基于模块化、自顶向下细化、结构化程序设计等程序设计技术基础上发展起来的。基本思想是将系统设计成由相对独立、功能单一的模块组成的结构。该方法实施的要点是:首先研究、分析和审查数据流图。从软件,3.3 结构化设计方法,软件工程,37,的需求规格说明中弄清数据流加工的过程,对于发现的问题及时解决。然后根据
15、数据流图确定数据处理的类型。典型的类型有两种:变换型和事务型。针对两种不同类型分别进行分析处理。由数据流图推导出系统的初始结构图。利用一些启发式原则改进系统初始结构图,直到得到符合要求的结构图为止。修改和补充数据字典。制定测试计划。,软件工程,38,在系统结构图中的模块,传入模块 从下属模块取得数据,经过某些处理,再将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。传出模块 从上级模块获得数据,进行某些处理,再将其传送给下属模块。它传送的数据流叫做逻辑输出数据流。变换模块 它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。,软件工程,39,协调模块 对所有下属模块进行
16、协调和管理的模块。,软件工程,40,系统结构图的基本符号,软件工程,41,软件工程,42,数据:模块之间传送的数据用带空心圆的箭头表示,并在旁边标上数据名。控制信息:控制信息与数据的主要区别是前者只反映数据的某种状态。,软件工程,43,数据处理的类型,在需求分析阶段,面向数据流的SA方法产生数据流图DFD。在软件设计阶段,面向数据流的SD方法将DFD转换成程序结构图。数据处理即为在DFD中从系统的输入数据流到系统的输出数据流所经历的一连串连续变换。数据处理的类型分为变换流型与事务流型。,软件工程,44,变换流,数据沿着输入通路进入系统,经过一系列数据变换,将数据的外部形式转换成对应的内部表示,
17、然后通过变换中心(也称主加工)处理,再沿着输出通路转换成外部形式离开系统。具有这种特性的数据流称为变换流。变换流型DFD可以分成:输入变换中心(主加工)输出,软件工程,45,相应于取得数据、变换数据、给出数据,变换流型系统结构图由输入、变换中心和输出等三部分组成。,软件工程,46,事务流,数据沿着输入通路到达一个事务中心,事务中心根据输入数据(即事务)的类型在若干个动作(称为活动流)中选择一个来执行,这种数据流也称为事务流。事务流有明显的事务中心,各活动流以事务中心为起点呈辐射状流出。在事务流型系统结构图中,事务中心模块按所接受的事务的类型,选择某一事务(活动流)处理模块执行。各事务处理模块并
18、列。,软件工程,47,软件工程,48,变换分析,变换分析从变换流型的数据流图导出系统结构图.步骤重画数据流图;区分有效(逻辑)输入、有效(逻辑)输出和变换中心部分;进行一级分解,设计模块结构的顶层和第一层模块;进行二级分解,设计输入、输出和中心变换部分的中、下层模块。,软件工程,49,1.重画数据流图(平铺),为了建立系统结构,将数据流图平铺开来,物理输入画在左侧,物理输出画在右侧。如果一个外部实体既是物理输入又是物理输出,则两侧都要画出它。,软件工程,50,2.确定逻辑输入、逻辑输出和变换中心部分,变换中心是程序的核心功能,它的输入是逻辑输入,它的输出为逻辑输出。,软件工程,51,3.第一级
19、分解:设计模块结构的顶层和第一层,顶层模块:其功能就是整个系统的功能;输入控制模块:接收所有的输入数据;变换控制模块:实现输入到输出的变换;输出控制模块:产生所有的输出数据。,软件工程,52,软件工程,53,4.第二级分解:设计中、下层模块,输入控制模块的分解:从变换中心的边界开始,沿着各输入通路,把输入通路上的每个加工映射成输入控制模块的一个低层模块。输出控制模块的分解:从变换中心的边界开始,沿着各输出通路,把输出通路上的每个加工映射成输出控制模块的一个低层模块。变换控制模块的分解:变换控制模块通常没有通用的分解方法,应根据数据流图中变换部分的实际情况进行设计。,软件工程,54,输出H,G
20、H,A,B,C,D,E,F,G,H,物理输入,物理输出,主模块,CD,E,输入C,输出D,输出E,D,E,输入B,BC,输入A,AB,B,输出G,E G,输出F,DF,D,F,E,G,H,软件工程,55,输出H,G H,A,B,C,D,E,F,G,H,物理输入,物理输出,主模块,CD,E,输入C,输出D,输出E,C,D,E,E,输入B,B,BC,C,输入A,AB,A,B,A,输出G,E G,输出F,DF,D,F,G,H,软件工程,56,事务分析,事务分析是从事务流型数据流图导出系统结构图。步骤:确定事务中心和每条活动流的流特性 将事务流型数据流图映射成高层的系统结构进一步分解,软件工程,57,
21、1.确定事务中心和各活动流的流特性,右图为事务流型DFD的一般形式。事务中心(图中的T):位于活动流的起点,活动流从该点成辐射状流出。活动流:可为变换流可为事务流事务流型的DFD的组成:输入流事务中心若干条活动流,软件工程,58,右图为事务流型DFD的高层结构形式。顶层模块:其功能就是整个系统的功能。接收模块:接收输入数据。分派模块:调度模块,控制下层的所有活动模块。事务模块:对应活动流,是该活动流映射成的。,2.将事务流型DFD映射成高层系统结构,软件工程,59,3.进一步分解,接收模块:类同于变换分析中输入控制模块的分解。活动流模块:根据其流特性(变换流或事务流)进一步采用变换分析或事务分
22、析进行分解。,软件工程,60,模块设计的原则,在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。使用“黑盒”技术:在设计当前模块时,先把该模块的所有下层模块定义成“黑盒”,在设计中利用它们时暂不考虑其内部结构和实现。在这一步定义好的“黑盒”,在下一步就可以对它们进行设计和加工。最后,全部“黑盒”的内容和结构应完全被确定。,软件工程,61,在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图质量。模块划分时,一个模块的直接下属模块一般在 5 个左右。如果直接下属模块超过 10 个,可设立中间层次。如果出现以下情况,就停止模块分解
23、:模块不能再细分为明显的子任务;分解成用户提供的模块或库函数;模块接口是输入输出设备传送的信息;模块不宜再分解得过小。,软件工程,62,变换分析是软件系统结构设计的主要方法。一般,一个大型的软件系统是变换型结构和事务型结构的混合结构。所以,我们通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。,软件工程,63,软件工程,64,模块功能完善化 一个完整的模块应当有以下几部分:执行规定的功能的部分;出错处理的部分。当模块不能完成规定的功能时,必须回送出错标志,出现例外情况的原因。如果需要返回数据给它的调用者,在完成数据加工或结束时,应当给它的调用者返回一个状态码。,改进系统结构的启发式原
24、则,软件工程,65,消除重复功能,改善软件结构完全相似:在结构上完全相似,可能只是在数据类型上不一致。此时可以采取完全合并的方法。局部相似:找出其相同部分,分离出去,重新定义成一个独立的下一层模块。还可以与它的上级模块合并。,软件工程,66,软件工程,67,模块的作用范围应在控制范围之内模块的控制范围包括它本身及其所有的从属模块。模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。,软件工程,68,尽可能减少高扇出结构 如果一个模块的扇出数过大
25、,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。,软件工程,69,避免或减少使用病态联接直接病态联接公共数据域病态联接通信模块病态联接,x,x,x,x,(a)直接病态联接,(b)公共数据域 病态联接,(c)通信模块 病态联接,软件工程,70,模块的大小要适中。设计功能可预测的模块 一个功能可预测的模块,不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。,软件工程,71,功能不可预测的模块,软件工程,72,在过程
26、设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。对每个模块规定的功能以及算法的设计,给出适当的算法描述:图形工具:程序流程图,N-S,PAD,HIPO表格工具:判定表语言工具:PDL,HIPO,3.5 过程设计(详细设计),软件工程,73,程序流程图,软件工程,74,软件工程,75,N-S 图,软件工程,76,N-S图(盒图)示例,软件工程,77,问题分析图(PAD),选择型,顺序型,多分支选择型,先判断重复型,后判断重复型,软件工程,78,PAD示例,软件工程,79,PDL(Program Design Language),PDL是一种用于描述功能模块的算法设计和加工细节的语言。称
27、为设计程序用语言。它是一种伪码。伪码的语法规则分为“外语法”和“内语法”。PDL具有严格的关键字外语法,用于定义控制结构和数据结构,同时它的表示实际操作和条件的内语法可使用自然语言的词汇。,软件工程,80,示例:拼词检查程序,PROCEDURE spellcheckBEGIN-*split document into single words LOOP get next word add word to word list in sortorder EXIT WHEN all words processed END LOOP-*look up words in dictionary LOOP
28、get word from word list,软件工程,81,IF word not in dictionary THEN-*display words not in dictionary display word prompt on user terminal IF user response says word OK THEN add word to good word list ELSE add word to bad word list ENDIF ENDIF EXIT WHEN all words processedEND LOOP,软件工程,82,-*create a new w
29、ords dictionary dictionary:merge dictionary and good word listEND spellcheck,为了区别关键字,规定关键字一律大写,其它单词一律小写。内语法使用自然语言来描述处理特性。内语法比较灵活,只要写清楚就可以,不必考虑语法错,以利于人们可把主要精力放在描述算法的逻辑上。,软件工程,83,判定表,决策表用于表示程序的静态逻辑在决策表中的条件部分给出所有的两分支判断的列表,动作部分给出相应的处理要求将程序流程图中的多分支判断都改成两分支判断,软件工程,84,无多分支判断结构,软件工程,85,软件工程,86,HIPO图,HIPO是19
30、76年由 IBM 公司提出来的,图既是在开发过程中的表达工具,又是开发文档的编制工具。HIPO图采用功能框图和 PDL 来描述程序逻辑,它由两部分组成:层次图(H图)和IPO图。层次图给出程序的层次关系,IPO图为程序各部分提供具体的工作细节。,软件工程,87,层次图(H图)表明各个功能的隶属关系。它是自顶向下逐层分解得到的。最高一层是整个系统的名称和系统的概括功能说明;第二层把系统功能展开,分成几个框;第二层功能进一步分解,就得到了第三层、第四层,直到最后一层。每个框内都应有一个名字,用以标识它的功能。还应有一个编号,以记录它所在的层次及在该层次的位置。,层次图(H图),软件工程,88,软件
31、工程,89,小说明,软件工程,90,IPO图,IPO图为层次图中每一功能框详细地指明输入(I)、处理(P)及输出(O)。通常,IPO图有固定格式,处理操作部分总是列在中间,输入和输出部分分别在其左边和右边。由于某些细节很难在一张IPO图中表达清楚,常常把IPO图又分为两部分:概括的称为概要图(overview diagram)具体的称为详细图(detail diagram)。,软件工程,91,概要IPO图用于表达对一个系统,或对其中某一子系统功能的概略表达,指明完成某一功能框规定的功能时需要哪些输入,哪些操作和哪些输出。详细IPO 图详细表明输入、处理、输出三者之间的关系。输入和输出应是确定的文件和记录,或是文件和记录中的字段,以及具体介质和设备类型,处理框中的操作也应是具体的而不是含糊的,调用子程序时应标明子程序名。,软件工程,92,对应H图上1.1.0框的概要IPO图,输入 Input,输出 Output,处理 Process,软件工程,93,对应于H图1.1.2框的详细IPO图,从1.1.1框来,到 1.1.3框去,软件工程,94,
链接地址:https://www.31ppt.com/p-4987067.html