SW04面向过程的软件设计.ppt
面向过程的软件设计方法,目录,软件设计的目标和任务软件设计基础模块独立性结构化设计方法数据设计过程设计,数据设计侧重于数据结构的定义系统结构设计定义软件系统各主要成份(构件)之间的关系接口设计定义软件内部各成份之间、软件与其它协同系统之间及软件与用户之间的交互机制过程设计,也叫构件设计,则是把结构成份转换成软件的过程性描述,软件设计的目标和任务,软件设计的目标和任务,分析模型设计模型数据设计架构设计接口设计 过程设计,软件设计是软件开发过程中质量得以保证的关键步骤。使得软件的质量评价成为可能。软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构,软件设计的目标和任务,软件设计任务,从工程管理的角度来看,软件设计分两步完成。概要设计,将软件需求转化为数据结构和软件的系统结构,并建立接口 详细设计,即过程设计,通过对结构表示进行细化,得到软件的详细的数据结构和算法,软件设计任务,软件设计的目标,McGlanghlin给出了判断设计好坏的三条特征:设计必须实现分析模型中描述的所有显式需求,必须满足用户希望的所有隐式需求设计必须是可读、可理解的,使得将来易于编程、易于测试、易于维护设计应从实现角度出发,给出与数据、功能、行为相关的软件全貌,软件设计基础,抽象化 自顶向下,逐步细化 模块化 程序结构 信息隐蔽,抽象化,人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。抽出事物的本质特性而暂时不考虑细节。处理复杂系统的有效方法是用层次的方式构造和分析它。软件系统进行模块设计时,有不同的抽象层次,抽象层次.用问题所处环境的术语来描述这个软件:该软件包括一个计算机绘图界面,向绘图员显示图形,以及一个数字化仪界面,用以代替绘图板和丁字尺。所有直线、折线、矩形、圆及曲线的描画、所有的几何计算、所有的剖面图和辅助视图都可以用这个CAD软件实现。,抽象化举例,抽象层次.任务需求的描述。CAD SOFTWARE TASKS user interaction task;2-D drawing creation task;graphics display task;drawing file management task;end.在这个抽象层次上,未给出“怎样做”的信息,不能直接实现。,抽象化举例,抽象层次.程序过程表示,以2-D(二维)绘图生成任务为例:PROCEDURE:2-D drawing creationREPEAT UNTIL(drawing creation task terminate)DO WHILE(digitizer interaction occurs)digitizer interface task;DETERMINE drawing request CASE;line:line drawing task;rectangle:rectangle drawing task;circle:circle drawing task;,抽象化举例,自顶向下,逐步求精,逐步求精是人类解决复杂问题时采用的基本方法,也是许多软件工程技术的基础。“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。”人类的认知过程遵守Miller法则:一个人在任何时候都只能把注意力集中在(72)个知识块上。抽象与求精是一对互补的概念。将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的软件设计。,模块化,软件系统的模块化是指整个软件被划分成若干单独命名和可编址的部分,称之为模块。把问题子问题的分解与软件开发中的系统子系统或系统模块对应起来,就能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构模块化方法的好处:模块化设计降低了系统的复杂性,使得系统容易修改推动了系统各个部分的并行开发,从而提高了软件的生产效率,C(x)描述问题x复杂性,E(x)定义解决问题x所需工作量。对于两个问题p1和p2:C(p1)C(p2)E(p1)E(p2)(13.1)C(p1p2)C(p1)C(p2)(13.2)E(p1p2)E(p1)E(p2)(13.3),模块化,程序结构,也叫控制层次,表明了程序各个部件(模块)的组织情况,是软件的过程表示控制层次往往用程序的层次(树形或网状)结构来表示,模块:模块用矩形框表示,并用模块的名字标记它。,结构图,模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块指向被调用模块,表示调用模块调用了被调用模块,结构图,模块间的信息传递:当一个模块调用另一个模块时,调用模块把数据或控制信息传送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块,结构图,在模块A的箭头尾部标以一个菱形符号,表示模块A有条件地调用另一个模块B。当一个在调用箭头尾部标以一个弧形符号,表示模块A反复调用模块C和模块D。,结构图,程序的系统结构图,程序结构,程序结构的深度:程序结构的层次数称为结构的深度。结构的深度在一定意义上反映了程序结构的规模和复杂程度。程序结构的宽度:层次结构中同一层模块的最大模块个数称为结构的宽度。模块的扇入和扇出:扇出表示一个模块直接调用(或控制)的其它模块数目。扇入则定义为调用(或控制)一个给定模块的模块个数。多扇出意味着需要控制和协调许多下属模块。而多扇入的模块通常是公用模块。,信息隐蔽,由 parnas 方法提倡的信息隐蔽是指,每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。更确切的说,应该为“细节隐蔽”,模块独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能,而和其它模块的接口是简单的例如,若一个模块只具有单一的功能且与其它模块没有太多的联系,则称此模块具有模块独立性一般采用两个准则度量模块独立性。即模块间耦合和模块内聚,模块的独立性,耦合是模块之间的互相连接的紧密程度的度量。内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。模块独立性比较强的模块应是高内聚、低耦合的模块。,模块的独立性,模块间的耦合,如果发生下列情形,两个模块之间就发生了内容耦合(1)一个模块直接访问另一个模块的内部数据;(2)一个模块不通过正常入口转到另一模块内部;(3)两个模块有一部分程序代码重迭;(4)一个模块有多个入口。,内容耦合,若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。,公共耦合,一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。,外部耦合,如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。,控制耦合,如果一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合,数据耦合,如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。,非直接耦合,c,模块内聚,巧合内聚又称为偶然内聚。当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为巧合内聚模块,它是内聚程度最低的模块。,巧合内聚,这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。,逻辑内聚,时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。,时间内聚,如果一个模块执行一系列与产品要遵循的步骤顺序有关的操作,则该模块具有过程内聚。使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。,过程内聚,如果一个模块内各功能部分都使用了相同的输入数据,或者产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。,通信内聚,一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。,功能内聚,这种模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点。这个模块将根据不同的要求,确定该执行哪一个功能。,信息内聚,信息内聚模块可以看成是多个功能内聚模块的组合,并且达到信息的隐蔽。即把某个数据结构、资源或设备隐蔽在一个模块内,不为别的模块所知晓。,信息内聚,结构化设计方法,三类软件设计方法:第一类是根据系统的数据流进行设计,称为面向操作的设计或者过程驱动的设计,结构化设计。第二类是根据系统的数据结构进行设计,称为面向数据的设计或者数据驱动的设计,如Jackson系统开发方法和数据结构化系统开发(DSSD)方法第三类设计方法即面向对象的设计,结构化设计方法,首先研究、分析和审查数据流图。然后根据数据流图决定问题的类型。数据处理问题典型的类型有两种:变换型和事务型。针对两种不同的类型分别进行分析处理。由数据流图推导出系统的初始程序结构图。利用一些启发式原则来改进系统的初始结构图,直到得到符合要求的结构图为止。,在系统结构图中的模块,传入模块 从下属模块取得数据,经过某些处理,再将其传送给上级模块。传送的数据流叫逻辑输入数据流。传出模块 从上级模块获得数据,进行某些处理,再将其传送给下属模块。传送的数据流叫逻辑输出数据流。变换模块 它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。加工的数据流叫变换数据流。协调模块 对所有下属模块进行协调和管理的模块。,变换型系统结构图,变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。变换型系统结构图由输入、中心变换和输出等三部分组成。,事务型系统结构图,它接受一项请求,根据请求的特点和性质,选择分派一个适当的处理单元,然后给出结果。在事务型系统结构图中,事务中心模块按所接受的事务的类型,通过调度模块选择某一事务处理模块执行。各事务处理模块并列,每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。,变换分析,变换分析方法由以下四步组成:重画数据流图;区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分;进行一级分解,设计上层模块;进行二级分解,设计输入、输出和中心变换部分的中、下层模块。,在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图的质量。使用“黑箱”技术:在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”,暂时不考虑其内部结构和实现。在这一步定义好的“黑箱”,在下一步就可以对它们进行设计和加工。这样,又会导致更多的“黑箱”。最后,全部“黑箱”的内容和结构应完全被确定。,变换分析,在模块划分时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设立中间层次。如果出现了以下情况,就停止模块的功能分解:当模块不能再细分为明显的子任务时;当分解成用户提供的模块或程序库的子程序时;当模块的界面是输入输出设备传送的信息时;当模块不宜再分解得过小时。,变换分析,事务分析,在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能。这种数据流就叫做事务。与变换分析一样,事务分析也是从分析数据流图开始,自顶向下,逐步分解,建立系统到结构图。,变换分析是软件系统结构设计的主要方法。一般,一个大型的软件系统是变换型结构和事务型结构的混合结构。所以,我们通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。例如,变换型系统结构中的某个变换模块本身又具有事务型的特点。,二者结合,软件模块结构的改进-1,模块功能的完善化,一个完整的模块应当有以下几部分:执行规定的功能;出错处理的部分;如果需要返回一系列数据给它的调用者,在完成数据加工或结束时,应当给它的调用者返回一个结束状态标志。,消除重复功能,改善软件结构完全相似:在结构上完全相似,可能只是在数据类型上不一致。此时可以采取完全合并的方法。局部相似:找出其相同部分,分离出去,重新定义成一个独立的下一层模块。还可以与它的上级模块合并。,软件模块结构的改进-2,模块的作用范围应在控制范围之内模块控制范围包括本身及其所有从属模块作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的,软件模块结构的改进-3,软件模块结构的改进-3,模块的作用范围应在控制范围之内将判定所在模块合并到父模块中,使判定处于较高层次,软件模块结构的改进-3,模块的作用范围应在控制范围之内将受判定影响的模块下移到控制范围内,软件模块结构的改进-3,模块的作用范围应在控制范围之内将判定上移到层次中较高的位置,软件模块结构的改进-4,尽可能减少高扇出结构,随着深度增大扇入。如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。,避免或减少使用病态联接,软件模块结构的改进-5,模块的大小要适中。模块的大小,可以用模块中所含语句的数量的多少来衡量。把模块的大小限制在一定的范围之内。通常规定其语句行数在50100左右,保持在一页纸之内,最多不超过500行。,软件模块结构的改进-6,设计功能可预测的模块,但要避免过分受限制的模块 一个功能可预测的模块,不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。,软件模块结构的改进-7,如果一个模块的局部数据结构的大小、控制流的选择或者与外界(人、硬软件)的接口模式被限制死了,则很难适应用户新的要求或环境的变更。为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,控制流的选择对于调用者来说,应当是可预测的。而与外界的接口应当是灵活的。,软件模块结构的改进-7,软件包应满足设计约束和可移植性为了使得软件包可以在某些特定的环境下能够安装和运行,对软件包提出了一些设计约束和可移植的要求。,软件模块结构的改进-8,设计的后处理,为每一个模块写一份处理说明为每一个模块提供一份接口说明确定全局数据结构和局部数据结构指出所有的设计约束和限制进行概要设计的评审进行设计的优化(如果需要和可能的话),IBM的一个例子,数据设计,数据设计文件设计,1.用于软件的系统化方法也适用于数据。在导出、评审和定义软件的需求和软件系统结构时,必须定义和评审其中所用到的数据流、数据对象及数据结构的表示。应当考虑几种不同的数据组织方案,还应当分析数据设计给软件设计带来的影响。,数据设计的原则,2.确定所有的数据结构和在每种数据结构上施加的操作。设计有效的数据结构,必须考虑到要对该数据结构进行的各种操作。3.应当建立一个数据词典并用它来定义数据和软件的设计。数据词典清楚地说明了各个数据之间的关系和对数据结构内各个数据元素的约束。,数据设计的原则,4.低层数据设计的决策应推迟到设计过程的后期进行。在进行需求分析时确定的总体数据组织,应在概要设计阶段加以细化,在详细设计阶段才规定具体的细节。5.数据结构的表示只限于那些必须直接使用该数据结构内数据的模块才能知道。此原则就是信息隐蔽和与此相关的耦合性原则。,数据设计的原则,6.应当建立一个存放有效数据结构及相关操作的库。数据结构应当设计成为可复用的。建立一个存有各种可复用的数据结构模型的部件库。7.软件设计和程序设计语言应当支持抽象数据类型的定义和实现。以上原则适用于软件工程的定义阶段和开发阶段。“清晰的信息定义是软件开发成功的关键”。,数据设计的原则,过程设计,从软件开发的工程化观点来看,在使用程序设计语言编制程序以前,需要对所采用算法的逻辑关系进行分析,设计出全部必要的过程细节,并给予清晰的表达。这就是过程设计的任务。,在过程设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。表达过程规格说明的工具叫做详细设计工具,它可以分为以下三类:图形工具 表格工具 语言工具,过程设计,程序流程图,程序流程图也称为程序框图,程序流程图使用五种基本控制结构是:,示例,程序流程图的标准符号,N-S图,N-S图也叫做盒图。五种基本控制结构由五种图形构件表示。,示例,N-S图的嵌套定义形式,PAD也设置了五种基本控制结构的图式,并允许递归使用。,问题分析图(PAD),PAD描述的示例,判定表,判定表用于表示程序的静态逻辑在判定表中的条件部分给出所有的两分支判断的列表,动作部分给出相应的处理要求将程序流程图中的多分支判断都改成两分支判断,无多分支判断结构,建立判定表的步骤,列出与一个具体过程(或模块)有关的所有处理。列出过程执行期间的所有条件(或所有判断)。将特定条件取值组合与特定的处理相匹配,消去不可能发生的条件取值组合。将右部每一纵列规定为一个处理规则,即对于某一条件取值组合将有什么动作。,PDL(Program Design Language),PDL是一种用于描述功能模块的算法设计和加工细节的语言。称为设计程序用语言。它是一种伪码。伪码的语法规则分为“外语法”和“内语法”。PDL具有严格的关键字外语法,用于定义控制结构和数据结构,同时它的表示实际操作和条件的内语法可使用自然语言的词汇。,示例:拼词检查程序,PROCEDURE spellcheck IS BEGIN split document into single words lood up words in dictionary display words which are not in dictionary create a new dictionary END spellcheck,提供全部结构化控制结构、数据说明和模块特征。能对PDL正文进行结构分割,使之变得易于理解。为了区别关键字,规定关键字一律大写,其它单词一律小写。或者规定关键字加下划线,或者规定它们为黑体字。,PDL的特点,内语法使用自然语言来描述处理特性。内语法比较灵活,只要写清楚就可以,不必考虑语法错,以利于人们可把主要精力放在描述算法的逻辑上。有数据说明机制,包括简单的(如标量和数组)与复杂的(如链表和层次结构)的数据结构。有子程序定义与调用机制,用以表达各种方式的接口说明。,PDL的特点,使用PDL语言,逐步求精:,PROCEDURE spellcheckBEGIN-*split document into single wordsLOOP get next word add word to word list in sortorder EXIT WHEN all words processedEND LOOP-*look up words in dictionaryLOOP get word from word listIF 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-*create a new words dictionary dictionary:merge dictionary and good word listEND spellcheck,使用PDL语言,逐步求精:,用户界面设计,系统响应时间、用户帮助设施、错误信息处理和命令交互一致性用户控制中断处理。,