——知识点范围整理自群文件wkw某闭卷复习要点.txt 可恶好多啊闭卷考概念的滚出中国 题型 判断题 10分 选择题 10分 填空题 10分 名词解释 4×5分 简答题 5×4分 综合题 30(课堂作业)
押个题 (坐等打脸) ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)
- 软件生命周期划分阶段和任务
- 对比分析面向对象方法与结构化方法
- 统一开发过程RUP阶段和里程碑
- scrum相关(计科没讲)
- 扇入扇出、作用域、模块独立性、信息隐蔽
- 加油站数据流图
- 密码验证状态转换图
考完复盘:知识点基本覆盖,吴克伟NB
一、软件工程学概述
1. 软件与软件工程的定义
软件是多种术语和对象的集合,并将这些术语和对象有效地配置在一起。一般包括程序、文档和数据。 软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
2. 软件危机
在计算机软件的开发和维护过程中所遇到的一系列严重问题。 这些问题不是在解决具体问题时遇到的,而是软件开发过程所面临的具有普适性的问题。
注:概括说,开发周期长、成本高、质量差、适应性差和难维护等四大难题
产生原因
- 与软件本身特点有关
- 软件开发与维护的方法不正确有关
- 在软件开发的不同阶段进行修改需要付出的代价
3. 软件工程方法学
(1)传统方法学
也称为生命周期方法学或结构化范型。它采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。
(2)面向对象方法学
与传统方法相反,面向对象方法把数据和行为看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。
(3)面向方面的软件开发方法
面向方面直观的理解就是对软件组件做一次垂直的分解,提取其中的那些具有交叉性的功能和一些非功能属性,建立方面
(4)面向组件的软件工程方法
这种模型结合了一些螺旋模型的特性,应用该模型的主要目的是对现有组件对象的复用
(5)面向Agent的软件开发方法 (6)敏捷软件工程开发方法
4. 软件工程三要素
- 过程:规定了完成各项任务的过程;
- 方法:完成软件开发的各项任务的技术方法;
- 工具:软件工程的支撑环境;
5. 软件的生命周期
PPT说是三个阶段,七个环节
(1)三个阶段包括: 软件定义阶段: 可行性研究和需求分析 软件开发阶段: 概要设计、详细设计、编码和测试和综合测试 软件维护:保证软件在相当长的时期能够正常运行。(花费时间最多) (2)七个环节包括:(不确定) 问题定义、可行性研究和需求分析 总体设计,详细设计,编码和单元测试,综合测试
6. 统一软件开发过程(Rational Unified Process,RUP)
阶段与里程碑概念
- 初始阶段(Inception)
- 细化阶段(Elaboration)
- 构造阶段(Construction)
- 交付阶段(Transition)
每个阶段结束于一个主要的里程碑(Major Milestones) 每个阶段本质上是两个里程碑之间的时间跨度。在每个阶段的结尾执行一次评估以确定这个阶段的目标是否已经满足。如果评估结果令人满意的话,可以允许项目进入下一个阶段。
7. SCRUM的特点、角色、工件
Scrum是以经验性过程控制理论(经验主义)做为理论基础的过程。经验主义主张知识源于经验, 以及基于已知的东西做决定。Scrum 采用迭代、增量的方法来优化可预见性并控制风险。
特点
透明性(Transparency) 透明度是指,在软件开发过程的各个环节保持高度的可见性,影响交付成果的各个方面对于参与交付的所有人、管理生产结果的人保持透明。
检验(Inspection) 开发过程中的各方面必须做到足够频繁地检验,确保能够及时发现过程中的重大偏差。
适应(Adaptation) 如果检验人员检验的时候发现过程中的一个或多个方面不满足验收标准,并且最终产品是不合格的,那么便需要对过程或是材料进行调整。调整工作必须尽快实施,以减少进一步的偏差。
角色
- 产品负责人(Product Owner):负责维护产品订单的人,代表利益相关者的利益。
- 流程管理员(Scrum Master):为Scrum过程负责的人,确保scrum的正确使用并使得Scrum的收益最大化。一般不翻译。
- 开发团队(Scrum Team): 由负责自我管理开发产品的人组成的跨职能团队。
工件
- 产品订单(product backlog):根据用户价值进行优先级排序的高层需求。
- 冲刺订单(sprint backlog):要在冲刺中完成的任务的清单。
- 燃尽图(burn down chart):最终交付给客户的内容。
二、可行性研究、需求分析
1. 研究目的
对需求内容进行初步的分析,确定解决问题的可能性,分析不同解决方案的优劣,并提出建议。其本质实际上就是一个粗略的系统分析和设计过程,通常由客户完成。
可行性研究的目的不是解决问题,而是确定问题是否值得去解决。
2. 三个方面
- 技术可行性:使用现有的技术能实现这个系统吗?
- 经济可行性:这个系统的经济效益能超过它的开发成本吗?
- 操作可行性:系统的操作方式在这个用户组织内行得通吗?
3. 软件需求规格说明书
简易的应用规格说明技术分析需求的典型过程如下
- 进行初步访谈
- 开发者和用户分别写出“产品需求”
- 开会讨论,各自展示需求列表
- 得出了意见一致,为需求列表制定小型规格说明
- 根据会议结果,起草完整的软件需求规格说明
4. 数据字典
数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。
数据字典通常包括:(1)数据项(2)数据结构(3)数据流(4)数据存储(5)处理过程五个部分。其中数据项是数据的最小组成单位,若干个数据项可以组成一个数据结构。数据字典通过对数据项和数据结构的定义来描述数据流和数据存储的逻辑内容。
5. 数据流图
6. 状态转换图
7. ER图
答案都给了!!直接背就完事了
三、总体设计
1. 模块独立性
是指软件系统中每个模块只涉及软件要求的具体的子功能, 而和软件系统中其它的模块的接口是简单的。 原因:
- 有效的模块化(即具有独立的模块)的软件比较容易开发出来。
- 独立的模块比较容易测试和维护。
衡量标准: 模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚和耦合。
2. 信息隐蔽
每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。
3. 内聚耦合(控制耦合,功能内聚)
耦合:是模块之间的互相连接的紧密程度的度量。 内聚:标志一个模块内各个元素彼此结合的紧密程度。
控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。 功能内聚:一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。
4. 模块三要素
功能:描述该模块实现什么功能 逻辑:描述模块内部怎么做 状态:该模块使用时的环境和条件
在描述一个模块时,还必须按模块的外部特性与内部特性分别描述 模块的外部特性:模块的模块名、参数表、其中的输入参数和输出参数,以及给程序以至整个系统造成的影响 模块的内部特性:完成其功能的程序代码和仅供该模块内部使用的数据
5. 扇入扇出,控制域,作用域
这部分属于启发规则,见PPT第五章54页
扇入:一个模块被其他模块调用的个数 扇出:一个模块调用其他模块的个数
尽可能减少高扇出结构,随着深度增大扇入 如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。
模块的作用域应该在控制域之内 作用域:受该模块内一个判定影响的所有模块的集合。 控制域:模块本身以及所有直接或间接从属于它的模块的集合。
6. 软件结构图
四、详细设计
1. 详细设计
根本目标:确定应该怎样具体地实现所要求的系统。 详细设计阶段的任务不是具体地编写程序,而是要设计出程序的“蓝图”。 详细设计的结果基本上决定了最终的程序代码的质量。
2. 结构化设计(三种基本控制结构)
经典定义:如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。 更全面的定义:结构程序设计是尽可能少用GO TO语句的程序设计方法。最好仅在检测出错误时才使用GO TO语句,而且应该总是使用前向GO TO语句。
三种基本控制结构
- 顺序
- IF-THEN-ELSE型分支
- DO-WHILE型循环
如果除了上述3种基本控制结构之外, 还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构,则称为扩展的结构程序设计 如果再允许使用LEAVE(或BREAK )结构,则称为修正的结构程序设计。
3. 判定表+判定树
判定表 判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。由4部分组成:
- 左上部列出所有条件
- 左下部是所有可能做的动作
- 右上部是表示各种条件组合的一个矩阵
- 右下部是和每种条件组合相对应的动作。
判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。 判定树 判定树是判定表的变种,它也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。
4. jackson详细设计
特点:
- 便于表示层次结构,而且是对结构进行自顶向下分解的有力工具
- 形象直观可读性好
- 既能表示数据结构也能表示程序结构
与数据流图和层次框图的区别:
- 数据流图是根据数据确定软件结构的方法,主要应用于需求分析和概要设计阶段
- Jackson图是根据数据结构设计程序处理过程的方法
- 层次框图与Jackson图虽然类似,但其中图形元素的含义不同,层次图主要用于描述模块及其之间的关系.但Jackson图描述的是程序结构
步骤:
- 分析并确定输入数据和输出数据的逻辑结构,并使用Jackson图描绘这些数据结构
- 找出输入数据结构和输出数据结构有对应关系的数据单元(即程序中可以同时处理的数据单元)
- 依据规则导出Jackson图
- 列出所有操作和条件,并把他们分配到程序结构图的适当位置
- 用伪码表示程序
5. 详细设计文档
五、测试维护
1. 测试原则
(1) 所有测试都应该能追溯到用户需求; (2) 应该远在测试开始之前就制定出测试计划; (3) 把Pareto原理应用到软件测试中(测试存在群集现象); (4) 该从“小规模”测试开始,并逐步进行“大规模”的测试; (5) 穷举测试是不可能的; (6) 为了达到最佳测试效果,应该由独立的第三方从事测试工作; (7) 应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭; (8) 测试用例应由测试输入数据和对应的预期输出结果这两部分组成; (9) 在设计测试用例时,应当包括合理的输入条件和不合理的输入条件; (10) 应当对每一个测试结果做全面检查; (11) 妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便;
2. 单元测试
单元测试集中检测软件设计的最小单元——模块。 单元测试和编码属于软件过程的同一个阶段。 在源程序代码通过编译程序的语法检查后,可以用详细设计描述作指南,对重要的执行通路进行测试,以便发现模块内部的错误。 可以应用人工测试和计算机测试这样两种不同类型的测试方法,完成单元测试工作。 单元测试主要使用白盒测试技术,而且对多个模块的测试可以并行地进行。 测试重点: 模块接口;局部数据结构;重要的执行通路;出错处理通路;边界条件。
3. 集成测试
集成测试是测试和组装软件的系统化技术。
方法
由模块组装成程序时有两种方法。 一种方法是先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,这种方法称为非渐增式测试方法; 另一种方法是把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。这种每次增加一个模块的方法称为渐增式测试,这种方法实际上同时完成单元测试和集成测试。
非渐增式测试:
把所有模块放在一起,作为一个整体来测试。测试时会遇到许多的错误,改正错误非常困难,因为在庞大的程序中想要诊断定位一个错误非常困难,而且改正一个错误之后,马上又会遇到新的错误,这个过程会继续下去,没有尽头。
渐增式测试:
与“一步到位”的非渐增式测试相反,它把程序划分成小段来构造和测试,在这个过程中比较容易定位和改正错误;对接口可以进行更彻底的测试;可以使用系统化的测试方法。因此,目前在进行集成测试时普遍采用渐增式测试方法。
当使用渐增方式把模块结合到程序中去时,有自顶向下和自底向上两种集成策略。
自顶向下集成
方法是从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。在把附属于(及最终附属于)主控制模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先的策略。 深度优先的结合方法先组装在软件结构的一条主控制通路上的所有模块。选择一条主控制通路取决于应用的特点,并且有很大任意性。 宽度优先的结合方法是沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来。
自底向上
自底向上测试从“原子”模块(即在软件结构最低层的模块)开始组装和测试。因为是从底部向上结合模块,总能得到所需的下层模块处理功能,所以不需要存根程序。
优缺点:
自顶向下测试方法的主要优点是不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误。 自顶向下测试方法的主要缺点是需要存根程序,可能遇到与此相联系的测试困难,低层关键模块中的错误发现较晚,而且用这种方法在早期不能充分展开人力。
自底向上测试方法的优缺点与上述自顶向下测试方法的优缺点刚好相反。
4. 验收测试
确认测试也称为验收测试,它的目标是验证软件的有效性。 验证指的是保证软件正确地实现了某个特定要求的一系列活动;确认指的是为了保证软件确实满足了用户需求而进行的一系列活动。 软件有效性的一个简单定义是:如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的。 需求分析阶段产生的软件需求规格说明书,准确地描述了用户对软件的合理期望,因此是软件有效性的标准,也是进行确认测试的基础。
确认测试必须有用户积极参与,或以用户为主进行。用户应该参与设计测试方案,使用用户界面输入测试数据并且分析评价测试的输出结果。 确认测试通常使用黑盒测试法。
5. 白盒测试(流图,测试用例)
此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。 通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。
测试方法:代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。 其中运用最为广泛的是基本路径测试法。 语句覆盖→条件覆盖(分支覆盖)→判定覆盖:能力依次增强
满足条件覆盖的测试数据不一定满足判定覆盖
(ppt 07-实现 page67)
6. 软件调试
调试(也称为纠错)作为成功测试的后果出现,即调试是在测试发现错误之后排除错误的过程。 软件错误的外部表现和它的内在原因之间可能并没有明显的联系。调试就是把症状和原因联系起来的尚未被人深入认识的智力过程。
调试过程
调试不是测试。 调试过程从执行一个测试用例开始,评估测试结果,如果发现实际结果与预期结果不一致,则这种不一致就是一个症状,它表明在软件中存在着隐藏的问题。调试过程试图找出产生症状的原因,以便改正错误。
调试途径
蛮干法可能是寻找软件错误原因的最低效的方法。仅当所有其他方法都失败了的情况下,才应该使用这种方法。 回溯是一种相当常用的调试方法,当调试小程序时这种方法是有效的。具体做法:从发现症状的地方开始,人工沿程序的控制流往回追踪分析源程序代码,直到找出错误原因为止。 对分查找法的基本思路是,如果已经知道每个变量在程序内若干个关键点的正确值,则可以用赋值语句或输入语句在程序中点附近“注入”这些变量的正确值,然后运行程序并检查所得到的输出。 归纳法是从个别现象推断出一般性结论的思维方法。使用这种方法调试程序时,首先把和错误有关的数据组织起来进行分析,以便发现可能的错误原因。然后导出对错误原因的一个或多个假设,并利用已有的数据来证明或排除这些假设。 演绎法从一般原理或前提出发,经过排除和精化的过程推导出结论。采用这种方法调试程序时,首先设想出所有可能的出错原因,然后试图用测试来排除每一个假设的原因。
对分查找法、归纳法和演绎法都属于原因排除法。
7. 软件维护
基本概念
所谓软件维护就是在软件交付使用后,为改正错误或满足新需要而修改软件的过程。 可分为改正性维护、适应性维护、完善性维护、预防性维护。 软件可靠性 是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。软件可靠性随着给定的时间间隔的加大而减少。 一般说来,对于任何其故障是可以修复的系统,都应该同时使用可靠性和可用性衡量它的优劣程度。 软件可用性 是程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。 可靠性和可用性之间的主要差别是,可靠性意味着在0到t这段时间间隔内系统没有失效,而可用性只意味着在时刻t,系统是正常运行的。
估算平均无故障时间的方法
植入错误法 在测试之前由专人在程序中随机地植入一些错误,测试之后,根据测试小组发现的错误中原有的和植入的两种错误的比例,来估计程序中原有错误的总数ET。 分别测试法 为了随机地给一部分错误加标记,分别测试法使用两个测试员(或测试小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。
六、面向对象
1. 比较分析面向对象,面向过程(很可能考)
计算机处理的实体对象 面向对象方法 :这里的对象是指数据以及可以施加在这些数据之上的操作所构成的统一体 。类(数据+行为) 结构化方法 :是各种预定义类型的变量、数组、记录和文件等数据描述 。模块(数据+部分行为) 计算机处理对象的操作 面向对象方法 :通过消息驱动对象主动的执行起自身的数据处理行为 结构化方法 :通过对象(参数)传送,并调用外部的处理功能来处理对象 处理观点的不同 面向对象方法 :把程序看成是相互协作而又彼此独立的对象的集合。每个对象就是一个微型的程序,有自己的数据、操作、功能和目的 结构化方法 :看作是工作在数据之上的一系列过程或函数的集合 通讯机制 面向对象方法 :消息的传递 结构化方法 :模块调用和参数的传递 【思维的特点】 面向对象方法 :该方法使用现实世界的概念抽象地思考问题从而自然地解决问题。他强调模拟现实世界中的概念而不强调算法。在进行面向对象设计时,计算机处理问题方式被放弃,而重点针对需要处理的问题进行分析。 结构化方法 :这种方法以算法为核心,把数据和过程作为相互独立的部分,数据代表问题空间中的客体,程序代码则用于处理这些数据。这种思维方法与计算机处理问题的方法是相一致的。对于那些非常熟悉计算机处理过程的程序员来说具有不可替代的优势。 【软件开发过程的特点】 面向对象方法 :面向对象的方法重点强调反映现实需求的对象业务模型的建立,相对而言设计和编码部分的工作则较为次要。 结构化方法 :重点在软件处理过程的设计和实现上。 【适用范围的比较】 面向对象方法 :适合于比较大型的应用。 结构化方法 :对于要求涉及底层处理的应用或需要较高处理效率直接对硬件系统进行操作的系统比较适用。另外对一些小的需要复杂处理流程(强调算法设计)的软件系统也比较适用。 一般特点比较 面向对象方法 :稳定、可重用、易维护;但执行效率比较低 结构化方法 :执行效率高;但难维护 两种方法的交互性 面向对象方法 :面向对象方法是在传统软件工程方法上发展起来的一种新方法,许多传统的软件工程方法在面向对象的分析上也同样起作用(模块设计的原则等) 结构化方法 :在面向对象的设计中还存在一些不可消除的作用,当前提出的面向方面的设计就是这种作用的体现。
2. 类和类之间的关系类型
类与类之间通常有关联、泛化(继承)、依赖和细化4种关系 (1)关联 表示两个类的对象之间存在某种语义上的联系。
聚集也称为聚合,是关联的特例。聚集表示类与类之间的关系是整体与部分的关系。使用的“包含”、“组成”、“分为……部分”等字句,意味着存在聚集关系。
(2)泛化 UML中的泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系。具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息。 (3)依赖 依赖关系描述两个模型元素(类、用例等)之间的语义连接关系: 其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素。 (4)细化 当对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系。
假设两个模型元素A和B描述同一个事物,它们的区别是抽象层次不同,如果B是在A的基础上的更详细的描述,则称B细化了A,或称A细化成了B。
3. 面向对象设计的五个层次,三个模型(需求分析三个模型)
五个层次: 主题层、类与对象层、结构层、属性层和服务层 三个模型:
- 对象模型(静态结构)
- 动态模型(交互结构)
- 功能模型(数据变换)
三者解决的问题不同,重要程度也不同。其中对象模型是最基本、最重要、最核心的。 面向对象建模得到的模型包含系统的3个要素,即静态结构(对象模型)、交互次序(动态模型)和数据变换(功能模型)。解决的问题不同,这3个子模型的重要程度也不同。
4. 用例图
5. 软件重用
概念: 重用也叫再用或复用,是指同一事物不作修改或稍加改动就多次重复使用。 广义地说,软件重用可分为以下3个层次:
上述前两个重用层次属于知识工程研究的范畴,本节仅讨论软件成分重用问题。
软件成分的重用级别
代码重用:源代码剪贴、源代码包含、继承 设计结果重用:重用某个软件系统的设计模型(即求解域模型) 分析结果重用:更高级别的重用,即重用某个系统的分析模型
典型的可重用软件成分:
主要有以下10种:项目计划、成本估计、体系结构、需求模型和规格说明、设计、源代码、用户文档和技术文档、用户界面、数据、测试用例
类构件
面向对象技术中的“类”,是比较理想的可重用软构件,不妨称之为类构件。 应具备的特点:① 模块独立性强 ② 具有高度可塑性 ③ 接口清晰、简明、可靠 ④ 需求模型和规格说明 类构件的重用方式:① 实例重用 ② 继承重用 ③ 多态重用 软件重用的效益:① 质量 ② 生产率 ③ 成本
6. 软件质量
七、课堂作业(签到题)
1. 数据流图:加油站电子帐表系统
1层描述 2层描述
2. 模块内聚的种类
3. 详细设计-过程设计工具-判定表
4. 对应流程图的判定表,跟3一起画
5. 需求分析-密码验证状态转换图
6. Jackson图的实例:统计文件中的空格数
7. 不同集成测试策略的比较
|