-结构化系统设计(总体设计)精要教案.ppt
-结构化系统设计(总体设计)精要 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望本章主要内容本章主要内容l8.1 软件架构的设计(软件架构的设计(achitecture)l8.2 结构化软件结构设计的基本概念结构化软件结构设计的基本概念(structure)l8.3 结构化软件结构设计方法结构化软件结构设计方法(structure)8.1 软件架构的设计(软件架构的设计(achitecture)l8.1.1 什么是软件架构什么是软件架构l8.1.2 架构设计架构设计8.1.1.软件架构的概念软件架构的概念l建筑、文学、音乐、机械、电子、计算机软硬件等建筑、文学、音乐、机械、电子、计算机软硬件等领域都会使用领域都会使用“架构(架构(architecture)”这一概念。这一概念。架构都提供了系统最高层的设计方案,以确保建筑、架构都提供了系统最高层的设计方案,以确保建筑、小说、乐曲、设备、计算机等系统满足期望的特性。小说、乐曲、设备、计算机等系统满足期望的特性。好的建筑应该美观、坚固、实用好的建筑应该美观、坚固、实用好的计算机应用系统应该实用、好维护、可靠、性价比高好的计算机应用系统应该实用、好维护、可靠、性价比高l架构师(架构师(architect)需要发现特定系统的最重要的)需要发现特定系统的最重要的关注点,设计某种折衷的总体方案以满足关注点。关注点,设计某种折衷的总体方案以满足关注点。l架构包含系统的一组基本结构(架构包含系统的一组基本结构(structure),每种),每种结构都有各种类型的部件(结构都有各种类型的部件(component)及其关系)及其关系构成,架构描述了这些部件的组合、相互调用参照、构成,架构描述了这些部件的组合、相互调用参照、通信以及其他动态交互。通信以及其他动态交互。架构和结构的关系架构和结构的关系l架构是抽象无形的,体现高层全局的决策,就像文架构是抽象无形的,体现高层全局的决策,就像文章的中心思想和提纲。章的中心思想和提纲。l结构是具体有形的,体现决策的贯彻,如同文章的结构是具体有形的,体现决策的贯彻,如同文章的每个段落及细节描述。每个段落及细节描述。l架构包含了结构的初步描述和决策。架构包含了结构的初步描述和决策。l相同架构的系统,具体结构允许有差异。相同架构的系统,具体结构允许有差异。使用桥梁来比喻使用桥梁来比喻l桥梁的架构设计可以使用草图描述,架构决定了桥梁桥梁的架构设计可以使用草图描述,架构决定了桥梁的基本结构部件。的基本结构部件。桥梁有梁式桥、拱桥、斜拉桥、悬索桥等架构桥梁有梁式桥、拱桥、斜拉桥、悬索桥等架构斜拉桥的基本结构:斜拉桥的基本结构:索塔索塔 主梁主梁 斜拉索斜拉索 使用桥梁来比喻使用桥梁来比喻l桥梁的结构设计则需要考虑各种部件的数量、材料、桥梁的结构设计则需要考虑各种部件的数量、材料、重量、形态等方面,是可以施工的严谨的结构图。重量、形态等方面,是可以施工的严谨的结构图。架构是抽象的,对结构进行了设计和限定,每座桥的结构架构是抽象的,对结构进行了设计和限定,每座桥的结构是具体有形的、元素组合千变万化是具体有形的、元素组合千变万化1.软件架构软件架构l软件架构(软件架构(software architecture)的定义没有统)的定义没有统一的版本,一般认为:一个应用程序或计算系统的一的版本,一般认为:一个应用程序或计算系统的软件架构是一个或一组结构,它包含组成系统的软软件架构是一个或一组结构,它包含组成系统的软件元素、这些元素对外可见的性质以及它们之间的件元素、这些元素对外可见的性质以及它们之间的关系。对外可见的性质指软件元素能够提供的服务、关系。对外可见的性质指软件元素能够提供的服务、性能特征、错误处理、共享资源的用法等。性能特征、错误处理、共享资源的用法等。软件的一个结构元素可能是一个子系统、构件、进程、库、软件的一个结构元素可能是一个子系统、构件、进程、库、数据库、计算结点、遗留系统等等。数据库、计算结点、遗留系统等等。l软件架构是最高层次的系统分解,它不会囊括所有软件架构是最高层次的系统分解,它不会囊括所有的结构和行为的定义,它只关注那些被认为是重要的结构和行为的定义,它只关注那些被认为是重要的元素。的元素。n架构难以更改,一旦修改,意味着整个系统重建,而结构架构难以更改,一旦修改,意味着整个系统重建,而结构修改只影响局部。修改只影响局部。2.软件架构模式软件架构模式l大部分的架构来源于有相似关注点的系统的总结和大部分的架构来源于有相似关注点的系统的总结和抽象,这些相似性被描述成某种特殊模式的架构风抽象,这些相似性被描述成某种特殊模式的架构风格,也就是架构模式(格,也就是架构模式(architectural pattern)。)。l一种架构模式就是一个经验秘籍,架构师在设计不一种架构模式就是一个经验秘籍,架构师在设计不同系统时可以重复使用这些先进经验。同系统时可以重复使用这些先进经验。图图10.110.1就是桥梁的四种常用架构模式。就是桥梁的四种常用架构模式。中国建筑有一种攒尖模式,被广泛应用在古典园林中,如中国建筑有一种攒尖模式,被广泛应用在古典园林中,如三角、四角、五角、八角等亭子,宫殿、坛庙大量应用。三角、四角、五角、八角等亭子,宫殿、坛庙大量应用。软件架构模式软件架构模式l软件架构模式就是可重复使用的软件结构风格软件架构模式就是可重复使用的软件结构风格。8.1.2 架构设计架构设计l主机主机-终端的集中控制结构终端的集中控制结构l分布式对象结构分布式对象结构l客户机客户机-服务器的分布式结构服务器的分布式结构C/SC/S结构结构B/SB/S结构结构1、主机主机-终端式结构终端式结构l软件配置在主机上,处理能力也集中于主机软件配置在主机上,处理能力也集中于主机l终端用于输入和输出,无终端用于输入和输出,无CPUCPU主机Host终端Terminal控制台Console主机主机-终端的一般硬件配置终端的一般硬件配置l主机终端网络拓扑结构主机终端网络拓扑结构.CPUCPU.控台控台.汉字用户终端一期 40台,二期100台,小型打印机一期 5台,二期 8 台激光打印机2 台,行打1台3台磁带机4000M硬盘通信控制器中心终端,一期 2 台,二期 10 台2、分布式对象结构分布式对象结构l每个对象在逻辑上是平等的,它们可以互相为对每个对象在逻辑上是平等的,它们可以互相为对方提供所需的服务。方提供所需的服务。l提供服务的对象就是服务器,而提出服务请求的提供服务的对象就是服务器,而提出服务请求的对象就是客户。对象就是客户。软件总线软件总线(ORB)O1S(O1)O2S(O2)OnS(On)分布式对象结构分布式对象结构分布式对象结构的网络拓扑模型分布式对象结构的网络拓扑模型l分布式对象结构分布式对象结构.通信控制器PC1PC2PC3点阵打印机硬盘驱动器激光打印机a.星形网络.PC1PC2PC3点阵打印机激光打印机b.总线形网络.PC1PC2PC3硬盘驱动器激光打印机c.环形网络3、客户机客户机-服务器结构服务器结构l处理分布于客户机和服务器。处理分布于客户机和服务器。l客户机完成本地运算,可向服务器请求某种服务客户机完成本地运算,可向服务器请求某种服务(如查询数据),服务器响应请求,完成运算后,(如查询数据),服务器响应请求,完成运算后,将结果返回给客户机将结果返回给客户机数据库服务器客户机数据库客户机客户机-服务器的一般硬件配置服务器的一般硬件配置l客户机客户机/服务器结构服务器结构.微机.微机微机工作站.工作站数据库服务器数据库服务器应用服务器客户机客户机-服务器的软件配置服务器的软件配置lClient/Server(C/S):应用程序配置于客户机,:应用程序配置于客户机,DBMS配置于服务器。配置于服务器。数据库数据库数据库数据库服务器服务器数据库数据库服务器服务器Web应用应用服务器服务器数据库数据库Browser/Server(B/S):):应用程序配置于应用程序配置于Web应用服务器,客户端配置浏览器程序应用服务器,客户端配置浏览器程序B/S的工作机制的工作机制lB/S结构结构(Internet架构架构).用户.用户.用户WEB服务器服务器数据库服务器数据库服务器ODBC数据请求返回数据数据请求返回数据Lan连接HTTP连接如何选择架构模式如何选择架构模式l内部管理、安全性要求高、后台少数人使用的功内部管理、安全性要求高、后台少数人使用的功能采用能采用WindowsWindows界面的界面的C/SC/S结构,也称为胖客户端。结构,也称为胖客户端。l外部用户较多的功能采用浏览器界面的外部用户较多的功能采用浏览器界面的B/SB/S结构,结构,也成为瘦客户端。也成为瘦客户端。胖客户端胖客户端/瘦客户端,各有优缺点:瘦客户端,各有优缺点:lC/SC/S架构的缺点主要是部署、更新的问题。架构的缺点主要是部署、更新的问题。lB/SB/S架构的缺点主要是受制于架构的缺点主要是受制于HTMLHTML的限制,无法像的限制,无法像C/SC/S那样使用丰富的效果来展示数据,用户体验比那样使用丰富的效果来展示数据,用户体验比较糟糕。较糟糕。软件架构的最新发展软件架构的最新发展丰富客户端丰富客户端lRIARIA(Rich Internet ApplicationRich Internet Application)的出现给我)的出现给我们带来重新在客户端和服务器端进行更好的平衡们带来重新在客户端和服务器端进行更好的平衡的机会。是集桌面应用程序的最佳用户界面功能的机会。是集桌面应用程序的最佳用户界面功能与与WebWeb应用程序的普遍采用和快速、低成本布署以应用程序的普遍采用和快速、低成本布署以及互动多媒体通信的实时快捷于一体的新一代网及互动多媒体通信的实时快捷于一体的新一代网络应用程序络应用程序 。l有以下特点:有以下特点:在消息确认和格式编排方面提供互动用户界面在消息确认和格式编排方面提供互动用户界面在无刷新页面之下提供快捷的界面响应时间(在无刷新页面之下提供快捷的界面响应时间(AjaxAjax技技术术Asynchronous JavaScript and XML Asynchronous JavaScript and XML)提供通用的用户界面特性如拖放式(提供通用的用户界面特性如拖放式(drag and dropdrag and drop)以及在线和离线操作能力以及在线和离线操作能力结合了结合了B/SB/S配置的优势和配置的优势和C/SC/S界面丰富的特点界面丰富的特点8.2 结构化软件结构设计的基本概念结构化软件结构设计的基本概念(structure)l8.2.1 结构化设计内容结构化设计内容l8.2.2 结构化设计思想结构化设计思想l8.2.3 模块模块l8.2.4 结构图结构图l8.2.5 模块的联系模块的联系l8.2.6 模块间的耦合模块间的耦合l8.2.7 模块的内聚模块的内聚l8.2.8 启发规则启发规则l采用强调自顶向下、逐层分解的功能模块设计,也称采用强调自顶向下、逐层分解的功能模块设计,也称为为结构化设计。主要包括:结构化设计。主要包括:-将系统划分成功能模块(将系统划分成功能模块(ModuleModule););-决定每个模块的功能;决定每个模块的功能;-决定模块的调用关系;决定模块的调用关系;-决定模块的界面(决定模块的界面(InterfaceInterface,接口),即调用时传入的信,接口),即调用时传入的信息(函数参数),以及返回的信息(返回值)。息(函数参数),以及返回的信息(返回值)。l主要模型:模块结构图(主要模型:模块结构图(SC,Structure Chart),也),也称功能结构图。称功能结构图。8.2.1 设计内容设计内容8.2.2 设计思想设计思想l结构化:自顶向下,逐层分解求精结构化:自顶向下,逐层分解求精l结构化设计:软件模块化,按层次划分结构化设计:软件模块化,按层次划分模块化因为根据经验:因为根据经验:n对于问题对于问题1(P1)和问题)和问题2(P2)n若:若:C(P1)C(P2)n则则:E(P1)E(P2)n有规律显示:有规律显示:n C(P1+P2)C(P1)+C(P2)n则:则:E(P1+P2)E(P1)+E(P2)nC表示复杂度,表示复杂度,E表示需要的工作量表示需要的工作量模块化设计方法模块化设计方法l使用功能分解一定程度上能够简化系统结构,使系使用功能分解一定程度上能够简化系统结构,使系统容易修改和理解。统容易修改和理解。l具体做法:具体做法:把整个软件划分为部分,其中每一部分的功能简单明确,把整个软件划分为部分,其中每一部分的功能简单明确,即程序模块(可以是子过程或函数)即程序模块(可以是子过程或函数)划分模块的工作按层次进行,上层模块调用下层模块划分模块的工作按层次进行,上层模块调用下层模块每一个模块应尽可能独立每一个模块应尽可能独立模块间的调用接口要阐明(模块名称、输入数据、输出数模块间的调用接口要阐明(模块名称、输入数据、输出数据)据)8.2.3 模块模块l模块模块(Module)一词使用很广泛。通常对应于用一个一词使用很广泛。通常对应于用一个名字就可以调用的一段程序语句(子程序或函数)。名字就可以调用的一段程序语句(子程序或函数)。l模块具有输入和输出、逻辑功能、运行程序、内部模块具有输入和输出、逻辑功能、运行程序、内部数据四种属性。数据四种属性。计算年龄计算年龄模块的图形表示方法模块的图形表示方法模块的函数接口表示模块的函数接口表示int GetAge(date birthday)小程序练习小程序练习l计算计算 5!6!7!。!。l代码如下:代码如下:x1=1;for(int i=1;i=5;i+)x1=x1*i;x2=1;for(int i=1;i=6;i+)x2=x2*i;x3=1;for(int i=1;i=7;i+)x3=x3*i;x4=x1+x2+x3;封装一个求阶乘封装一个求阶乘的模块吧!的模块吧!定义和调用子过程定义和调用子过程lC#定义:定义:Public void PrintGradeReport(String stuID)调用:调用:PrintGradeReport(“2008012264”);模块之子程序模块之子程序l可可视视化化程程序序设设计计采采用用事事件件驱驱动动的的编编程程技技术术,使使用用事事件件过程,事件过程也是子程序。过程,事件过程也是子程序。l例如按钮例如按钮button1单击的事件过程如下:单击的事件过程如下:lC#.NET:事件过程的定义:事件过程的定义:private void button1_Click(object sender,EventArgs e)事件过程的调用(与事件绑定后自动完成调用):事件过程的调用(与事件绑定后自动完成调用):this.button1.Click+=new System.EventHandler(this.button1_Click);模块之事件过程模块之事件过程l与子过程的区别:与子过程的区别:函数存在返回值函数存在返回值调用函数通常要使用其返回值调用函数通常要使用其返回值lC#定义函数定义函数 Public long Factorial(int n)调用函数调用函数 x1=Factorial(5);x2=Factorial(6);模块之函数模块之函数接口成本接口成本/集成成本集成成本成本成本/工作量工作量模块数量模块数量单元模块成本单元模块成本软件总成本软件总成本模块数量和软件成本模块数量和软件成本 粒度太大,单个模块复杂度升高、维护困难粒度太大,单个模块复杂度升高、维护困难 粒度太小,管理与运行成本升高粒度太小,管理与运行成本升高试想一下:每个经理管理协调多少个下级合适?试想一下:每个经理管理协调多少个下级合适?8.2.4 结构图结构图l结构图结构图(Structure Chart)描述系统的模块结构及模描述系统的模块结构及模块间的联系块间的联系l 结构图中的主要成分有:结构图中的主要成分有:模块:模块:用长方形表示用长方形表示调用:调用:从一个模块指向另一模块的箭头表示前一个模块调从一个模块指向另一模块的箭头表示前一个模块调用后一个模块。有循环调用和条件调用用后一个模块。有循环调用和条件调用数据:数据:用带圆圈的小箭头表示从一个模块传递给另一模块用带圆圈的小箭头表示从一个模块传递给另一模块的数据(有实义)的数据(有实义)控制信息:控制信息:带涂黑圆圈的小箭头表示一个模块传送给另一带涂黑圆圈的小箭头表示一个模块传送给另一模块的控制信息模块的控制信息主调模块主调模块被调模块被调模块被调模块被调模块主调模块主调模块被调模块被调模块被调模块被调模块循环调用条件调用l结构图无严格的模块调用顺序,但一般习惯从左至右结构图无严格的模块调用顺序,但一般习惯从左至右l因为约定遵从从上向下的调用,调用关系也可以不使因为约定遵从从上向下的调用,调用关系也可以不使用箭头,而直接使用直线用箭头,而直接使用直线l模块间传递的信息如果出现在数据字典中,则视为数模块间传递的信息如果出现在数据字典中,则视为数据,否则为控制信息据,否则为控制信息结构图的画法结构图的画法计算获得有效数据生成报表打印报表读入数据核对数据打印表头打印表尾显示无效数据打印一行有效数据EOF数据EOF有效数据数据有效数据结果EOF结果日期数据行总计行总计一个完整的结构图一个完整的结构图简单画法的结构图(简单画法的结构图(H图)图)l借书模块还可分解:借书模块还可分解:验证读者身份、修改图书状态、保存借阅记录等验证读者身份、修改图书状态、保存借阅记录等l简化后,忽略信息传递的结构图如下:简化后,忽略信息传递的结构图如下:8.2.5 模块的联系模块的联系l为了衡量模块的相对独立性,提出了模块间的耦合为了衡量模块的相对独立性,提出了模块间的耦合(Coupling)与模块的内聚与模块的内聚(Cohesion)两个标准两个标准耦合:模块和模块之间的联系程度耦合:模块和模块之间的联系程度内聚:模块内部各元素之间的联系程度内聚:模块内部各元素之间的联系程度l设计目标:设计目标:模块内的联系越紧越好模块内的联系越紧越好模块间的联系越少越好模块间的联系越少越好为什么?为什么?8.2.6 模块的耦合模块的耦合double CalculateAvg()int n;double total,average,value;scanf(“输入个数:输入个数:n”,&n);total=sum(n);average=total/n;return(average);两个模块之间存在联系两个模块之间存在联系影响耦合度的因素影响耦合度的因素l如果使用模块如果使用模块A需要了解模块需要了解模块B,那么,那么A和和B是耦合是耦合的。影响模块间耦合程度有三方面的因素:的。影响模块间耦合程度有三方面的因素:联系方式联系方式模块间通过什么方式联系模块间通过什么方式联系来往信息的作用来往信息的作用模块间来往信息作什么用模块间来往信息作什么用数量数量模块间来往信息的多少。模块间来往信息的多少。混合混合控制控制数据数据 用过程用过程 直接引用直接引用语句调用语句调用少少多多数量数量方式方式作用作用0 0离坐标原点越远,离坐标原点越远,耦合程度越高耦合程度越高耦合的类型耦合的类型l耦合分类如下:耦合分类如下:数据耦合:数据耦合:采用子程序调用,调用模块将需要进行处理采用子程序调用,调用模块将需要进行处理的数据传递给被调模块。数据耦合是不可避免的。的数据传递给被调模块。数据耦合是不可避免的。标记耦合:标记耦合:如果调用模块将整个数据记录传递给被调模如果调用模块将整个数据记录传递给被调模块,而被调模块只使用了部分数据项,则称为标记耦合块,而被调模块只使用了部分数据项,则称为标记耦合或特征耦合。或特征耦合。控制耦合:控制耦合:一个模块将控制信息传递给另一个模块,以一个模块将控制信息传递给另一个模块,以控制被调模块的内部处理逻辑。(可以分解)控制被调模块的内部处理逻辑。(可以分解)公共环境耦合:公共环境耦合:如果两个模块共享同一全局数据,称为如果两个模块共享同一全局数据,称为公共耦合。公共耦合。内容耦合:内容耦合:两个模块之间的内部属性有直接关联,也称两个模块之间的内部属性有直接关联,也称病态耦合。(某些病态耦合。(某些GOTOGOTO语句)语句)松散松散紧密紧密代码举例代码举例1l编写函数用于确定某年是否为闰年。编写函数用于确定某年是否为闰年。Function IsLeapYear(yearAs integer)As Boolean If year Mod 40 or (year Mod 100=0 and year Mod 4000)Then isLeapYear=False Else isLeapYear=True End IfEnd FunctionSub Button1_Click()if IsLeapYear(Convert.ToInt(Textbox1.Text)End Sub代码举例代码举例2l编写函数可以实现温度值从华氏转换为摄氏和从摄编写函数可以实现温度值从华氏转换为摄氏和从摄氏转换为华氏。氏转换为华氏。/source:需要转换的原始温度值:需要转换的原始温度值/isCtoF:设置转换方式,:设置转换方式,True表示从摄氏到华氏,表示从摄氏到华氏,/False表示从华氏到摄氏表示从华氏到摄氏/返回值为转换后的温度值返回值为转换后的温度值int ChangeTemp(int source,bool isCtoF)if(isCtoF)return(source*9/5)+32);else return(source-32)*5/9);l参数参数isCtoF 不用于计算,仅用于控制逻辑(分解)不用于计算,仅用于控制逻辑(分解)代码举例代码举例3l根据血常规分析感冒特征根据血常规分析感冒特征struct BloodWBC /白细胞白细胞 RBC /红细胞红细胞 HGB /血红蛋白血红蛋白 PLT /血小板血小板 LYM /淋巴细胞百分比淋巴细胞百分比 int DiagCold(struct Blood bld)/利用白细胞、中性粒子百分比、淋巴细胞百分比三项分析利用白细胞、中性粒子百分比、淋巴细胞百分比三项分析lDiagCold只需要传入数据中的部分内容只需要传入数据中的部分内容代码举例代码举例4l左边使用参数,右边使用全局变量,哪个耦合度更左边使用参数,右边使用全局变量,哪个耦合度更高?高?struct Box float length;float width;float height;float volume;main()struct Box x;x=InputData();x.volume=CalcVolume(x);PrintData(x);return 0;extern struct Box x main()InputData();CalcVolume();PrintData();return 0;void InputData()/输入数据到输入数据到x void CalcVolumn()/利用利用x计算计算 void PrintData()/打印打印x各项内容各项内容 8.2.7 模块的内聚模块的内聚double CalculateAvg()int n;double total,average,value;scanf(“input value:”,&value);while value=0.0n=n+1;total=total+value;scanf(“ninput value:”,&value);average=total/n;return(average);模块内部各元素(变量、语句)之间存在联系模块内部各元素(变量、语句)之间存在联系内聚的好处内聚的好处l模块的内聚反映模块内部联系的紧密程度。模块的内聚反映模块内部联系的紧密程度。l一个模块只需要做好一件事情,不要过分关心其它一个模块只需要做好一件事情,不要过分关心其它任务。任务。l高内聚性的好处是可以提高程序的可靠性。高内聚性的好处是可以提高程序的可靠性。有一个调查表明,有一个调查表明,5050的强内聚性子程序是没有错误的,的强内聚性子程序是没有错误的,而只有而只有 1818的弱内聚性子程序才是无错的,弱内聚性子的弱内聚性子程序才是无错的,弱内聚性子程序的出错机会要比强内聚性出错机会高程序的出错机会要比强内聚性出错机会高 6 6 倍,而修正倍,而修正成本则要高成本则要高 19 19 倍。摘自倍。摘自代码大全代码大全内聚的类型内聚的类型l模块的内聚可以分以下七类:模块的内聚可以分以下七类:、偶然内聚、偶然内聚(coincidental cohesion)(coincidental cohesion)、逻辑内聚、逻辑内聚(Logical cohesion)(Logical cohesion)、时间内聚、时间内聚(temporal cohesion)(temporal cohesion)、步骤内聚、步骤内聚(procedural cohesion)(procedural cohesion)、通信内聚、通信内聚(communicational cohesion)(communicational cohesion)、顺序内聚、顺序内聚(Sequential cohesion)(Sequential cohesion)、功能内聚、功能内聚(functional_cohesion)(functional_cohesion)当同一个子程序中的操作之间无任何联系时,当同一个子程序中的操作之间无任何联系时,为偶然内聚性,也叫作为偶然内聚性,也叫作“无内聚性无内聚性”。比如只是为了将程序中某几处凑巧相同的一些语比如只是为了将程序中某几处凑巧相同的一些语句组合起来形成的一个模块:句组合起来形成的一个模块:P PQ QR RS S1.偶然内聚偶然内聚 B=A;read(Cardfile);D=C;T T将几个逻辑上相似的功能放在一个模块中将几个逻辑上相似的功能放在一个模块中 准备准备算平均成绩算平均成绩算最高成绩算最高成绩返回计算值返回计算值是是取平均成绩吗取平均成绩吗?否否温度转换函数(摄氏和华氏温度的互相转换,温度转换函数(摄氏和华氏温度的互相转换,if-elseif-else语句)语句)常见的出错处理模块,工作模块发现错误后,调用错误处理常见的出错处理模块,工作模块发现错误后,调用错误处理模块,将错误号作为控制参数传入,然后出错处理模块根据模块,将错误号作为控制参数传入,然后出错处理模块根据不同的错误号执行相应的操作(不同的错误号执行相应的操作(switchswitchcasecase分支语句)分支语句)2.逻辑内聚逻辑内聚int ComputeScore(bool type)3.时间内聚时间内聚l将在有限时间单元内处理的成分组合为同一模块将在有限时间单元内处理的成分组合为同一模块比如在窗口比如在窗口loadload事件过程:事件过程:private void AddBook_Load(object sender,EventArgs e)/初始化图书类别选择框初始化图书类别选择框 cboType.Items.Add(哲学哲学);cboType.Items.Add(法律法律);/初始化出版社选择框初始化出版社选择框 Publisher p1=new Publisher();DataTable dt=p1.GetAllPublishers();cboPublisher.DataSource=dt;cboPublisher.DisplayMember=name;cboPublisher.ValueMember=publisherID;可视化程序设计中初可视化程序设计中初始化窗口中的缺省选项始化窗口中的缺省选项还比如:还比如:C+的构造函数、析构函数的构造函数、析构函数4.步骤内聚步骤内聚l当子程序中的操作是按某一特定过程结构进行当子程序中的操作是按某一特定过程结构进行的的,就是步骤内聚。就是步骤内聚。例如:用户想按一定的顺序打印告,子程序设计成是用于例如:用户想按一定的顺序打印告,子程序设计成是用于按顺序打印销售收入、开支、雇员电话表的。按顺序打印销售收入、开支、雇员电话表的。l步骤内聚在时间内聚的基础上增加了次序的约束步骤内聚在时间内聚的基础上增加了次序的约束当当模模块块内内的的成成分分引引用用共共同同的的数数据据,而而不不存存在在其其他他联联系时,称为通信内聚系时,称为通信内聚修改库存修改库存购货单购货单开发货单开发货单库存库存A A、销售模块、销售模块B B、产生留退名单模块、产生留退名单模块期末不及格统计期末不及格统计累计不及格统计累计不及格统计留退名单留退名单学籍表学籍表5.通信内聚通信内聚l模块中某个成分的输出是另一成分的输入,顺序内模块中某个成分的输出是另一成分的输入,顺序内聚有较强的内聚性,是步骤内聚和通信内聚的结合。聚有较强的内聚性,是步骤内聚和通信内聚的结合。l但仍然不是最高的内聚类型,包含功能不单一。但仍然不是最高的内聚类型,包含功能不单一。比如显示期末成绩通知:比如显示期末成绩通知:读读入入学学号号读读取取成成绩绩取取不不及及格格科科目目取取科科目目补补考考安安排排显显示示数数据据判判断断留留退退级级6.顺序内聚顺序内聚7.功能内聚功能内聚l一个模块包括并且仅仅包括为完成一个具体任务所一个模块包括并且仅仅包括为完成一个具体任务所需要的所有成分,称为功能内聚。需要的所有成分,称为功能内聚。l功能内聚性是最强也是最好的一种内聚功能内聚性是最强也是最好的一种内聚例如:打印职工名单,例如:打印职工名单,PrintStaffList()PrintStaffList()例如:计算平均分,例如:计算平均分,CalculateAvg()CalculateAvg()l仅用一个动宾词组能明确指出这个模块的所有功能。仅用一个动宾词组能明确指出这个模块的所有功能。内聚的评分内聚的评分l耦合和内聚的概念是耦合和内聚的概念是Stevens等人提出的,等人提出的,是测量是测量一个模块化系统好坏的标志。一个模块化系统好坏的标志。l按他们的观点,按他们的观点,给上述七种内聚评分如下:给上述七种内聚评分如下:功能内聚分功能内聚分顺序内聚分顺序内聚分通信内聚分通信内聚分步骤内聚分步骤内聚分时间内聚分时间内聚分逻辑内聚分逻辑内聚分偶然内聚分偶然内聚分l可以给一个软件的所有模块打分,最后计算平均分,可以给一个软件的所有模块打分,最后计算平均分,作为软件结构质量评价的参考作为软件结构质量评价的参考模块重构例模块重构例1获取某个数并且修改它以作其他用途,比如:获取某个数并且修改它以作其他用途,比如:void getTotalOutstandingAndSetReadyForSummaries()这是一个顺序内聚的模块,重构后:这是一个顺序内聚的模块,重构后:double getTatalOutstanding()void setReadyForSummaries(double x)8.2.8 启发规则启发规则 优良的软件模块化设计往往能导致程序设计的高效。优良的软件模块化设计往往能导致程序设计的高效。软件模块化设计软件模块化设计常采用以下常采用以下优化策略优化策略:改进软件结构,提高模块独立性。改进软件结构,提高模块独立性。在满足模块化要求的前提下尽量减少模块数量。在满足模块化要求的前提下尽量减少模块数量。模块规模应适中,模块规模应适中,模块内语句数一般为模块内语句数一般为5010050100。软件结构的深度、宽度、软件结构的深度、宽度、扇入数和扇出数都要适扇入数和扇出数都要适当。当。模块的作用域应该在控制域之内。模块的作用域应该在控制域之内。力求降低模块接口的复杂程度,设计单入口、单出力求降低模块接口的复杂程度,设计单入口、单出口的模块。口的模块。软软件件结结构构表表示示软软件件的的系系统统结结构构,它它是是软软件件模模块块间间关关系的表示,均表示为层次关系。系的表示,均表示为层次关系。软 件 结 构 示 意 图顶层顶层1层层2层层ABCDEFGHIJKLMN深度宽度扇入为扇入为2扇出为扇出为3扇入为扇入为3宽度深度宽度3层层4层层模块的扇入与扇出模块的扇入与扇出 深深度度:表表示示软软件件结结构构中中从从顶顶层层模模块块到到最最底底层层模模块块的层数的层数;宽度:宽度:表示控制的总分布;表示控制的总分布;扇出数:扇出数:指一个模块直接控制下属的模块个数;指一个模块直接控制下属的模块个数;扇入数:扇入数:指一个模块的直接上属模块个数。指一个模块的直接上属模块个数。平均扇出系数最好是平均扇出系数最好是35;一个模块一个模块扇出的上限不超过扇出的上限不超过7;高层模块高扇出,最低层模块高扇入;高层模块高扇出,最低层模块高扇入;一个好的软件结构的形态准则是:上面尖、中间宽、一个好的软件结构的形态准则是:上面尖、中间宽、下面小,像清真寺的塔。下面小,像清真寺的塔。有有 关关 指指 标标作用域在控制域内作用域在控制域内MACBM的控制域为的控制域为 M,A,B,C 作用域:作用域:A中的一个判定所影响的模块。中的一个判定所影响的模块。例如:例如:A:if then goto B1 B:B1:作用域在控制域内作用域在控制域内A:if then goto C1 C:C1:作用域超出了控制域作用域超出了控制域上例中上例中A的作用超出了控制域。改进方法之一,可以的作用超出了控制域。改进方法之一,可以把把A中的中的 if 移到移到M中;方法之二,可以把中;方法之二,可以把C移到移到A下面。下面。控制域:控制域:(a)a)TOPXYAB1B2B(b)(b)BXYAB1B2TOP TOP(c)(c)XBAB1B2Y TOP(d)(d)XYAB1B2B 作用范围和控制范围图示作用范围和控制范围图示作用域与控制域示例作用域与控制域示例 D D计算总工资计算总工资 C C计算职工工资计算职工工资 B B计算临时工工资计算临时工工资 A A计算工资计算工资模块模块A A的控制范围是:的控制范围是:A A、B B、C C、D D假如判定出现在模假如判定出现在模块块A A,该判断的作用,该判断的作用范围是:范围是:A A、B B、C,C,但但D D不受影响不受影响 思考:这个例符合结构化设计规则吗?思考:这个例符合结构化设计规则吗?8.3 结构化软件结构设计方法结构化软件结构设计方法(structure)转换转换分析模型分析模型(逻辑模型)(逻辑模型)设计模型设计模型设计模型设计模型(物理模型)(物理模型)(物理模型)(物理模型)从数据流图导出结构图从数据流图导出结构图l8.3.1 变换分析变换分析(变换型(变换型数据流图映射成软件结构的设计)数据流图映射成软件结构的设计)l8.3.2 事务分析事务分析(事务型(事务型数据流图映射成软件结构的设计)数据流图映射成软件结构的设计)l8.3.3 综合型数据流图映射成软件结构的设计综合型数据流图映射成软件结构的设计l8.3.4 优化设计优化设计转换存在鸿沟转换存在鸿沟l数据流图着眼于现实世界,结构图着眼于计算机世数据流图着眼于现实世界,结构图着眼于计算机世界。界。数据流图反映数据流,反映系统的逻辑功能,即系统能够数据流图反映数据流,反映系统的逻辑功能,即系统能够“做什么做什么”;结构图反映程序控制层次,反映系统的物理模型,即怎样结构图反映程序控制层次,反映系统的物理模型,即怎样逐步实现系统的总功能。逐步实现系统的总功能。l简单地说:数据流图描述线性的工作流程,结构图简单地说:数据流图描述线性的工作流程,结构图描述工作的分配(谁负责做什么)描述工作的分配(谁负责做什么)转换有规律可循吗?转换有规律可循吗?l数据流图中存在两种典型的结构:数据流图中存在两种典型的结构:变换