1、一方面与软件本身的特点有关 2、软件危机是指由于软件开发不规范,在计算机开发和维护中所遇到的一系列严重问题。
消除计算机危机的途径(规范软件开发的过程)
(1)对计算机有一个正确的认知
(2)充分认识到软件开发不是某个个体劳动的神秘技巧,而应该是一种组织良好,管理严格,各类人员协同配合共同完成的工程项目
(3)推广使用在实践中总结出来得开发软件的成功技术和方法
(4)开发和使用更好的软件工具
总之,为了解决软件危机,既要有技术措施(方法和工具)又要有必要的组织管理措施
软件工程是指导计算机软件开发与维护的一门工程学科(实用学科)
软件工程的基本原理
(1)用分阶段的生命周期严格管理
(2)坚持进行阶段评审
(3)实行严格的产品控制
(4)采用现代程序设计技术
(5)结果应能清除地审查
(6)开发小组的人员应该少而精
(7)承认不断改进软件工程实践得必要性
软件生命周期(三大阶段、八大任务)
(1)软件定义:问题定义、可行性研究、需求分析
(2)软件开发:概要设计、详细设计、编码和单元测试、综合测试
(3)软件维护
软件工程方法学
通常把在软件生命周期全过程中使用的一套技术方法的集合称为方法学。
软件工程方法学的三个要素:方法、工具、过程
目前使用的最广泛的软件工程方法学:1、传统方法学 2、面向对象方法学
传统方法学(可能会出简答)
采用结构化技术来完成软件开发的各项任务,并且使用适当的软件工具或软件工程环境来支持结构化技术的运用。这种方法学把软件生命周期的全过程划分为若干个阶段,然后顺序的完成每个阶段的任务。
面向对象方法学
是一种以数据为主线,把数据和对数据的操作紧密的结合起来的方法。
面向对象方法学的四个要点:
(1)把对象作为融合了数据以及数据上操作行为的统一软件结构
(2)把所有的对象都划分成类
(3)按照父类与子类的关系,把若干个相关类组成一个层次结构的系统
(4)对象彼此之间只能通过发送消息互相联系
软件过程
软件过程是为了获得高质量软件所需要的一系列任务的框架,它规定了完成各项任务的工作步骤。(开发软件的全过程)
瀑布模型
传统软件工程方法学的软件过长基本可以用瀑布模型来描述。它有以下特点:
1、阶段间具有顺序性和依赖性
这个特点具有两重含义:(1)必须等前一阶段的工作完成后才能开始后一阶段的工作(2)前一阶段的输出文档就是后一阶段的输入文档,因此,只有前一阶段的输出文档正确,后一阶段额工作才能获得正确的结果。
2、推迟实现的观点
在编码之前设置了系统分析和系统设计的各个阶段,分析与设计阶段的基本任务规定:主要考虑目标系统的逻辑模型,不涉及软件的物理实现。
3、质量保证的观点
(1)每个阶段必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务。(2)每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题
瀑布模型适用:在开发早期阶段软件需求被完整确定
瀑布模型的优点:可强迫开发人员使用规范的方法;严格规定了每个阶段必须提交的文档;要求每个阶段交出的产品都必须经过质量保证小组的仔细验证。
瀑布模型的缺点:瀑布模型是由文档驱动;最终产品不能真正满足客户的需求
快速原型模型
开发人员尽可能快的建造出原型系统,让用户体验,之后提出意见,随之进行修改,再让用户体验,直到用户满意为止,据此写出规格说明文档。
特点:
1、快速原型模型是不带反馈环的,优点:软件产品的开发是线性顺序进行的
2、软件一旦交付给用户,维护便开始了
3、快速原型的本质是快速,开发人员应尽可能快得建造出原型系统,加速软件开发,节约开发成本
4、原型的意图是获知用户真正的需求、一旦需求确定了,原型将被抛弃
增量模型
融合了瀑布模型的基本成分(重复应用)和原型实现的迭代特征,该模型采用随日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的“增量”
优点:
能在较短时间内向用户提交可完成部分工作的产品
逐步增加产品功能,可以使用户有充裕的时间学习和适应新产品,从而减少一个全新的软件可能对用户组织带来的冲击。
缺点:
需要软件具备开放式的体系结构;容易退化为边做边改模型,从而使软件过程中的控制失去整体性;增加系统内部的耦合复杂性。
2.1、可行性研究的任务
至少从三个方面研究每种解法的可行性
2.3、系统流程图
概括的描绘物理系统的传统工具。它的基本思想是用图形符号以黑盒子形式描绘系统的每个部件(程序、文档、数据库、人工过程等)。系统流程图表达的是数据在系统各部件之间的流动情况,而不是对数据加工处理的控制过程。
2.4、数据流图
数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。
订货系统的功能级数据流图:
把处理事务的功能进一步分解后的数据流图:
2.5、数据字典
数据字典是关于数据的信息的集合。也就是说对数据流图中包含的所有元素的定义的集合。
数据字典由以下4类元素的定义组成:
定义数据的方法
例题:北京某高校可用的电话号码有以下几种分类:校内电话由4位数字组成,第一位数字不是0;校外的电话又分为本市电话和外地电话两类,拨校外电话需先拨0,若是本市电话则借着拨8位数字(第一位不是0),若是外地电话则再拨3位区码再拨8位电话(第一位不是0)
用定义数据的办法定义上述电话号码:
电话号码 = [校内电话 | 校外电话]
校内电话 = 非零数字 + 3位数字
校外电话 = [本市号码 | 外地号码]
本市号码 = 数字0 + 8位数字
外地号码 = 数字0 + 3位数字 + 8位数字
非零数字 = [1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9]
数字0 = 0
3位数字 = 3 {数字}3
8位数字 = 非零数字 +=7位数字
7位数字 = 7{数字}7
数字 = {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }
数据字典的实现
建议采用卡片形式书写数据字典,每张卡片上保留描述一个数据的信息。名字、别名、描述、定义、位置。
弄清楚用户的需求,对目标系统提出完整、准确、清晰、具体的要求。
需求分析的任务
实体—联系图
为了把用户的要求清楚、准确的描述出来,系统分析员建立的一个概念性的数据模型。
数据对象彼此之间互相连接的方式称为联系,联系可分为3种类型,一对一(1:1),一对多(1:N),多对多(M:N)
例子:
某校教学管理ER图
层次方框图
层次方框图用树形结构的一系列多层次的矩形描绘数据的层次结构。(区别HIPO图,这里方框间连线表示的是组成关系,而HIPO图表示的是调用关系)
例子:
IPO图
IPO图是输入、处理、输出图的简称,P69
设计过程
总体设计通常由两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构。
设计原理
模块化:
模块化就是把程序划分成独立命名并且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户要求。
模块独立:
模块独立的概念是模块化、抽象、信息隐藏、局部化的直接结果。追求高内聚低耦合。
耦合:
耦合是一个软件结构内部不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。
耦合的分类:
数据耦合、标记耦合、控制耦合、公共耦合、内容耦合,从左至右,耦合性越来越高,功能独立性越来越低。
HIPO图
层次图和层次方框图相同,但是表现的内容不一样,层次图中的每一个矩形都代表一个模块,方框间的连线表示的是调用关系而不是像层次方框图表示的那样是组成关系。
面向数据流的设计方法
通常所说的结构化设计方法(SD方法),也就是基于数据流的设计方法。
面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。
面向数据流设计的三要素:交换流、事务流、设计过程。
结构程序设计
三种基本控制结构:顺序、选择、循环。
程序流程图
又称程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法。
盒图
特点:
(1)功能域明确(即一个特定控制结构的作用域),可以从合图上一眼就看出来。
(2)不可能任意转移控制
(3)很容易确定局部和全部数据的作用域。
(4)很容易表现嵌套关系,也可以表示模块的层次结构。
PAD图
问题分析图,事务处理过程说明 ,P126
判定表
一张判定表由4部分组成,左上部列出了所有条件,左下是所有可能做的动作,右上是表示各种条件组合的一个矩阵,右下是和每种条件组合相对应的动作。例子参考P128。
过程设计语言(PDL)
过程设计语言(PDL)也称伪码,是一个笼统的名称,现在有不同的过程设计语言在使用,它是用正文形式表示数据和处理过程的设计工具。
Jackson图
Jackson图实际上就是层次方框图的一种精化。虽然Jackson图和描绘软件结构的层次图相当类似但含义不同,层次图中的每一个方框都代表一个模块;而Jackson图即使在描绘程序结构的时候,一个方框也并不代表一个模块,,通常一个方框只代表几个语句,层次图表现的是调用关系,而Jackson图表示的是组成关系。
软件测试基础
为什么要有软件测试?
就是找程序中的错。
软件测试的目标:
(1)测试是为了发现程序中的错误而执行的过程
(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
(3)成功的测试是发现了至今为止尚未发现的错误的测试
测试方法
1、黑盒测试:
黑盒测试也称功能测试,它着眼于程序的外部特征,而不考虑程序的内部逻辑结构。测试者把测试程序看成一个黑盒,不用关心程序的内部结构,黑盒测试是在程序接口处进行测试,它只检查程序功能是否按照规格说明书的规定正确使用,程序是否能适当的接收输入数据产生正确的输出信息,并且保持外部信息的完整性。
2、白盒测试:
与黑盒测试相反,它的前提是可以把程序看成一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否按照预定要求正确工作,白盒测试又称为结构测试。
测试步骤:
单元测试
单元测试集中检测软件设计的最小单元——模块。
测试重点:
集成测试
集成测试是测试和组装的系统化技术,由模块组装成程序有两种方法:
白盒测试
逻辑覆盖:
所谓逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试。
1、语句覆盖
为了暴露程序中的错误,至少每个语句应该执行一次。语句覆盖的含义是:选择足够多的测试数据,使被测试程序中每个语句至少执行一次。
2、路径覆盖
选取足够多的数据,使程序中的每条路径都至少执行一次(如果有环,则要求每个环至少经过一次)
黑盒测试 P171
等价划分
等价划分是一种黑盒测试技术,这种技术把程序的输入域划分成若干个数据类,据此导出测试用例。
边界值分析:
使用边界值分析方法设计测试方案应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。
软件维护就是在软件已经交付给使用方后,为了改正错误或满足新的需要而修改软件的过程。可以通过交付使用后可能进行的4项活动,具体的定义软件维护:(1)完善性维护(2)改正性维护(3)适应性维护(4)其他维护
面向对象的概念
对象:在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。
对象的特点:
类:对具有相同数据和相同操作的一组相似对象的定义,也就是说,类是对具有相同属性和行为的一个或多个对象的描述。
实例:实例是由某个特定的类所描述的一个具体的对象
消息:要求某个对象执行在定义它的那个类中所定义的某个操作的说明
方法:对象所能执行的操作,也就是类中所定义的服务
属性:属性就是类中所定义的收据,它是对客观世界实体所具有的的性质的抽象
封装:把客观事务抽象成封装的类,并且类可以让自己可信的类或者对象操作,而对自己不可信的类或对象隐藏。
继承:继承是能够直接获得已有的性质和特征,而不必重复定义他们。
面向对象建模
按所解决的问题划分:
对象模型(静态结构)
动态模型(交互次序)
功能模型(数据变换)