软件工程 期末总结

末鹿安然 提交于 2020-02-08 01:22:51

软工期末
CH1

  1. 软件危机
    内容:
    在计算机软件的开发和维护过程中所遇到的一系列严重问题。
    几乎所有的软件,都不同程度地存在着这些问题。
    软件危机主要包括如下两方面的问题:
    ① 如何开发软件,满足增长需求;
    ② 如何维护软件。
    主要原因:
    软件日益复杂和庞大
    软件开发管理困难和复杂
    软件开发技术落后
    生产方式落后
    开发工具落后
    软件开发费用不断增加
  2. 软件工程
    软件工程是采用工程的概念、原理、技术和方法来开发与维护软件一门工程学科,从而经济地开发出高质量的软件并有效地维护它。
  3. 传统方法学、面向对象方法学
    (1)传统方法学(生命周期方法学或结构化范型)
    ——强调自顶向下;
    (2)面向对象方法学
    ——强调主动地多次反复迭代;
    (3)面向对象方法学4个要点:对象;类;继承;消息。
  4. 软件生命周期
  5. 问题定义
  6. 可行性研究:目的不是解决问题,而是确定问题是否值得去解决。
  7. 需求分析:系统必须要做什么
  8. 总体设计:目的:“概括地说,系统应当如何实现”,因此总体设计又称为概要设计或者初步设计。
  9. 详细设计:确定应该怎样具体地实现所要求的系统。
  10. 编码和单元测试:写出容易、容易维护的程序模块
  11. 综合测试:通过相应的测试和调试使软件达到预定的功能
  12. 软件维护:在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
  13. 周期模型
    瀑布模型:1.阶段间具有顺序性和依赖性。 2.推迟实现的观点。3.质量保证的观点。
    快速原型模型:是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成功能的一个子集。
    增量模型:它分批地逐步向用户提交产品,整个软件产品被分解成许多个增量构件,开发人员一个构件再一个构件地向用户提交产品。
    螺旋模型:基本思想是使用原型及其他方法来尽量降低风险。理解这种模型的一个简单方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。(使用于内部开发的大规模软件项目)
    喷泉模型:强调的是“迭代”和“无缝“的特性,是典型的面向对象的软件过程模型之一。
    CH2
    数据流图
    分类:变换型和事务型
    作用:描绘信息流和数据从输入移动到输出的过程中所经受的变换。(数据流不是控制流)
    步骤:
    (1)从问题描述中提取数据流图的4种成分:
    数据的源点/终点
    处理:处于静止状态的数据
    数据流:处于运动中的数据
    数据存储:
    (2)画基本系统模型
    (3)细化,描绘系统的主要功能(功能级数据流图)
    (4)对系统主要功能进一步细化
    例子:
    见下面手写扫描稿
    CH3
  14. 需求分析过程建立三种模型
    数据模型:实体-联系图
    功能模型:数据流图
    行为模型:状态转换图
  15. 状态转换图
    通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。
    例子:
    见下面手写扫描稿
    CH5
    设计原理
    模块化
    定义:就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来够成一个整体,可以完成指定的功能满足用户的需求。
    每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小。
    作用:
    模块化可以使软件结构清晰,不仅容易设计也容易阅读和理解;
    模块化使软件容易测试和调试,因而有助于提高软件的可靠性;
    模块化能够提高软件的可修改性;
    模块化也有助于软件开发工程的组织管理。
    抽象
    抽象就是抽出事物本质特性而暂时不考虑细节。是人类处理复杂问题的基本方法之一
    逐步求精
    为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。
    信息隐藏
    设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。
    局部化
    指把一些关系密切的软件元素物理地放得彼此靠近。显然,局部化有助于实现信息隐藏。
    模块独立
    使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。
    即功能专一,模块之间无过多的相互作用的模块。
    独立性标准:
    内聚:是衡量一个模块内部各个元素彼此结合的紧密程度。内聚要高,每个模块完成一个相对独立的特定子功能。理想内聚的模块只做一件事情。
    耦合:是对一个软件结构内不同模块之间互连程度的度量。耦合要低,即每个模块和其他模块之间的关系要简单;
    耦合性质;
    最高程度的耦合是内容耦合。
    如果出现下列情况之一,两个模块间就发生了内容耦合:
    一个模块访问另一个模块的内部数据;
    一个模块不通过正常入口转到另一个模块的内部;
    两个模块有一部分程序代码重叠;
    一个模块有多个入口。
    设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。
    内聚性质:
    高内聚:功能内聚、顺序内聚
    中内聚:通信内聚、过程内聚
    低内聚:时间内聚、逻辑内聚、偶然内聚
    Jackson图
    步骤:
    (1) 分析并确定输入数据和输出数据的逻辑结构,用Jackson图描绘数据结构。
    (2) 找出输入数据结构和输出数据结构中有对应关系的数据单元。
    (3) 用下述规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:
    第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次,在程序结构图的相应层次画一个处理框(层次不同时与图中层次低的那个对应);
    第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;
    第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
    改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。
    (4) 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。
    (5) 用伪码表示程序。
    环形复杂度:
    计算方法:

控制流图中区域的数量对应于环形复杂度。

给定控制流图G的环形复杂度—V(G),定义为 V(G) = E-N+2 其中,E是控制流图中边的数量,N是控制流图中的节点数量。
给定控制流图G的环形复杂度—V(G),也可定义为V(G) = P+1 其中,P是控制流图G中判定节点的数量。
CH7
测试与调试的区别:
软件测试是找出软件已经存在的错误,而调试是定位错误,修改程序以修正错误.
软件测试从一个已知的条件开始,有预知的结局 而调试从未知的条件开始,其结局不可预知
软件测试可以计划,可以预先制定测试用例和过程,工作进度可以度量.而调试不能计划,进度不可度量
黑盒测试(功能测试):
把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程,是在程序接口进行的测试。白盒测试(结构测试):
把程序看成装在一个透明的盒子里,测试者完全知道程序的结构和处理算法,按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。
集成测试的集成策略:
模块组装成程序时有两种方法:
1)非渐增式测试方法:先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序。
2)渐增式测试:把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。
当使用渐增方式把模块结合到程序中去时,有自顶向下和自底向上两种集成策略。
当使用自顶向下集成时有深度优先和宽度优先的策略。
软件测试步骤:
模块测试、子系统测试、系统测试、验收测试、平行运行
(1)模块测试(单元测试)
模块测试又称单元测试,它把每个模块作为单独的实体来测试。
保证每个模块作为一个单元能正确运行;
发现的往往是编码和详细设计的错误。单元测试主要使用白盒测试技术。
(2)子系统测试
把经过单元测试的模块放在一起形成一个子系统来测试;
着重测试模块的接口。
(3)系统测试
把经过测试的子系统装配成一个完整的系统来测试;
发现的往往是软件设计编码中的错误,也可能发现需求说明中的错误;
不论是子系统测试还是系统测试,都兼有检测和组装两重含义,称为集成测试。
(4)验收测试(确认测试)
把软件系统作为单一的实体进行测试;它是在用户积极参与下进行的,而且可能主要使用实际数据(系统将来要处理的信息)进行测试;
发现的往往是系统需求说明书中的错误。验收测试也称为确认测试。
(5)平行运行:同时运行新开发出来的系统和将被它取代的旧系统;
逻辑覆盖:
(1)语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次。
(2)判定覆盖 :不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次。
比语句覆盖强,但对程序逻辑的覆盖程度仍不高。
(3)条件覆盖 :不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。
判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖。
(4)判定/条件覆盖 :使得判定表达式中的每个条件都取到各种可能的值,每个判定表达式也都取到各种可能的结果。
有时判定/条件覆盖也并不比条件覆盖更强。
(5)条件组合覆盖 :要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。
条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。
(6) 点覆盖:程序执行路径至少经过流图的每个结点一次。(语句覆盖标准相同)
(7) 边覆盖:使得程序执行路径至少经过流图中每条边一次。(判定覆盖一致)
(8) 路径覆盖:选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。
关系上图

等价划分
原则:
如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类。
如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值)。
如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则);
如果规定了输入数据为整型,则可以划分出正整数、零和负整数等3个有效类;
如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表。
步骤
为每一个等价类规定一个唯一编号;
设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止;
设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。
注意,通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个无效的等价类。
例子:
例子:
某城市的电话号码由3个部分组成:
地区码——空白或四位数字;
前缀 ——非0或1开头的四位数字;
后缀 ——四位数字。
使用等价类划分方法进行测试用例设计。
边界值分析:
例:测试计算平方根的函数 :输入:实数、输出:实数

CH8
可维护性:
维护人员理解、改正、改动或改进这个软件的难易程度。
决定性因素:
可理解性
可测试性
可修改性
可移植性
可重用性
文档是影响软件可维护性的决定因素 。
CH9
面向对象方法学要点:
(1)面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。
(2)把所有对象都划分成各种对象类(简称为类,class),每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。
(3)按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。
(4)对象彼此之间仅能通过传递消息互相联系。
相关概念:

对象:
是客观事物或概念的抽象表述,即对客观存在的事物的描述统称为对象,对象可以是事、物、或抽象概念 ,是将一组数据和使用该数据的一组基本操作或过程封装在一起的实体
类:
类就是对具有相同数据和相同操作的一组相似对象的定义。“类”好比是一个对象模板,用它可以产生多个对象
实例:
实例就是由某个特定的类所描述的一个具体的对象。
消息:
对象之间通信的手段,是一个对象要求另一对象执行类中定义的某个操作的规格说明。通常一个消息由三部分组成:
接收消息的对象
消息标识符(即消息名)
零个或多个变元
面向对象建模:
例子:
见手写扫描稿
CH11
面向对象建模准则:
模块化
抽象
信息隐藏、
弱耦合
交互耦合
继承耦合
强内聚
服务内聚:
类内聚
一般-特殊内聚
可重用
4大子系统:
问题域子系统:对分析形成的问题域子系统进行补充和完善,增添,合并或分解类与对象,属性,服务,调整继承关系。
人机交互子系统:确定人机交互的细节。
任务管理子系统:确定哪些是必须同时动作的对象,哪些是互相排斥的对象。
数据管理子系统:是系统存储或检索对象的基本设施,建立在某种数据存储管理系统之上,并且隔离了数据存储管理模式的影响。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!