第二章软件质量评价武汉大学计算机学院软件工程课程组软件工程SoftwareEngineeringSoftwareEngineering思考?什么是好的软件?软件质量好坏如何评价?SoftwareEngineering第二章软件质量评价什么是好的软件?有何特点?软件评价的标准如何?什么是软件结构?什么是良软件结构?什么是模块化?模块设计时应遵循的标准是什么?SoftwareEngineering一、软件质量评价标准有效可靠结构清晰用户角度:达到需求、界面友好、简单易学开发人员角度:良结构、易测试、易维护、可移植…文档齐全SoftwareEngineering二、软件结构软件的各个组成部分之间的关系问题P同一个问题P的三种不同的软件结构SoftwareEngineering基本概念块:可以独立命名和编址的单元扇出:直接由一个块所控制的块数扇入:直接调用它的上级块数目深度:控制的总层数宽度:跨度最宽层的跨度数MM1M2M3N1N2N3N4N31N32软件结构SoftwareEngineering1.良软件结构具有层次性,无回路块调用的软件结构。…线性型树型半序型SoftwareEngineering非良结构的调整网络结构AB合并循环节点良结构AB模块内部复杂性增加了SoftwareEngineering2.模块化(modularity)模块(module):又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合。模块化把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。“模块化”有助于复杂问题的求解SoftwareEngineering模块化的依据c(x):问题x的复杂程度E(x):解决问题x需要的工作量(时间)对于两个问题P1和P2ifC(P1)C(P2)thenE(P1)E(P2)根据人们求解问题的经验,有规律:C(P1+P2)C(P1)+C(P2)则有E(P1+P2)E(P1)+E(P2)即“分而治之”有助于复杂问题的求解。如果把软件无限细分,会出现什么样的情况?SoftwareEngineering块的划分与总工作量之间的关系接口成本最小成本区域总成本块成本成本(工作量)模块数M模块划分的合理性。模块两个定性的标准:内聚和耦合。SoftwareEngineering模块的重要特征抽象(abstraction)我们在考虑问题时,集中考虑和当前问题有关的方面,而忽略和当前问题无关的方面,这就是抽象。或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。在对软件系统进行模块设计时,可以有不同的抽象层次。忽略细节,分层理解问题,自顶向下层层细化信息隐藏(informationhiding)细节隐藏可理解性修改副作用小错误副作用小SoftwareEngineering例:开发一个CAD软件,实现一个二维绘图系统的全部功能,供低级计算机辅助设计使用。抽象层次I用问题环境的术语来描述这个软件该软件包括一个计算机绘图界面,向绘图员显示图形,以及一个数字化仪界面,用以代替绘图板和丁字尺。所有直线、折线、矩形、圆及曲线的描画、所有的几何计算、所有的剖面图和辅助视图都可以用这个CAD软件实现……模块化的抽象特征SoftwareEngineering模块化的抽象特征抽象层次II任务需求的描述,列出“What”而不是“How”CADSOFTWARETASKS:userinteractiontask;2-Ddrawingcreationtask;graphicsdisplaytask;drawingfilemanagementtask;ENDSoftwareEngineering模块化的抽象特征抽象层次III程序过程表示(以2-D绘图生成任务为例)PROCEDURE2-DdrawingcreationREPEATUNTILE(drawingcreationtaskterminates)DOWHILE(digitizerinteractionoccurs)Digitizerinterfacetask;DETERMINEdrawingrequestCASELine:linedrawingtask;Rectangle:rectangledrawingtask;Circle:circledrawingtask;……END;DOWHILE(keyboardinteractionoccurs)keyboardinteractiontask;PROCESSanalysis/computationCASEView:auxiliaryviewtask;Section:crosssectioningtask;……END;……ENDREPETITION;ENDPROCEDURE.SoftwareEngineering3.模块独立性(Moduleindependence)好设计的关键:每个模块完成一个相对独立的子功能,并且与其它模块间的接口简单。独立性的度量(Yourdon&Constantine,1978)耦合(Coupling)—块间联系内聚(Cohesion)—块内联系SoftwareEngineering(1)耦合(Coupling)GreatdealofdependenceIndependentHighlycoupledLooselycoupledUncoupledGoal:aslooseaspossible=asindependentaspossible对一个软件结构内不同模块之间互连程度的度量SoftwareEngineering零耦合(uncoupling)彼此完全独立,这意味着模块间无任何连接,耦合程度最低UncoupledABSoftwareEngineering数据耦合(DataCoupling)一个模块访问另一个模块时,彼此间通过参数交换信息,而且交换的信息仅仅是数据ThemostdesirableABDataSoftwareEngineering控制耦合(ControlCoupling)指一个模块调用另一个模块时,传递的信息中有控制信息(尽管有时这种控制信息以数据的形式出现)ABFlagF2FnF1…………Flag控制耦合增加了理解与编程及修改的复杂性。SoftwareEngineering公共环境耦合(CommonCoupling)两个或多个模块通过一个公共数据环境相互作用Global:V1V2A:……………………A1=V1+V2……………………B:……………………V1=B1……………………Global:V1V2A:……………………V1++……………………B:……………………V2=B1+V1……………………问题:复杂程度随耦合模块的个数增加而增加公共部分的数据存取无法控制公共部分的改动将影响所有调用它的模块,可维护性差SoftwareEngineering内容耦合(ContentCoupling)一个模块访问另一个模块的内部数据一个模块不通过正常入口而转到另一个模块的内部两个模块有一部分程序代码重叠(只可能出现在汇编程序中)一个模块有多个入口TheleastdesirableSoftwareEngineering内容耦合例1.A访问C的内部数据或不通过正常入口而转入C的内部。……ABCDA:……………………gotoC1……………………C:……………………C1:…………SoftwareEngineering内容耦合例2.部分代码重叠(常出现在汇编程序中)BA例3.一个模块有多个入口(功能)A:………………………………entry1:………………………………entry2:………………………………SoftwareEngineering耦合度与软件结构类型耦合度模块独立性软件结构零耦合低高强弱好差数据耦合控制耦合公共环境耦合内容耦合原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合。SoftwareEngineering思考题ABDCFE132456模块互连图模块接口描述编号输入输出1飞机类型状态标志2飞机零件清单3功能代码4飞机零件清单5零件编号零件制造商6零件编号零件名称已知模块A、E和F更新同一个数据库,请确定模块之间的耦合类型。SoftwareEngineering(2)内聚(Cohesion)Goal:ascohesiveaspossible!一个模块内各个元素彼此结合的紧密程度理想内聚的模块只做一件事情模块内的高内聚往往意味着模块间的松耦合内聚更重要!SoftwareEngineering偶然内聚(Coincidentalcohesion)Unrelatedfunctions,processes,ordataarefoundinthesamemodule(forconvenience)ABABC语句相同SoftwareEngineering逻辑内聚(LogicalCohesion)LogicallyrelatedfunctionsordataareplacedinthesamemoduleA:Readinputsfromdiskfromtapefrom……SoftwareEngineeringXYZABC逻辑内聚XYZABCSSoftwareEngineering时间内聚(Temporalcohesion)ThefunctionsarerelatedonlybythetiminginvolvedinitialxInitialy这种模块在20世纪80年代的应用程序中使用较多。没有任何复用价值。SoftwareEngineering过程内聚(Proceduralcohesion)FunctionsaregroupedtogetherinamoduletoensureacertainorderofperformanceenterdatacheckdatamanipulatedataSoftwareEngineering通信内聚(Communicationalcohesion)AllthefunctionsinamoduleoperateonorproducethesamedatasetX从文件file读出数据由数据产生日报表由数据产生单项产品报表SoftwareEngineering顺序内聚(Sequentialcohesion)TheoutputfromonepartofamoduleistheinputtothenextpartX输入系数求根打印方程的根SoftwareEngineering功能内聚(Functionalcohesion)EveryprocessingelementisessentialtotheperformanceofasinglefunctionX报表打印SoftwareEngineering内聚度与软件结构软件结构模块独立性内聚度内聚评分差好弱强低偶然内聚0分逻辑内聚1分时间内聚3分中过程内聚5分通信内聚7分高顺序内聚9分功能内聚10分设计时力争做到高内聚!不要低内聚!SoftwareEngineering三、软件度量度量(metrics)测量(measure)估算(estimation)软件度量的根本目的是为了管理的需要。利用度量来改进软件过程。SoftwareEngineering软件度量软件复杂性度量规模文本复杂性控制结构的复杂性软件可靠性度量系统故障率软件修复与软件有效性软件可靠性估算SoftwareEngineering1.软件复杂性度量规模:程序代码的规模→软件复杂度文本复杂性控制结构的复杂性SoftwareEngineering(1)规模度量(Size-OrientedMetrics)代码行(Linesofcode,LOC)度量LOC乐观值a一般值m悲观值bLOC的期望值46camblSoftwa