




已阅读5页,还剩102页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章结构化系统设计,总体设计,本章主要内容,8.1软件架构的设计(achitecture)8.2结构化软件结构设计的基本概念(structure)8.3结构化软件结构设计方法(structure),8.1软件架构的设计(achitecture),8.1.1什么是软件架构8.1.2架构设计,8.1.1.软件架构的概念,建筑、文学、音乐、机械、电子、计算机软硬件等领域都会使用“架构(architecture)”这一概念。架构都提供了系统最高层的设计方案,以确保建筑、小说、乐曲、设备、计算机等系统满足期望的特性。好的建筑应该美观、坚固、实用好的计算机应用系统应该实用、好维护、可靠、性价比高架构师(architect)需要发现特定系统的最重要的关注点,设计某种折衷的总体方案以满足关注点。架构包含系统的一组基本结构(structure),每种结构都有各种类型的部件(component)及其关系构成,架构描述了这些部件的组合、相互调用参照、通信以及其他动态交互。,架构和结构的关系,架构是抽象无形的,体现高层全局的决策,就像文章的中心思想和提纲。结构是具体有形的,体现决策的贯彻,如同文章的每个段落及细节描述。架构包含了结构的初步描述和决策。相同架构的系统,具体结构允许有差异。,使用桥梁来比喻,桥梁的架构设计可以使用草图描述,架构决定了桥梁的基本结构部件。桥梁有梁式桥、拱桥、斜拉桥、悬索桥等架构,斜拉桥的基本结构:索塔主梁斜拉索,使用桥梁来比喻,桥梁的结构设计则需要考虑各种部件的数量、材料、重量、形态等方面,是可以施工的严谨的结构图。架构是抽象的,对结构进行了设计和限定,每座桥的结构是具体有形的、元素组合千变万化,1.软件架构,软件架构(softwarearchitecture)的定义没有统一的版本,一般认为:一个应用程序或计算系统的软件架构是一个或一组结构,它包含组成系统的软件元素、这些元素对外可见的性质以及它们之间的关系。对外可见的性质指软件元素能够提供的服务、性能特征、错误处理、共享资源的用法等。软件的一个结构元素可能是一个子系统、构件、进程、库、数据库、计算结点、遗留系统等等。软件架构是最高层次的系统分解,它不会囊括所有的结构和行为的定义,它只关注那些被认为是重要的元素。架构难以更改,一旦修改,意味着整个系统重建,而结构修改只影响局部。,2.软件架构模式,大部分的架构来源于有相似关注点的系统的总结和抽象,这些相似性被描述成某种特殊模式的架构风格,也就是架构模式(architecturalpattern)。一种架构模式就是一个经验秘籍,架构师在设计不同系统时可以重复使用这些先进经验。图10.1就是桥梁的四种常用架构模式。中国建筑有一种攒尖模式,被广泛应用在古典园林中,如三角、四角、五角、八角等亭子,宫殿、坛庙大量应用。,软件架构模式,软件架构模式就是可重复使用的软件结构风格。,8.1.2架构设计,主机-终端的集中控制结构分布式对象结构客户机-服务器的分布式结构C/S结构B/S结构,1、主机-终端式结构,软件配置在主机上,处理能力也集中于主机终端用于输入和输出,无CPU,主机Host,终端Terminal,控制台Console,主机-终端的一般硬件配置,主机终端网络拓扑结构,2、分布式对象结构,每个对象在逻辑上是平等的,它们可以互相为对方提供所需的服务。提供服务的对象就是服务器,而提出服务请求的对象就是客户。,分布式对象结构的网络拓扑模型,分布式对象结构,星形网络,b.总线形网络,3、客户机-服务器结构,处理分布于客户机和服务器。客户机完成本地运算,可向服务器请求某种服务(如查询数据),服务器响应请求,完成运算后,将结果返回给客户机,数据库服务器,客户机,客户机-服务器的一般硬件配置,客户机/服务器结构,客户机-服务器的软件配置,Client/Server(C/S):应用程序配置于客户机,DBMS配置于服务器。,Windows窗口程序,数据库,数据库服务器,数据库服务器,数据库,浏览器程序(如IE),Browser/Server(B/S):应用程序配置于Web应用服务器,客户端配置浏览器程序,B/S的工作机制,B/S结构(Internet架构),如何选择架构模式,内部管理、安全性要求高、后台少数人使用的功能采用Windows界面的C/S结构,也称为胖客户端。外部用户较多的功能采用浏览器界面的B/S结构,也成为瘦客户端。胖客户端/瘦客户端,各有优缺点:C/S架构的缺点主要是部署、更新的问题。B/S架构的缺点主要是受制于HTML的限制,无法像C/S那样使用丰富的效果来展示数据,用户体验比较糟糕。,软件架构的最新发展,丰富客户端,RIA(RichInternetApplication)的出现给我们带来重新在客户端和服务器端进行更好的平衡的机会。是集桌面应用程序的最佳用户界面功能与Web应用程序的普遍采用和快速、低成本布署以及互动多媒体通信的实时快捷于一体的新一代网络应用程序。有以下特点:在消息确认和格式编排方面提供互动用户界面在无刷新页面之下提供快捷的界面响应时间(Ajax技术AsynchronousJavaScriptandXML)提供通用的用户界面特性如拖放式(draganddrop)以及在线和离线操作能力结合了B/S配置的优势和C/S界面丰富的特点,8.2结构化软件结构设计的基本概念(structure),8.2.1结构化设计内容8.2.2结构化设计思想8.2.3模块8.2.4结构图8.2.5模块的联系8.2.6模块间的耦合8.2.7模块的内聚8.2.8启发规则,采用强调自顶向下、逐层分解的功能模块设计,也称为结构化设计。主要包括:将系统划分成功能模块(Module);决定每个模块的功能;决定模块的调用关系;决定模块的界面(Interface,接口),即调用时传入的信息(函数参数),以及返回的信息(返回值)。主要模型:模块结构图(SC,StructureChart),也称功能结构图。,8.2.1设计内容,8.2.2设计思想,结构化:自顶向下,逐层分解求精结构化设计:软件模块化,按层次划分,模块化,因为根据经验:对于问题1(P1)和问题2(P2)若:C(P1)C(P2)则:E(P1)E(P2)有规律显示:C(P1+P2)C(P1)+C(P2)则:E(P1+P2)E(P1)+E(P2)C表示复杂度,E表示需要的工作量,模块化设计方法,使用功能分解一定程度上能够简化系统结构,使系统容易修改和理解。具体做法:把整个软件划分为部分,其中每一部分的功能简单明确,即程序模块(可以是子过程或函数)划分模块的工作按层次进行,上层模块调用下层模块每一个模块应尽可能独立模块间的调用接口要阐明(模块名称、输入数据、输出数据),8.2.3模块,模块(Module)一词使用很广泛。通常对应于用一个名字就可以调用的一段程序语句(子程序或函数)。模块具有输入和输出、逻辑功能、运行程序、内部数据四种属性。,计算年龄,模块的图形表示方法,模块的函数接口表示,intGetAge(datebirthday),小程序练习,计算5!6!7!。代码如下:,x1=1;for(inti=1;i=5;i+)x1=x1*i;x2=1;for(inti=1;ibookPrice)returnfinePerDay*borrowDays;elsereturnbookPrice;elsereturn0.0;,模块调用举例模块结构图,8.2.5模块的联系,为了衡量模块的相对独立性,提出了模块间的耦合(Coupling)与模块的内聚(Cohesion)两个标准耦合:模块和模块之间的联系程度内聚:模块内部各元素之间的联系程度设计目标:模块内的联系越紧越好模块间的联系越少越好为什么?,8.2.6模块的耦合,doubleCalculateAvg()intn;doubletotal,average,value;scanf(“输入个数:n”,两个模块之间存在联系,影响耦合度的因素,如果使用模块A需要了解模块B,那么A和B是耦合的。影响模块间耦合程度有三方面的因素:联系方式模块间通过什么方式联系来往信息的作用模块间来往信息作什么用数量模块间来往信息的多少。,混合控制数据,用过程直接引用语句调用,少,多,数量,方式,作用,0,离坐标原点越远,耦合程度越高,耦合的类型,耦合分类如下:数据耦合:采用子程序调用,调用模块将需要进行处理的数据传递给被调模块。数据耦合是不可避免的。标记耦合:如果调用模块将整个数据记录传递给被调模块,而被调模块只使用了部分数据项,则称为标记耦合或特征耦合。控制耦合:一个模块将控制信息传递给另一个模块,以控制被调模块的内部处理逻辑。(可以分解)公共环境耦合:如果两个模块共享同一全局数据,称为公共耦合。内容耦合:两个模块之间的内部属性有直接关联,也称病态耦合。(某些GOTO语句),松散,紧密,代码举例1,编写函数用于确定某年是否为闰年。FunctionIsLeapYear(yearAsinteger)AsBooleanIfyearMod40or(yearMod100=0andyearMod4000)ThenisLeapYear=FalseElseisLeapYear=TrueEndIfEndFunctionSubButton1_Click()ifIsLeapYear(Convert.ToInt(Textbox1.Text)EndSub,代码举例2,编写函数可以实现温度值从华氏转换为摄氏和从摄氏转换为华氏。/source:需要转换的原始温度值/isCtoF:设置转换方式,True表示从摄氏到华氏,/False表示从华氏到摄氏/返回值为转换后的温度值intChangeTemp(intsource,boolisCtoF)if(isCtoF)return(source*9/5)+32);elsereturn(source-32)*5/9);参数isCtoF不用于计算,仅用于控制逻辑(分解),代码举例3,根据血常规分析感冒特征structBloodWBC/白细胞RBC/红细胞HGB/血红蛋白PLT/血小板LYM/淋巴细胞百分比intDiagCold(structBloodbld)/利用白细胞、中性粒子百分比、淋巴细胞百分比三项分析DiagCold只需要传入数据中的部分内容,代码举例4,左边使用参数,右边使用全局变量,哪个耦合度更高?,structBoxfloatlength;floatwidth;floatheight;floatvolume;,main()structBoxx;x=InputData();x.volume=CalcVolume(x);PrintData(x);return0;,externstructBoxxmain()InputData();CalcVolume();PrintData();return0;voidInputData()/输入数据到xvoidCalcVolumn()/利用x计算voidPrintData()/打印x各项内容,8.2.7模块的内聚,doubleCalculateAvg()intn;doubletotal,average,value;scanf(“inputvalue:”,模块内部各元素(变量、语句)之间存在联系,内聚的好处,模块的内聚反映模块内部联系的紧密程度。一个模块只需要做好一件事情,不要过分关心其它任务。高内聚性的好处是可以提高程序的可靠性。有一个调查表明,50的强内聚性子程序是没有错误的,而只有18的弱内聚性子程序才是无错的,弱内聚性子程序的出错机会要比强内聚性出错机会高6倍,而修正成本则要高19倍。摘自代码大全,内聚的类型,模块的内聚可以分以下七类:、偶然内聚(coincidentalcohesion)、逻辑内聚(Logicalcohesion)、时间内聚(temporalcohesion)、步骤内聚(proceduralcohesion)、通信内聚(communicationalcohesion)、顺序内聚(Sequentialcohesion)、功能内聚(functional_cohesion),当同一个子程序中的操作之间无任何联系时,为偶然内聚性,也叫作“无内聚性”。比如只是为了将程序中某几处凑巧相同的一些语句组合起来形成的一个模块:,P,Q,R,S,1.偶然内聚,B=A;read(Cardfile);D=C;,T,将几个逻辑上相似的功能放在一个模块中,温度转换函数(摄氏和华氏温度的互相转换,if-else语句)常见的出错处理模块,工作模块发现错误后,调用错误处理模块,将错误号作为控制参数传入,然后出错处理模块根据不同的错误号执行相应的操作(switchcase分支语句),2.逻辑内聚,intComputeScore(booltype),3.时间内聚,将在有限时间单元内处理的成分组合为同一模块比如在窗口load事件过程:privatevoidAddBook_Load(objectsender,EventArgse)/初始化图书类别选择框cboType.Items.Add(哲学);cboType.Items.Add(法律);/初始化出版社选择框Publisherp1=newPublisher();DataTabledt=p1.GetAllPublishers();cboPublisher.DataSource=dt;cboPublisher.DisplayMember=name;cboPublisher.ValueMember=publisherID;,可视化程序设计中初始化窗口中的缺省选项还比如:C+的构造函数、析构函数,4.步骤内聚,当子程序中的操作是按某一特定过程结构进行的,就是步骤内聚。例如:用户想按一定的顺序打印告,子程序设计成是用于按顺序打印销售收入、开支、雇员电话表的。步骤内聚在时间内聚的基础上增加了次序的约束,当模块内的成分引用共同的数据,而不存在其他联系时,称为通信内聚,修改库存,购货单,开发货单,库存,A、销售模块,B、产生留退名单模块,期末不及格统计,累计不及格统计,5.通信内聚,模块中某个成分的输出是另一成分的输入,顺序内聚有较强的内聚性,是步骤内聚和通信内聚的结合。但仍然不是最高的内聚类型,包含功能不单一。比如显示期末成绩通知:,6.顺序内聚,7.功能内聚,一个模块包括并且仅仅包括为完成一个具体任务所需要的所有成分,称为功能内聚。功能内聚性是最强也是最好的一种内聚例如:打印职工名单,PrintStaffList()例如:计算平均分,CalculateAvg()仅用一个动宾词组能明确指出这个模块的所有功能。,内聚的评分,耦合和内聚的概念是Stevens等人提出的,是测量一个模块化系统好坏的标志。按他们的观点,给上述七种内聚评分如下:功能内聚分顺序内聚分通信内聚分步骤内聚分时间内聚分逻辑内聚分偶然内聚分可以给一个软件的所有模块打分,最后计算平均分,作为软件结构质量评价的参考,模块重构例1,获取某个数并且修改它以作其他用途,比如:voidgetTotalOutstandingAndSetReadyForSummaries()这是一个顺序内聚的模块,重构后:doublegetTatalOutstanding()voidsetReadyForSummaries(doublex),8.2.8启发规则,优良的软件模块化设计往往能导致程序设计的高效。软件模块化设计常采用以下优化策略:改进软件结构,提高模块独立性。在满足模块化要求的前提下尽量减少模块数量。模块规模应适中,模块内语句数一般为50100。软件结构的深度、宽度、扇入数和扇出数都要适当。模块的作用域应该在控制域之内。力求降低模块接口的复杂程度,设计单入口、单出口的模块。,软件结构表示软件的系统结构,它是软件模块间关系的表示,均表示为层次关系。,软件结构示意图,顶层,1层,2层,A,B,C,D,E,F,G,H,I,J,K,L,M,N,深度,宽度,扇入为2,扇出为3,扇入为3,宽度,深度,宽度,3层,4层,模块的扇入与扇出,深度:表示软件结构中从顶层模块到最底层模块的层数;宽度:表示控制的总分布;扇出数:指一个模块直接控制下属的模块个数;扇入数:指一个模块的直接上属模块个数。平均扇出系数最好是35;一个模块扇出的上限不超过7;高层模块高扇出,最低层模块高扇入;一个好的软件结构的形态准则是:上面尖、中间宽、下面小,像清真寺的塔。,有关指标,作用域在控制域内,M的控制域为M,A,B,C,作用域:A中的一个判定所影响的模块。例如:,上例中A的作用超出了控制域。改进方法之一,可以把A中的if移到M中;方法之二,可以把C移到A下面。,控制域:,(a),TOP,X,Y,A,B1,B2,(b),B,X,Y,A,B1,B2,TOP,(c),X,B,A,B1,B2,TOP,(d),X,Y,A,B1,B2,作用范围和控制范围图示,作用域与控制域示例,D计算总工资,C计算职工工资,B计算临时工工资,A计算工资,模块A的控制范围是:A、B、C、D,假如判定出现在模块A,该判断的作用范围是:A、B、C,但D不受影响,思考:这个例符合结构化设计规则吗?,8.3结构化软件结构设计方法(structure),转换,设计模型(物理模型),从数据流图导出结构图,8.3.1变换分析(变换型数据流图映射成软件结构的设计)8.3.2事务分析(事务型数据流图映射成软件结构的设计)8.3.3综合型数据流图映射成软件结构的设计8.3.4优化设计,转换存在鸿沟,数据流图着眼于现实世界,结构图着眼于计算机世界。数据流图反映数据流,反映系统的逻辑功能,即系统能够“做什么”;结构图反映程序控制层次,反映系统的物理模型,即怎样逐步实现系统的总功能。简单地说:数据流图描述线性的工作流程,结构图描述工作的分配(谁负责做什么),转换有规律可循吗?,数据流图中存在两种典型的结构:变换型(Transform)结构事务型(Transaction)结构。这两种结构可以分别通过变换分析和事务分析方法导出标准形式的结构图。变换分析:用来描述输入、处理、输出数据流。事务分析:用来描述多种事务类型的处理。,变换流,变换型数据流,事务流,事务型数据流,当信息流具有明显的“发射中心”时,可归结为事务流。,面向数据流方法的设计过程,8.3.1变换分析,确定DFD中的变换中心、逻辑输入和逻辑输出。系统的变换中心,即主加工。如几股数据流的汇合处往往是系统的主加工。若一下不能确定,则要从物理输入端开始,沿着数据流方向向系统中心寻找,直到有这样的数据流,它不能再被看作是系统的输入则它的前一个数据流就是系统的逻辑输入。同理,从物理输出端开始,逆数据流方向向中间移动,可以确定系统的逻辑输出。介于逻辑输入和逻辑输出之间的加工就是变换中心,用虚线划分出流界,DFD的三部分就确定了。,第1步划分输入、加工、输出,原始数据,机内数据,正确数据,解,格式化解,输出解,逻辑输出,逻辑输入,(物理输入),(物理输出),8.3.1变换分析(续),2.设计软件结构的顶层和第一层变换结构。变换中心确定以后,就相当于决定了主模块的位置,这就是软件结构的顶层;其功能是主要完成所有模块的控制,它的名称是系统名称,以体现完成整个系统的功能。顶层确定之后,设计软件结构的第一层。第一层至少要有输入、输出和变换三种功能的模块。为每个逻辑输入设计一个输入模块,其功能为向顶层模块提供相应的数据。为每个逻辑输出设计一个输出模块,其功能为输出顶层模块的信息。为变换中心设计一个变换模块,它的功能是将逻辑输入变换为逻辑输出。,变换分析设计举例,8.3.1变换分析(续),设计中、下层模块对第一层的输入、变换及输出模块自顶向下、逐层分解。输入模块的下属模块的设计每个输入模块可以设计成两个下属模块:一个接收,一个转换。用类似的方法一直分解下去,直到物理输入端。如图中模块“getf3”和“getf2”的分解。模块“getf1”为物理输入模块。2)输出模块的下属模块的设计每个输出模块可以设计成两个下属模块:一个转换,一个发送,一直到物理输出端。如图中模块“putf7”,“putf8”和“putf10”的分解。模块“putf9”和“putf11”为物理输出模块。,8.3.1变换分析(续),变换模块的下属模块的设计根据DFD变换中心的组成情况,按照模块独立性的原则来组织其结构,一般对DFD中每个基本加工建立一个功能模块。如图中模块“C”,“D”和“E”。,8.3.1变换分析(续),4.设计优化以上步骤设计出的软件结构仅仅是初始结构,还必须根据设计准则对初始结构精细和改进。输入部分的求精:对每个物理输入设置专门模块,以体现系统的外部接口;其他逻辑输入模块并非真正输入,当它与转换数据的模块都很简单时,可将它们合并成一个。(2)输出部分的求精:为每个物理输出设置专门模块,其他逻辑输出模块并非真正输出,当它与转换数据的模块都很简单时,可将它们合并成一个模块;同时注意把相同或类似的物理输出模块合并在一起,以降低耦合度。(3)变换部分的求精:根据设计准则,对模块进行合并或调整。,优化后的变换分析举例,总之,软件结构的求精,带有很大的经验性。往往形成DFD中的加工与结构图中的模块之间是一对一的映射关系,然后再修改。但对于一个实际问题,可能把DFD中的两个甚至多个加工组成一个模块,也可能把DFD中的一个加工扩展为两个或更多个模块,根据具体情况要灵活掌握设计方法,以求设计出由高内聚和低耦合的模块所组成的、具有良好特性的软件结构。,8.3.1变换分析(续),变换分析示例,例1:汽车数字仪表板的设计功能:通过模-数转换实现传感器和微处理机接口;在发光二极管面板上显示数据;指示每小时英里数(mph),行驶的里程,每加仑油行驶的英里数(mpg)等等;指示加速或减速;如果车速超过55mph,则发出警告铃声。,变换分析示例设计步骤,(1)复查基本系统逻辑模型。(2)确定数据流图具有变换特性还是事务特性。(3)确定输入流和输出流的边界,从而孤立出变换中心。完成“第一级分解”。完成“第二级分解”。(6)使用启发规则对第一次分割得到的软件结构进一步精化。,第一步:DFD的分界,先分出I、P、O三块,变换分析示例(续),第一级分解的方法,变换分析示例(续),数字仪表板系统的第一级分解,变换分析示例(续),第二级分解的方法,第二步:映射,变换分析示例(续),未经精化的输入结构,变换分析示例(续),未经精化的变换结构,变换分析示例(续),未经精化的输出结构,变换分析示例(续),变换分析示例(续),未经精化的输出结构,第三步:优化本着高内聚、低耦合的原则。输入结构中的模块“转换成rpm”和“收集sps”可以合并。变换结构中的模块“确定加速/减速”可以放在模块“计算mph”下面,以减少耦合。输出结构中的模块“加速/减速显示”可以相应地放在模块“显示mph”的下面。,变换分析示例(续),精化后的数字仪表板系统的软件结构,数字仪表板控制,数据转换控制,驱动仪表板,接收传感器信号,计算gal/h,读燃料流,转换成r/min,读旋转信号,确定加/减速,计算mile/h,计算mile/gal,计算里程,加/减速显示,显示mile/h,显示mile/gal,显示里程,发出铃声,发光二极管显示,变换分析示例(续),上述设计步骤的目的是,开发出软件的整体表示。也就是说,一旦确定了软件结构就可以把它作为一个整体来复查,从而能够评价和精化软件结构。在这个时期进行修改只需要很少的附加工作,但是却能够对软件的质量特别是软件的可维护性产生深远的影响。,变换分析示例总结,思考题,试根据下面的数据流图,画出“工资处理”子系统的结构图。,思考题(续),8.3.2事务分析,接收通路,调度,8.3.2事务分析(续),虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。对于一个大系统,常常把变换分析和事务分析应用到同一个数据流图的不同部分,由此得到的子结构形成“构件”,可以利用它们构造完整的结构。,8.3.3综合型数据流图与分层数据流图映射成软件结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论