接口简单。是评价设计好坏的重要度量标准。衡量软件的模块独立性作用耦合性和内聚性两个定性的度量标准
○1内聚性:内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量。内聚是从功能角度来度量模块内的联系。
内聚有如下的种类,它们之间的内聚性由弱到强排列为:
偶然内聚 逻辑内聚 时间内聚 过程 通信内聚 顺序内聚 功能内聚
内聚性是信息隐蔽和局部化概念的自然扩展。一个模块的内聚性越强则该模块的模块独立性越强。作为软件结构设计的设计原则,要求生一个模块的内部都具有很强的内聚性,它的各个组成部分彼此都密切相关。
○2耦合性:耦合性是模块间互相连接的紧密程度的度量。 耦合性取决于各个模块之间接口的复杂度、调用方式以及哪些信息通过接口。耦合可以分为下列几种,它们之间的耦合度由高到低排列为:
内容耦合:如一个模块直接访问另一模块的内容,则这两个模块称为内容耦合。
公共耦合:若一组模块都有访问同一全局数据结构,则它之间的耦合称之为公共耦合。 外部耦合:一组模块都访问同一全局简单变量(而不是同一全局数据结构),且不通过参数表传递该全局变量的信息,则称为外部耦合。
控制耦合:若一模块明显地把开头量、名字等信息送入另一模块,控制另一模块的功能,则为控制耦合。 标记耦合:若两个以上的模块都需要其余某一数据结构子结构时,不使用其余全局变量的方式而是用记录传递的方式,即两模块间通过数据结构变换信息,这样的耦合称为标记耦合。 数据耦合:若一个模块访问另一个模块,被访问模块的输入和输出都数据项参数,即两模块间通过数据参数交换信息,则这两个模块为数据耦合。 非直接耦合:若两个模块没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,则称这两个模块为非直接耦合。非直接耦合独立性最强。
耦合性越强,独立性越弱,希望模块之间的耦合表现为非直接耦合方式。但是,由于问题所固有的复杂性和结构化设计的原则,非直接耦合往往是不存在的。
耦合性与内聚性是模块独立性的两个定性标准,耦合与内聚是相互关联的。在程序结构中,各模块的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有得提高模块的独立性。 3、 结构设计方法
与结构化需求分析方法相对应的是结构化设计方法。结构化设计就是采用最佳的可能方法设计系统的各个组成部分以及各成分之间的内部联系的技术。也就是说,结构设计是这样一个过程,它决定用哪些方法把哪些部分联系起来,才能解决好某个具体有清楚定义的问题。 结构化设计方法的基本思想是将软件设计成由相对独立、单一功能的模块组成的结构。 二、 概要设计
1、 概要设计的任务 软件概要设计的基本任务是: (1) 设计软件系统结构
在需求分析阶段,已经把系统分解成层次结构,而在概要设计阶段,需要过去时一步分解,划分为模块以及模块的层次结构。划分的具体过程是: ① 采用某种设计方法,将一个复杂的系统按功能划分成模块。 ② 确定每个模块的功能。 ③ 确定模块之间的调用关系。
④ 确定模块之间的接口,即模块之间传递的信息。 ⑤ 评价模块结构的质量。 (2) 数据结构及数据库设计
数据设计是实现需求定义和规格说明过程中提出的数据对象的逻辑表示。数据设计的具体任务是:确定输入、输出文件的详细数据结构;结合算法设计,确定算法所必需的逻辑数据结构及其操作;确定对逻辑数据结构所必须的那些操作的程序模块,限制和确定各个数据设计决策的影响范围;需要与操作系统或调试程序接口所必需的控制表进行数据交换时,确定其详细的数据结构和使用规则;数据的保护性设计:防卫性、一致性、冗余性设计。 数据设计中应注意掌握以下设计原则: ① 用于功能和行为的系统分析原则也应用于数据。 ② 应该标识所有的数据结构以及其上的操作。 ③ 应当建立数据字典,并用于数据设计和程序设计。 ④ 低层的设计决策应该推迟到设计过程的后期。 ⑤ 只有那些需要直接使用数据结构、内部数据的模块才能看该数据的表示。 ⑥ 应该开发一个由有用的数据结构和应用于其上的操作组成的库。 ⑦ 软件设计和程序设计语言应该支持抽象数据类型的规格说明和实现。
(3) 编定概要设计文档。在概要设计阶段,需要编写的文档有,概要设计说明书、数据库设计说明书、集成测试计划等。
(4) 概要设计文档评审。在概要设计中,对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性、各部分之间的一致性等都要进行评审,以免在以后的设计中出现大的问题而返工。 常用的软件结构设计工具是结构图(SC——Structure Chart),也称程序结构图。使用结构图描述软件系统的层次和分块结构关系,它反映了整个系统的功能实现以及模块与模块之间的联系与通讯,是未来程序中的控制层次体系。
结构图是描述软件结构的图形工具。如图3。8所示。
模块用一个矩形表示,矩形内注明模块的功能和名字;箭头表示模块间的调用关系。在结构图中还可以用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息则可用带实心圆的箭头表示传递的是控制信息,用带空心圆的箭头表示传递的是数据。
根据结构化设计思想,结构图构成的基本形式如图
基本形式 顺序形式 重复形式 选择形式 程序结构图的有关术语 深度:表示控制的层数
上级模块、从属模块:上、下两层模块A和B,且有A调用B,则A是上级模块,B是从属模块。
宽度:整体控跨度(最大模块数的层)的表示。 扇入:调用一个给定模块的模块个数。 扇出:一个模块直接调用的其他模块数。
原子模块:树中位于叶子结点的模块。
传入模块:从下属模块取得数据,经处理再将其传送给上级模块。 传出模块:从上级模块取得数据,经处理再将其传送给下必模块。
变换模块:从上级模块取得数据,进行特定的处理,转换成其他形式,再传送给上级模块。 协调模块:对所有下属模块进行协调和管理的模块 2.面向数据流的设计方法 在需求分析阶段,主要是分析信息在系统中加工和流动的情况。面向数据流的设计方法定义了一些不同的映射方法,利用这些映射方法可以把数据流图变换成结构图表示的软件结构。首先需要了解数据流图表示的数据处理的类型,然后针对不同类型分别进行分析处理。 (1)数据流类型
典型的数据流类型有两种:变换型和事务型。
A、变换型。变换型是指信息尚输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。变换型数据处理问题的工作过程大致分为三步,即取得数据、变换数据和输出数据。相应于取得数据、变换数据、输出数据的过程,变换型系统结构图由输入、中心变换和输出等三部分组成。
B、事务型。在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能,这种数据流就叫做事务。事务型数据流的特点是接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元(事务处理中心),然后给出结果。这类数据流归为特殊的一类,称为事务型数据流。在一个事务型数据流中,事务中心接收数据,分析每个事务以确定它的类型,根据事务类型选取一条活动通路。
在事务 型数据流系统结构图中,事务中心模块按所接受的事务类型,选择某一事务处理模块执行,各事务处理模块并列。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。
(2)面向数据流设计方法的实施要点与设计过程 面向数据流的结构设计过程和步骤是:
第1步:分析、确认数据流图的类型,区分是事务型还是变换型。 第2步:说明数据流的边界。
第3步:把数据流图映射为程序结构。对于事务流区分事务中心和数据接收通咱,将它映射成事务结构。对于变换流区分输出和输入分支,并将其映射成变换结构。 第4步:根据设计准则对产生的结构进行细化和求精。
下面分别讲座变换型和事务型数据流图转换成程序结构图的实施步骤。 变换型
将变换型映射成结构图,又称为变换分析。其步聚如下:
第1步:确定数据流图是否具有变换特性。一般地说,一个系统中所有的信息流都可以认为是变换流,但是,当遇有明显的事务特性的信息流时,建议采采事务分析方法进行设计。 第2步:确定输入流和输出流的边界,划分出输入、变换的输出,独立出变换中心。
第3步:进行第一级分解,将变换型映射成软件结构,其中输入数据处理控制模块协调输出信息的产生过程。 第4步:按上述步骤如出现事务流也可按事务流的映射方式对各个子流进行逐级分解,直至分解到基本功能。
第5步:对每个模块写一个简要说明,内容包括该模块的接口描述、模块内部的信息、过程陈述、包括的主要判定点及任务等。
第6步:利用软件结构的设计原则对软件结构进一步转化。
事务型
将事务型映射成结构图,又称为事务分析。基步骤如下:
事务分析 设计步骤与变换分析设计步骤大致类似,主要差别仅在于由数据流图到软件结构的映射方法不同。它是将事务中心映射成为软件结构中发送分支的调度模块,将接收通路映射成软件结构的接收分支。 3.设计的准则
大量软件设计的实践证明,以下的设计准则是可以借鉴为设计的指导和对软件结构图进行优化。这些准则是: ① 提高模块独立性。对软件结构应首眼于改善模块的独立性,依据降低耦合提高内聚的原则,通过把一些模块取消或合并来修改程序结构。 ② 模块规模适中。 ③ 浓度宽度、扇出和扇入适当。经验表明,好的软件设计结构通常顶层高扇出,中间扇出较少,底层高扇入。 ④ 使模块的作用域在该模块的控制域内。 ⑤ 应减少模块的接口和界面的复杂性。 ⑥ 设计成单入口、单出口的模块。 ⑦ 设计功能可预测的模块。 三、详细设计 详细设计的任务,是为软件结构图中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。 常见的过程设计工具有:
图形工具:程序流程图,N-S,PAD,HIPO。 表格工具:判定表。 语言工具:PDL(伪码) 1、程序流程图
2、N-S流程图 为了避免流程图在描述程序逻辑时的随意性与灵活性 特征:
1)每个构件具有明确的功能域;
2)控制转移必须遵守结构化设计要求;
3)易于确定局部数据和(或)全局数据的作用域; 4)易于表达嵌套关系和模块的层次结构。 3、PAD图
是问题分析图的英文缩写。 特征:
1)结构清晰,结构化程度高; 2)易于阅读
3)最左端的纵线是程序主干线,对应程序的第一层结构;每增一层PAD图向左扩展一条纵线,帮程序的纵线数等于程序层次数。
4)程序执行:从PAD图最左主干线上端结点开始,自上而下、自左向右依次执行,程序终止于最左主干线。 4、PDL
过程设计语言也称为结构化的英语的伪码,它是一种混合语言,采用英语的词汇和结构化程序设计语言的语法,类似编程语言。 特征:
1)有为结构化构成元素、数据说明和模块化特征提供的关键词语法; 2)处理部分的描述采用自然语言语法; 3)可以说明简单和复杂的数据结构;
4)支持各种接口描述的子程序定义和调用技术。 3.4软件测试
软件测试是保证软件质量的重要手段,其主要过程涵盖了整个软件生命期的过程,包括需求定义阶段的需求测试、编码阶段的单元测试、集成测试以及后期的确认测试、系统测试,验证软件是否合格、能否交付用户使用等。 一、软件测试的目的
1983年IEEE将软件测试定义为:使用人工或自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。
关于软件测试的目的, Grenford J.Myers 在《The Art of Software Testing》一书中给出了更深刻的阐述:软件测试是为了发现错误而执行程序的过程;一个好的测试用例子指很可能找到迄今为止尚未发现的错误的用例;一个成功的测试是发现了至今尚未发现的错误的测试。
Myers的观点告诉人们测试要以查找错误为中心,而不是为了演示软件的正确功能。 二、软件测试的准则
1、所有测试都应追溯到需求
软件测试的目的是发现错误,而最严惩的错误不外乎是导致程序无法满足用户需求的错误。 2、严格执行测试计划,排除测试的随意性。
软件测试应当制定明确的测试计划并按照计划执行。测试计划应包括:所测软件的功能、输入和输出、测试内容、各项测试的目的和进度安排、测试资料、测试工具测试用例的选择、资源要求、测试的控制方式和过程等。 3、充分注意测试中的群集现象
经验表明,程序中存在错误的概率与该程序中已发现的错误数成正比。这一现象说明,为了提高测试效率,测试人员应该集中对付那些错误群集的程序。 4、程序员应避免检查自己的程序
为了达到好的测试效果,应该由独立的第三方来构造测试。因为从心理学角度讲,程序人员或设计方在测试自己的程序,要采取客砚的态度是程序不同地存在障碍的。 5、穷举测试不可能
所谓穷举测试是指把程序所有可能的执行路径都进行检查的测试。但是,即使规模较小的程序,其路径排列数也是相当大的,在实际测试过程中不可能穷尽每一种组合。这说明,测试只能证明程序中有错误,不能证明程序中没有错误。
6、妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。 三、软件测试技术与方法综述 不同角度分类:
若从是否需要执行被测软件的角度,可以分为静态测试和动态测试方法。若按照功能划分可以分为白盒测试和黑盒测试方法 1、静态测试与动态测试 (1)静态测试
静态测试包括代码检查、表态结构分析、代码质量度量等。静态测试可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。经验表明,使用人工测试能够有效地发现30%到70%的逻辑设计和编码错误。 代码检查主要检查代码和设计的一致性,包括代码的逻辑表达的正确性,代码结构的合理性