需求的基本性质:必要的、无歧义的、可测试的、可跟踪的以及可测量的
需求规约作用:
- 开发组织和用户之间合同,是产品功能和环境体现
- 对于项目其他工作,是控制点
- 对于具体设计、是正式的起始点
关联、泛化、细化、依赖
- 关联:是类目之间的结构关系,是一对具有相同结构相同链的描述
- 泛化、是一般性类目(父类)和他的特殊性类目(子类)之间的一种关系
- 细化:是类目之间的语义关系,其中一个类规约了另一个类的执行
- 依赖:是一种使用关系,描述一个类目使用另一个类目的数据和服务
- 前三者都是一种特殊的依赖
程序流程图优缺点
- 优点:不是逐步求精,不容易表达数据结构、控制流不受约束
需求规约的基本性质:重要性和稳定性程度、可修改的、完整的、一致的
典型详细设计工具
DFD、盒图、PAD、类程序设计语言 详细设计的基本任务包括:(1)为每个模块进行详细的算法设计 (2)为模块内的数据结构进行设计(3)对数据库进行物理设计(4)其他设计(5)编写详细设计说明书
软件CMM 系统CMM 集成产品开发CMM
过程管理计划支持过程是项管的主题,其他的包括软件质量保证、软件验证和确认计划和软件度量模型。
CMMI:0:未完成级 1:已执行级 2:已管理级 3:已定义级 4:已定量管理级 5:持续优化级
什么是结构分析方法?该方法使用什么描述工具?
结构化分析:简称SA,面向数据流进行数据分析的方法。采用自顶向下逐层分解的分析策略。顶层抽象地描述整个系统,底层具体地画出系统工程的每个细节。中间层则是从抽象到具体的过渡。使用数据流图,数据字典,作为描述工具,使用结构化语言,判定表,判定树描述加工逻辑。
⑴了解当前系统的工作流程,获得当前系统的物理模型。
⑵抽象出当前系统的逻辑模型。
⑶建立目标系统的逻辑模型。
⑷作进一步补充和优化。
简述SA方法的优缺点。
SA方法是软件需求分析中公认的,有成效的,技术成熟,使用广泛的一种结构化分析方法。较适用于开发数据处理类型软件的需求分析。利用图形等半形式化工具表达需求,简明,易读,也易于使用。但也存在一些弱点,表现如下:
⑴SA方法仅是一个静态模型,没有反映处理的顺序,即控制流程。
⑵SA方法使用DFD在分析与描述”数据要求”方面是有局限的,只有与数据库技术中的实体联系图(ER图)结合起来,才能较完整地描述用户对系统的需求。
⑶DFD不适合描述人机界面系统的要求,一些人机交互较频繁的软件系统。
⑷SA方法要与形式化方法结合起来,才能更精确地描述软件需求。
⑸要借助需求分析工具,提高需求分析的质量及效率。
模块的影响范围(作用域):受该模块内一个判定影响的所有模块的集合
模块的控制范围(控制域):这个模块本身以及所有直接或间接从属于它的模块的集合
什么是集成测试?非渐增式测试与渐增式测试有什么区别? 渐增式测试如何组装模块?
集成测试是指在单元测试的基础上,将所有模块按照设计要求组装成一个完整的系统进行的测试。
非渐增式测试是指首先对每个模块分别进行单元测试,再把所有模块组装成一个完整的系统进行的测试。而渐增式测试就是逐个把未经测试的模块组装到已经过测试的模块上去进行集成测试,每加入一个新模块进行一次集成测试,重复此过程直到程序组装完毕。渐增式测试有两种不同的组装方法:自顶向下和自底向上结合。
两者区别是:
(1) 非渐增式方法把单元测试和集成测试分成两个不同的阶段,前一阶段完成模块的单元测试,后一阶段完成集成测试。而渐增式测试往往把单元测试和集成测试合在一起,同时完成。(2)非渐增式需要更多的工作量,因为每个模块都需要驱动模块和桩模块,而渐增式利用已测试过的模块作为驱动模块或桩模块,因此工作量少。渐增式可以较早地发现接口之间的错误,非渐增式最后组装时才发现。(3)渐增式有利于排错,发生错误往往和最近新加入的模块有关,而非渐增式发现接口错误推迟到最后,很难判断是哪一部分接口出错。
(4)渐增式比较彻底,已测试的模块和新的模块再测试。(5)渐增式点用时间较多,但非渐增式所需更多的驱动模块和桩模块也占用一些时间。(6)非渐增式开始可并行测试所有模块,能充分利用人力,对测试大型软件很有意义。
什么是确认测试?该阶段有哪些工作?
答:确认测试又称有效性测试。它的任务是检查软件的功能与性能是否与需求规格说明书中确定的指标相符合。因而需求说明是确认测试的基础。确认测试阶段有两项工作:进行确认测试与软件配置审查。
调试的目的是什么?调试有哪些技术手段?
答:调试则是在进行了成功的测试之后才开始的工作。调试的目的是确定错误的原因和位置,并改正错误,因此调试也称为纠错(Debug)。调试的技术手段有简单的调试方法、归纳法、演绎法和回溯法等。
说明对象、类、类结构、消息的基本概念。
答:(1)对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象包括有形实体、作用、事件、性能说明等类型。对象具有状态和行为。一个对象用数据值来描述它的状态,对象的操作则用于改变状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。对象内的数据具有自己的操作,从而可灵活地专门描述对象的独特行为,具有较强的独立性和自治性,其内部状态不受或很少受外界的影响,具有很好的模块化特点。为软件重用奠定了坚实的基础。(2)类:具有相同或相似性质的对象的抽象就是类。因此,对象的抽象就是类,类的具体化就是对象,也可以说类的实例是对象。(3)类结构:类与类之间的结构关系,包括一般-具体结构关系和整体-部分结构关系。一般-具体关系结构称为分类结构,也可以说是”或”关系或”is a”关系,类的这种层次结构可用来描述现实世界中的一般化的抽象关系,通常越在上层的类越具有一般性和共性,越在下层的类越具体、越细化。
整体-部分结构称为组装结构,它们之间的关系是一种”与”关系,或者是”has a”关系。类的这种层次关系可用来描述现实世界中的类的组成的抽象关系。上层的类具有整体性,下层的类具有成员性。在类的层次结构中,通常上层的类称为父类或超类,下层类称为子类。
(4)消息:对象之间进行通信的构造叫做消息。在对旬的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。接收消息的对象经过解释,然后给予响应。这种通信机制称为消息传递。发送一条消息的格式是”对象名.方法名(参数)”。
内容耦合 公共耦合 控制耦合 复合耦合 数据耦合(耦合性高到低)
内容耦合 一个模块直接访问另一模块的内部数据。一个模块不通过正常入口转到另一模块的内部。
公共耦合 若干模块访问一个公共的数据环境,则它们之间的耦合称为公共耦合。公共环境可为全局数据结构、共享的通信区、内存的公共覆盖区等。显然,公共数据区的变化,将影响所有公共耦合模块,严重影响模块的可靠性和可适应性,降低软件的可读性。
控制耦合 一个模块传递给另一模块的信息是用于控制该模块内部逻辑的控制信号。显然,对被控制模块的任何修改,都会影响控制模块。
复合耦合 一个模块传送给另一个模块的参数是一个复合的数据结构。例如,包含几个数据单项的记录。
数据耦合 一个模块传送给另一个模块的参数是一个单个的数据项或者单个数据项组成的数组。
内聚性表示一个模块内部各种数据和各种处理之间联系的紧密程度,它是从功能的角度来度量模块间的联系。显然,块内联系愈紧,即内聚性愈强,模块独立性愈好。
内聚性由强到弱 功能型 顺序型 通信型 瞬时型 逻辑型 偶然型
1、偶然型又称为巧合型,为了节约空间,将毫无关系(或者联系不多)的各成分放在一个模块中。这样的模块显然不易理解,不易修改。
2、逻辑型 将几个逻辑上相似的功能放在一个模块中,调用时由调用模块传递的参数确定执行的功能。由于要进行控制参数的传递,必然要影响模块的内聚性。
3、瞬时型 将需要同时执行的成分放在一个模块中,模块中的各功能与时间有关,因此又称为时间内聚或经典内聚。例如,初始化模块,中止模块等这类模块内部结构较简单,一般较少判定,因此比逻辑内聚强,但是由于将多个功能放在一起,给修改和维护造成困难。
4、通信型 模块中的成分引用共同的输入数据,或者产生相同的输出数据,则称为是通信内聚模块。
通信型模块比瞬时型模块的内聚性强,因为模块中包含了许多独立的功能,但却引用相同数据。通信模块一般可以通过数据流图来定义。
5、顺序型 模块中某个成分的输出是另一成分的输入。由于这类模块无论数据还是执行顺序,模块中的一部分依赖于另外一部分。因此具有较好的内聚性。
6、功能型 一个模块包括而且仅包括完成某一具体功能所必须的所有成分。或者说,模块的所有成分都是为完成该功能而协同工作、紧密联系、不可分割的。
比较面向对象方法与结构化方法的特点
主要特点:
1.自顶而下,逐步求精。这种逐步求精的思想符合人类解决复杂问题的普遍规律,从而可以显著提高软件开发的效率。而且这种思想还体现了先全局后局部、先抽象后具体的方法,使开发的程序层次结构清晰,易读、易理解、易验证,因而提高了程序的质量。
2.结构化的程序是由且仅由顺序、选择、循环三种基本控制结构组成,既保证了程序结构清晰,又提高了程序代码的可重用性。
结构化开发方法是现有的软件开发方法中最成熟,应用最广泛的方法,主要特点是快速、自然和方便。 结构化方法总的指导思想自顶向下、逐步求精。它的基本原则是功能的分解与抽象。
结构化开发方法是面向数据流、数据封闭性的开发方法,JACKSON 系统开发方法则是面向数据结构的开发方法。 其基本思想是先建立输入输出的数据结构,再将其转换为软件结构。
面向对象的开发方法OOSD(Object-Oriented Software Development)是一种新的软件工程方法,其基本思想就是尽可能按照人类认识世界的方法和思维方式来分析和解决问题,这种方法能够提供更加清晰的需求分析和设计。
面向对象=对象+类+继承+通信
驱动模块比桩模块容易设计,为什么?
- 因为驱动模块是模拟主程序或者调用模块的功能,处于被测试模块的上层,所以驱动模块只需要模拟向被测模块传递数据,接收、打印从被测模块返回的数据的功能,较容易实现。
- 而桩模块用于模拟那些由被测模块所调用的下属模块的功能,由于下属模块往往不只一个,也不只一层,由于模块接口的复杂性,桩模块很难模拟各下层模块之间的调用关系,同时为了模拟下层模块的不同功能,需要编写多个桩模块,而这些桩模块所模拟的功能是否正确,也很难进行验证。
综上,驱动模块的设计显然比桩模块容易。
自顶而下增值与自底而上增值各有何优、缺点?
自顶而下增值
优点:能够尽早发现系统主控方面的问题。
缺点:无法验证桩模块是否完全模拟了下属模块的功能。
自底而上增值
优点:驱动模块较容易编写桩模块,能够尽早查出底层涉及较复杂的算法和实际的I/O模块中的错误。
缺点:最后才能发现系统主控方面的问题。