例子:某工厂采购部门每天要开出定货清单,清单中包括订购部件的部件号、部件名、规格、说明、
订购量、当前价格、主要供应商和辅助供应商。
部件入库或出库称为业务,通过仓库中的终端把业务报告给定货系统,处理库存业务。 当某种部件的库存量少于标准线以下时,仓库管理员就应该及时通知定货系统开出定货清单,
交由采购员采购。
根据画数据流图的步骤画出定货系统的数据流图。
(不需要答)(1)从系统的简述中提取数据流图的四个成分;
1) 源点和汇点。仓库管理员视为源点,采购员视为汇点
2) 处理。处理通常是系统简述中的动词短语,如产生定货清单,处理库存业务等。 3)数据流。从系统的源点流出和流入汇点的数据流即是系统的输入数据流和输出数据流。 4)数据存储。确定哪些数据应保存在数据存储中。库存业务一旦产生就立即被处理,所以不必保存。定货清单一天只产生一次,故需要保存产生定货清单的数据。有关库存零部件的信息包括定货标准线也应作为数据存储,统称为库存数据。 (2)定货系统数据流图的基本成分
源点/汇点 处理 数据流 数据存储 管理员 产生定货清单 (3)画出系统的高层数据流图;
定货清单 定货数据
采购员 处理库存业务 库存业务 库存数据
图在PPT第三章28、29
将DFD映射为软件结构图 图在PPT第三章90
9、简述软件测试的三个步骤、黑盒和白盒测试方法。内聚、耦合类型分析。
(1)单元测试:又称模块测试
测试对象是软件设计中最小的单元——模块,其目的是发现模块内部存在的错误。 单元测试发现编码阶段的错误。 测试内容:
(a)模块间的接口;
(b)模块内的局部数据结构
(c)模块内的重要通路尤其是错误处理的通路和影响上述各方面的边界条件。 (2)集成测试:又称组装测试或联合测试 集成测试发现软件设计阶段的错误。
在单元测试的基础上,需要将所有模块按设计要求组装成系统。在经过单元测试未发现错误的模块,组装之后仍可能出现各种问题。集成测试的基本方法:边组装边测试。有自顶向下或自底向上两种方法。 (a)自顶向下测试 从主控模块开始,沿着模块层次,边组装边测试已组装部分的功能,直到全部组装完毕,系统达到设计的功能和性能要求为止。为保证测试的进行,必须提供保证测试条件的桩模块。
桩模块:用来模拟被测模块的下层模块的模块。
再用实际的下层模块代替桩模块,并进行回归测试。
回归测试是相对于原始测试而言的,它部分或全部地重复前面进行过的测试工作。 (b)自底向上测试
与自顶向下测试相反,它先组装最低层模块,向上逐步组装。每组装一个模块,便测试由此模块及其下层模块组成的子功能。直到全部装配完毕,达到系统设计的功能和性能要求为止。
为保证测试的进行,必须提供保证测试条件的“驱动程序”。 用实际的上层模块代替该驱动程序。 (3)确认测试:又称有效性测试或验收测试
确认测试检查系统的功能和性能是否达到系统分析说明书提出的设计指标,即是否满足用户要求,检查文档是否齐全等。
确认测试发现软件分析阶段的错误。
黑盒测试法是根据程序的功能和性能进行测试的方法。它把被测程序看成一个黑盒子,完全不考虑程序内部的数据结构和逻辑通路。也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能和性能是否满足预期需要,程序是否能适当地接收输入数据产生正确的输出数据,并保持外部信息的完整性。 产生黑盒测试的测试用例的方法有如下几种:
等价类划分法边界值分析法、因果图法、错误推测法
白盒测试法是根据程序的逻辑结构进行测试的方法。它把程序看成是装在一个透明的白盒中,也就是完全了解程序内部的结构和处理过程。这种方法按程序内部的逻辑来测试程序,检验程序的每条通路是否都能按规定要求正确工作。
产生白盒测试用例的方法有如下几种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、 条件组合覆盖。一般而言,测试时以黑盒测试法为主,白盒测试法为辅。 模块间的耦合程度按从低到高分类如下:
⑴无耦合。如果两模块之间没有任何联系,每一个都能独立地工作而不需要另一模块的存在,是彼此完全独立的,则这两个模块间属于无耦合的情况。 ⑵数据耦合。如果两个模块是通过参数表仅传递数据型信息,则这种耦合称为数据耦合。
数据耦合是松散的耦合,模块间的独立性较强。软件结构中至少有这种耦合。 ⑶特征耦合。若两个模块通过参数表传递的是某一数据结构的子结构,而不是简单变
量,这就是特征耦合。
是数据耦合的一种变种。增加出错的机会,不易改动(数据结构变化时)。将该数据结构上的操作全部集中在一个模块中,就可消除这种耦合。 ⑷控制耦合。如果传递控制型信息,这就是控制耦合。
对被控制的模块做任何修改,都会影响到控制模块,降低模块的独立性。 ⑸公共耦合。若一组模块使用了公共数据,则它们之间的耦合称为公共耦合。 公共数据包括全程变量、共享的通信区、内存的公共覆盖区等。公共数据的使用,必然降低软件的可读性、可修改性和可靠性。
⑹内容耦合。如果发生下列情况之一,两个模块间就是内容耦合: ? 一个模块直接访问另一个模块的内部数据;
? 一个模块通过不正常入口直接转入另一模块内部; ? 一个模块有多个入口;
? 两模块有一部分代码重叠(只在汇编语言中出现);
内容耦合是耦合性最高的耦合,即是模块间最坏的联系方式,现在大多数高级程序设计语言中已经不会出现这种耦合。
在进行设计时应该采取以下原则:以数据耦合为主,特征耦合为辅,少用控制耦合,限制公共耦合,杜绝内容耦合。 模块的内聚性按从低到高分类如下:
⑴偶然内聚。如果模块中各组成成分间彼此没有实质联系,即使有联系也是很松散的,模块功能模糊,则称为偶然内聚。
例如有时写完一段程序后,发现一组语句在程序中多处出现,便将其组织在一个模块内以节省内存,就出现了偶然内聚的模块。在模块设计时,如果发觉一个模块难以命名,就应考虑是否出现偶然内聚。
⑵逻辑内聚。如果一个模块完成的是逻辑上相同或相似的一组功能,则称为逻辑内聚。
例如,设计一个模块打印各种报表,如固定资产报表、产品成本报表、利润报表等,打印何种报表靠传递控制参数调用。由于不同功能在一个模块中,通常在设计模块时会出现几种功能共用部分代码,从而使得修改、添加或去掉功能都很困难。
⑶时间内聚。若一个模块中包含的任务必须在同一时间内执行,而这些任务的次序无关紧要,则叫时间内聚。
例如各种初始化工作由初始化模块完成,而各种结束工作被组合到结束模块中,这样它的执行将涉及到其它许多模块。
⑷过程内聚。如果一个模块内的处理成分间是相关的,而且必须以特定顺序执行,则称为过程内聚。
例如把程序流程图中的循环、判断和计算分成三个模块,则这三个模块就是过程内聚的模块。
⑸通信内聚。模块内的所有成分都通过公共数据而发生关系的内聚就是通讯内聚。 例如对同一文件进行输入、修改、输出操作。模块中各成分经模块的局部的公共数据进行通信。
⑹顺序内聚。若模块中每个处理成分对应一个功能,且这些处理必须按顺序执行,则称为顺序内聚。
例如一个处理成分的输出是下一个处理成分的输入的模块就是顺序内聚。
⑺功能内聚。模块中各处理成分属于一个整体,都为了完成同一功能,很难分割,这就是功能内聚。
这种模块通常有明确表达模块功能的名称。
第四章 软件开发的面向对象方法
10、与OO方法相比,传统方法存在哪些问题。OO方法有哪些优点。
答:传统方法存在下列问题:
(1)对现实世界的认识与编程之间存在理解上的鸿沟; 功能与数据相分离造成。 (2)修改困难;
系统是围绕如何实现一定的行为进行,当需求变化时,数据常常发生变化,最终导致数据的结构变化,难于修改。 (3)维护困难;
为了得到“好的软件结构”,使作用域在控制域之中,导致系统总体结构混乱,难于维护。
(4)自顶向下功能分解的分析方法限制了软件的可复用性。 面向对象方法的优点
(1)与人类习惯的思维方法一致
核心是对象,它是现实世界实体的正确抽象。 而传统方法忽略了数据和操作之间的联系。 (2)稳定性好
它基于构造问题领域的对象模型,以对象为中心构造软件系统,当功能发生需求变化时,不会引起软件结构的整体变化。 而传统方法基于功能分析和分解,以算法为核心,功能变化通常会引起软件结构的整体变化。 (3)可重用性好
对象类固有的封装性和信息隐蔽以及很好的继承机制,使得面向对象方法具有很好的可复用性。
传统方法只是库一级的复用。 (4)可维护性好
OO方法的模块机制、继承机制、多态性机制,使得设计的软件易于理解、修改、测试,更易于维护。
而传统方法及其面向过程开发的软件是难以维护的。
11、找出问题域有关对象的两种方法:LIA和3VM. 简述LIA和3VM及其作用,并比较之。
答:(1)基于语言的信息分析方法(LIA)
主要思想:先对要建立的系统及其需求用自然语言描述,然后对这些描述进行语法分析。
名词?对象,形容词?属性,动词?服务
填进一张OOA/OOD工作表格。最后对表中的项进行分析,从中确定问题域中的对象。
(2)三视图模型法(3VM)
观察一个事物的角度不同,将得到不同的视图。从多个角度观察得到的同一个事物的多个视图更能完整地、全面地反映该事物。
LIA方法要求分析员从众多的侯选对象中识别出目标系统的对象,这依赖于分析员的抽象和分析能力,随意性大,可操作性不强。
LIA方法提供了一个发现对象的出发点,一般将该方法用于对象模型建立的初始阶段。
3VM法也依赖于分析人员的抽象和分析能力,但运用建立3VM的方法,确实提供了分析对象的入口点和细化的方法,具有相对较好的操作性。 该方法一般用于对象模型的细化。
12、分析电梯到达调度楼层的事件-响应对象交互图、实例连接图。
电梯到达调度楼层的事件-响应对象交互图PPT第四章93
1.当电梯到达某一楼层时,就会产生一个电梯到达事件Arrival Event。其属性有: 该到达事件的唯一标识: ECS/OOA EROI图第3个事件:电梯到达调度楼层 arrival_id 到到目目电超召召达达的的电梯楼载唤唤 生成到达事件的电梯: 事面事面梯电层传事面件板件板机感件板 elevator_id 器 生成该到达事件的楼层: arrival_floor 2.电梯到达事件生成后,将会向与elevator_id相关联的到达面板发送一个单向的消息,该消息是: (arrival_floor) (电梯elevator_id所到达的楼层) 第3个事件:电梯到达调度楼层ECS/OOA EROI图 与elevator_id 相关联的到达面板根据收到的消息刷新到达面板的显示 图3-12 电梯到达调度楼层
到达事件到达面板3.电梯到达事件将会向与 floor_id相关联的 (到达事件的唯一标识,电梯唯一标识,到达的楼层号) (arrival_id, report_elevator_id,report_arrival_floor_id) 目电超召召的电梯楼载唤唤面梯电层传事面板机感件板器floor发送一个单向的消息,该消息是: 目的事件
ECS/OOA EROI图第3个事件:电梯到达调度楼层到到目目电超召召达达的的电梯楼载唤唤4.楼层Floor收到上述消息后,由服务Floor.Process_Elevator_Arrival_处理。该服务事面事面梯电层传事面件板件板机感件板将向电梯report_elevator_id发送一个双向的消息:器(report_status_direction?,report_current_direction?)
图3-12 电梯到达调度楼层ECS/OOA EROI图第3个事件:电梯到达调度楼层到达事件到达面板目的事件目电超召的电梯楼载唤面梯电层传事板机感件器召唤面板图3-12 电梯到达调度楼层