华工软件工程重点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华工电信软件工程重点——自整理
12电联班
第一章
软件危机
定义:指在计算机软件的开发和维护过程中遇到的一些列严重问题。
落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发和维护过程中出现的一些列严重问题。
包含两个问题:
1、如何开发软件,以满足对软件日益增长的需求
2、如何维护数量不断增加的已有软件
典型表现:
1、对软件开发成本和进度的估计不准确
2、用户常对已完成的软件不满意
3、软件的质量不达标
4、软件通常难以维护
5、软件通常没有适当的文档资料
6、软件成本比例逐年上升
7、软件开发生产率提高的速率远远不能满足社会对软件产品日益增长的需求
产生原因:
客观:1、软件缺乏可见性,管理和控制过程很难
2、软件较难维护
3、软件规模大,复杂性随规模增加呈指数上升
主观:错误的认识和做法
1、忽视软件需求分析的重要性(对用户没有完整正确的认识,急于求成、仓促上阵)
2、认为软件开发就是写程序(其实写程序只占10~20%工作量,软件配置包括程序、文档、数据)
3、(最大错误)轻视软件维护(维护费用占软件总费用55%~70%)
软件工程(包括技术和管理)
定义:是指导计算机软件开发和维护的一门工程学科
采用工程的概念、原理、技术、方法来开发和维护软件,把经过实践考验而证明正确的管理技术和当前能得到的最好的技术结合,经济地开发高质量的软件并维护之。
本质特性:
1、关注大型程序的构造
2、中心课题是控制复杂性
3、产品交付使用后仍需要经常修改
4、开发效率很重要
5、和谐地合作是关键
6、软件必须有效支持用户
7、软件工程领域中通常由具有一种文化背景的人替另一种文化背景的人开发产品
软件工程方法学
3要素:方法、工具、过程
2个方法学
传统方法学(生命周期方法学or结构化范型)——自顶向下顺序完成
特点:
把软件生命周期的全过程依次划分为若干阶段,然后顺序地完成每个阶段的任务。
每一个阶段的开始和结束都有严格标准。
前一个阶段完成是开发下一个阶段的前提和基础,完成后一阶段使前一段提出的解法更加具体。
每个阶段结束前要从技术和管理两方面对开发成果进行检查(技术审查和管理复审)。
优点:
1、各阶段独立,便于分工协作,降低了整体开发难度。
2、每个阶段结束前都严格审查,保证质量,提供可维护性(但仍然很困难)。
3、提高软件开发成功率、生产率。
面向对象方法学——主动多次反复迭代的过程
把数据和行为看成同等重要的,以数据为主线,把数据和操作紧密结合的方法。
4要点:
1、把对象(object)作为融合了数据及在数据上的行为的统一的软件构件。
2、把对象划分成类(class)。
3、按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。
(继承)
4、对象彼此间仅能通过发送消息互相联系。
(封装性)
优点:
1、多数对象与实体相对应,提高软件的可理解性,降低复杂性,简化开发和维护
2、对象是相对独立的实体,可重复使用,故促进了软件重用
3、继承性和多态性,促进软件重用
软件生命周期(三时期、八阶段)
定义:软件生成直到报废的生命周期。
1、软件定义时期
任务:确定工程的总目标、可行性、实现目标应采用的策略、系统必须完成的功能、估计资源和成本、制定工程进度表。
分为3个阶段:问题定义、可行性研究、需求分析
2、软件开发时期
任务:具体设计和实现软件。
分为4个阶段:系统设计(总体设计、详细设计)、系统实现(编码与单元测试、综合测试)3、软件维护时期
任务:使软件持久地满足用户的需要。
阶段:软件维护
各阶段任务:
1、问题定义:回答要解决的问题是什么
2、可行性研究:阶段1定义的问题有行得通的解决办法吗
用最小代价在最短时间内确定问题能否被解决
3、需求分析:确定为了解决这个问题,目标系统要做什么,目标系统要具备什么功能
4、总体设计(概要设计):概况地说。
怎样实现目标系统。
设计程序的体系结构。
5、详细设计(模块设计):把解法具体化,如何具体地实现系统。
详细设计每个模块,给出
算法和数据结构。
6、编码和单元测试(实现):写出正确易懂易维护的程序模块。
编码要把软件设计结果翻译成某种程序设计语言书写的程序。
测试时为了找出错误以纠正它。
7、综合测试:通过各种类型的测试使软件达到预定要求
8、软件维护:通过各种维护活动使系统持久地满足用户需求。
(改正性、适应性、完善性、预防性)
软件过程
定义:是为了获得高质量的软件产品所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
8种典型模型:
1、瀑布模型
优势:规范的、文档驱动的方法
缺点:最终开发的产品可能不是用户需要的
2、快速原型模型
客服瀑布模型的缺点,通过快速构建起一个可再计算机上运行的原型系统,让用户使用原型并收集反馈意见,获取真正需求
3、增量模型
优点:开发早期使投资获得明显回报,容易维护
缺点:要求软件具有开发的结构
4、螺旋模型
使用原型来降低风险,是风险驱动的。
只有开发人员具备风险分析和排斥能力时才成功
5、喷泉模型
6、Rational统一过程
7、敏捷过程与极限编程
8、微软过程
第二章
可行性研究
目的:用最小的代价在尽可能短的时间内确定问题是否能解决
从三方面研究每种解法的可行性:
1、技术可行性:使用现有的技术能实现这个系统吗
2、经济可行性:这个系统的经济效益大于开发成本吗
3、操作可行性:系统的操作方式在这个用户组织内行得通吗
数据流图(DFD)
基本符号:
正方形(立方体):数据的源点或终点
圆角矩形(圆):变换数据的处理
开口矩形(平行线):数据存储
箭头:数据流,数据的流动方向
成本、效益分析
1、货币的时间价值n年后可获得的钱F = P(1+i)^n
n年后的钱在现在的价值P = F / (1+i)^n
2、投资回收期1~N 年后累计节省的钱换算到现在的价值等于现在投入的成本时的N值
3、纯收入累计经济效益(折合到现在的值)与现在投资之差,N等于开发生命周期
4、投资回收率满足方程P = F1/(1+j) + F2/(1+j)^2 + ……+Fn/(1+j)^n (n给定)的j
第三章需求分析
需求分析
基本任务:准确回答“系统必须做什么”的问题。
(系统要实现什么功能)。
对目标系统提出完整、准确、清晰、具体的要求。
需求分析应满足4大准则:
1、必须理解并描述问题的信息域,该建立数据模型(实体联系图)
2、必须定义软件应完成的功能,要求建立功能模型
3、必须描述作为外部事件结果的软件行为,要求建立行为模型(状态转换图)
4、必须对描述信息、功能、行为的模型进行分解,用层次的方式展示细节
实体-联系图——ER图(用于描述数据模型)
数据模型:包含数据对象,数据对象的属性及数据对象彼此间相互连接的关系。
反映了用户的现实环境,与在软件系统中的实现方法无关。
数据对象:复合信息的抽象,具有一系列不同性质或属性的事物。
单值事物不是对象(如宽度)。
数据对象只封装了数据,没有操作,与“类”和“对象”不同。
属性:数据对象的性质
联系:数据对象间彼此相互连接的方式。
1、一对一联系(1:1)
2、一对多联系(1:n)
3、多对多联系(M:N)
联系也有属性。
实体-联系图ER图的符号
矩形框:实体(数据对象)
菱形框(连接相关实体):联系
椭圆形(或圆角矩形):实体或联系的属性
用直线把实体或关系和其属性连接起来。
上面标明联系方式。
注意:
1、一些属性如果与两个实体都有关系,那一般作为两个实体之间的联系的属性。
2、联系一般是动作,比如学生和课程之间的“学”,储户和银行之间的“存取款”。
状态转换图
(第三条准则:必须描述作为外部事件结果的软件行为,要求建立行为模型)
通过描绘系统的状态和引起状态转换的事件来表示系统的行为。
状态:系统的行为模式。
规定了系统对事件的响应方式可以是:
1、一个(系列)动作
2、系统本身状态改变
3、一个动作+状态改变。
分类:初态、终态,中间状态。
一个状态图只能有一个初态,可以有任意个终态。
可以循环运行,也可以单程。
事件:引起系统做动作或转换状态的控制信息。
实心圆:初态(可能没有)
同心圆(内圆为实心圆):终态(可能没有)
圆角矩形:中间状态
上:状态名(必须)
中:状态变量名和值(非必须)
下:活动表(非必须)
活动表语法:do或entry或exit / 动作表达式
箭头:上面标出触发状态转换的事件表达式(若不标表示上一状态活动执行完后自动跳转)。
事件表达式语法:事件名(参数表)【守卫条件】/ 动作表达式
第五章总体设计
设计原理
模块化
模块的定义:由边界元素限定的相邻程序元素(数据说明、可执行语句)的序列,而且有一个总体标识符代表它。
过程、函数、子程序、宏、对象、对象内的方法都可以作为模块。
模块是构成程序的基本构件。
模块化的定义:把程序划分成独立命名且可以独立访问的模块,每个模块完成一个子功能。
把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
两个不等式和模块化与软件成本关系图
复杂度:C(P1+P2) >C(P1) + C(P2)
一个问题的复杂度大于它的分解部分的复杂度之和
解决问题需要的工作量:E(P1+P2) >E(P1) + E(P2)
复杂的问题分解成许多容易解决的小问题,原来的问题就容易解决了。
成本和模块数目的关系:
1、模块数越多,接口成本越大
2、模块数越多,每个模块的成本越低
总成本曲线是凹的,有一个最低成本区间。
模块化的优点:
1、使软件结构清晰,容易设计、阅读和理解
2、使软件容易测试和调试,提高软件可靠性,因为错误常出现在有关的模块及接口中
3、提高软件的可修改性,因为变动常只涉及少数模块
4、有利于软件开发工程的组织管理,因为复杂大型的程序可以有许多程序员分工编写抽象
定义:把事物、状态、过程之间相似的方面(本质特性)集中概括起来,暂时忽略它们之间的差异。
处理复杂系统唯一有效的方法是用层次的方法构造和分析它。
考虑模块化解法时,可以提出许多抽象的层次。
最高层概括叙述问题的解法,中层层采用过程化方法,面向问题+面向实现的术语叙述解法,底层用直接实现的方式叙述解法。
软件工程的每一步都是对软件解法的抽象层次的一次精化。
逐步求精(自顶向下)
定义:为了能集中精力解决主要问题而尽量推迟对细节的考虑。
可以看做是一项把一个时期内必须解决的种种问题按优先级排序的技术。
每个问题都将在适当的时候解决。
求精实际上是细化过程。
抽象与求精是一对互补的概念。
抽象忽略多余的细节,强调相关的细节,实现逐步求精。
求精逐步揭示底层细节。
信息隐藏
应该这样设计模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。
应该隐藏的不是有关模块的一切信息,要隐藏实现细节。
隐藏意味着有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块彼此间仅交换必要的信息。
优点:
绝大多数数据和过程对于软件其他部分而言是隐藏的,那么在修改期间引入的错误就很难传播到其他部分。
模块独立(性)
实现:开发具有独立功能且和其他模块间没过多相互作用的模块。
独立性很重要的理由:
1、有效模块化的软件容易开发。
(因为能分割功能,简化接口,多人分工)
2、独立的模块容易测试和维护。
(因为修改时工作量小,错误传播范围小)
衡量模块独立程度的标准:(希望高内聚,低耦合)
1、耦合:衡量不同模块间连接的紧密程度。
耦合类型:
数据耦合:两个模块间只传递数据信息。
低耦合。
系统必须有。
控制耦合:两个模块间传递的有控制信息。
中等耦合。
往往是多余的,可分解成数据耦合。
特征耦合:把整个数据结构作为参数传递,但被调用的模块只需要其中一部分数据元素。
公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。
松散的耦合:一个模块往环境送数据,另一个取数据。
紧密的耦合:两个模块既送又取。
内容耦合:最高程度的耦合。
要坚决避免。
一个模块访问另一个模块内部数据。
一个模块不通过正常入口转到另一模块内部。
两个模块部分代码重叠(只有汇编有)
一个模块有多个入口(一个模块有多重功能)
满足一个则为内容耦合。
设计原则:
尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合
2、内聚:衡量一个模块内各元素彼此结合的紧密程度。
低内聚:
偶然内聚:一个模块完成几个任务,这些任务的关系非常松散
逻辑内聚:一个模块完成几个任务在逻辑上属于同一类
时间内聚:一个模块包含的任务必须在同一时间内执行
中内聚:
过程内聚:一个模块内的处理元素相关,且必须以特定次序执行。
通信内聚:一个模块内所有元素都使用同一个输入或产生同一个输出。
高内聚:
顺序内聚:一个模块内的处理元素和同一个功能密切相关,且必须顺序执行(前一个的输出为后一个的输入)
功能内聚:一个模块内所有处理元素属于一个整体,完成单一功能。
是最高程度内聚。
启发式规则
1、改进软件结构,提高模块独立性
设计成软件的初步结构后,审查分析该结构,通过模块分解和合并,降低耦合提高内聚。
2、模块规模要适中
3、深度、宽度、扇出、扇入要适当
深度:软件结构中控制的层数。
宽度:软件结构在同一个层次上模块总数的最大值。
越大系统越复杂。
扇出:一个模块直接控制的模块数(好的平均3~4,顶层高扇出,中层较少)。
对宽度影响大。
不能太大,不能太小。
扇入:有多少个上级模块直接调用它。
(好的底层高扇入)。
越大越好。
4、模块作用域应该在控制域之内
5、力争降低模块接口的复杂度
6、设计单入口单出口的模块
7、模块功能应可以预测
结构图
方框:模块。
框内注明模块名或主要功能。
直线:模块的调用关系。
(习惯上方模块调用下方模块)
带注释的箭头:调用过程中来回传递的信息。
尾部空心圆表示传数据,实心圆表示控制信息。
判断调用
循环调用
第六章详细设计
程序流程图(程序框图)
符号:起始框,结束框,执行框,判断框,箭头
结构:顺序结构、IF_THEN_ELSE型选择结构、DO_WHILE型循环结构、DO_UNTIL型循环结构、CASE多分支结构
优点:对控制流程的描绘很直观
缺点:
1、不是逐步求精的好工具,不考虑程序的全局结构
2、用箭头代表控制流,程序员可以不顾结构程序设计的精神,随意转移控制
判定表(适用于算法中包含多重嵌套的调节选择时)
组成:
左上部:列出所有条件
右上部:各种条件组合的一个矩阵
左下部:所有可能的动作
右下部:右上部每种条件组合对应的动作
优点:
1、清晰地表示复杂的条件组合与应做的动作之间的对应关系
2、简洁而无歧义地描述处理规则
缺点:不算非常直观,不适用于数据元素的值多于两个的情况。
判定树(判定表的变种)
优点:形式简单到不需要任何说明,一眼能看出含义,易于掌握和使用。
缺点:简洁性不如判定表,数据元素重复出现。
第七章实现
编码和测试统称实现(软件实现时期包括了编码与单元测试、综合测试阶段)
编码:把软件设计结果翻译成用某种程序设计语言书写的程序。
软件测试
阶段1:单元测试,与编码同属于软件生命周期的同一阶段
阶段2:综合测试
软件测试基准
软件测试的目标
1、测试使为了发现程序中的错误而执行的程序
2、好的测试方案是极可能发现至今尚未发现的错误的测试方案
3、成功的测试是发现了至今尚未发现的错误的测试
应由编程者以外的人来完成测试工作。
测试决不能证明程序是正确的。
软件测试的方法
黑盒测试(功能测试):把程序看作黑盒子,完全不考虑程序的内部结构和处理过程,在接口进行的测试。
白盒测试(结构测试):把程序看成装在透明的白盒子里,完全知道程序的结构和处理算法,按照程序内部的逻辑来测试程序,检测程序中的主要执行通路是否正确工作。
白盒测试在测试过程的早期阶段进行,黑盒测试在后期进行。
单元测试(与编码属于同一阶段,集中检测对象:模块)
主要使用白盒测试技术。
测试可以对多个模块并行进行。
测试重点:
1、模块接口:用数据流。
检测参数的数目、次序、属性或单位系统与变元是否一致;是否
修改了只作输入用的变元;全局变量是否保持一致。
2、局部数据结构
3、重要的执行通路
4、出错处理通路
5、边界条件
集成测试(测试与组装)
集成测试是测试和组装软件的系统化技术。
由模块组装成程序时有两种方法
1、非渐增式测试(一步到位)
分别测试每个模块,再把所有模块结合成所要的程序。
把整个程序作为一个整体来测试。
纠正一个错误,又出现新的错误。
2、渐增式测试(多用)
把程序划分成小段来测试。
比较容易定位和纠正错误,对接口能进行更彻底的测试,可以使用系统化测试方法。
自顶向下集成
从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。
深度优先策略:先组装一条主控制通路上的所有模块。
选择哪一条,随机。
宽度优先策略:沿软件结构水平移动,组装同一个控制层次上所有模块。
具体过程:
1、测试主控模块,存根程序代替直接附属的模块
2、根据选的策略,每次用一个实际模块代替一个存根,同时测试
3、为了保证引入模块没有引入错误,回归测试
优点:能够在测试的早期对主要的控制或关键的抉择进行检验(早期发现上层模块的错误)。
如果用深度优先的结合方法,能在早期实现并验证一个完整功能。
不需要测试驱动程序。
缺点:
底层关键模块中错误发现晚。
需要存根程序。
实际使用时可能遇到逻辑上的问题。
为了测试系统的高层次,需要低层次的处理。
解决方法:
1、把测试推迟。
2、自底向上
自底向上集成
从原子模块开始组装和测试。
总能得到所需的下层模块处理功能,不需要存根程序,但需要测试驱动程序。
具体过程。
回归测试
定义:在集成测试的范畴中,指重新执行已经做过的测试的某个子集,以保证上述变化没有带来非预期的副作用。
使用自动化的捕获回放工具自动进行。
回归测试集测试用例:
1、检测软件全部功能的代表性测试用例
2、专门针对可能受修改影响的软件功能的附加测试
3、针对被修改过的软件成分的测试。
应该设计成只包括可检测程序的每个主要功能的一类或多类错误用例。
Alpha和Beta测试
当一个软件是为许多用户开发的时候,用来发现只有最终用户才能发现的错误。
Alpha测试:用户在开发者的场所,受开发者指导进行。
是在受控环境中进行的。
开发者记录错误和问题。
Beta测试:开发者不在测试现场,测试环境不受开发者控制。
用户反馈问题,开发者修改。
白盒测试技术
逻辑覆盖:一系列测试过程的总称,这组过程逐渐进行越来越完整的通路测试。
用一组输入来测试某个流程,这组输入能达到的覆盖程度就是覆盖标准
逻辑覆盖标准:(测试数据的选取问题)
1、语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次。
特点:很弱的逻辑覆盖标准。
对程序的逻辑覆盖很少,只关心判定表达式的值而不分别测试判定表达式中每个条件取不同值的情况。
2、判定覆盖(分支覆盖):不仅每个语句必须至少执行一次,而且每个判定的每个分支都至少执行一次。
3、条件覆盖:不仅每个语句至少执行一次,而且让判定表达式中的每个条件都取到各种可能的结果。
4、判定/条件覆盖:两者结合。
5、条件组合覆盖:要求取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。
6、点覆盖
7、边覆盖
8、路径覆盖
控制结构测试
基本路经测试
条件测试
循环测试
黑盒测试技术
等价划分
把程序的输入域划分成若干个数据类。
等价划分是要减少必须设计的测试用例的数目。
边界值分析
调试
和测试的关系:总在测试之后,和测试交替进行
方法:蛮干法回溯法原因排除法
软件可靠性
定义:程序在给定的时间间隔内,按照规格说明书的规定成功运行的概率。
软件可用性
定义:程序在给定的时间点,按照规格说明书的规定成功运行的概率。
区别:时间段和时刻
第八章维护
软件维护
软件维护的定义:在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
4项活动:
1、改正性维护:诊断和改正错误的过程。
2、适应性维护:为了和变化的环境相适应而修改软件。
3、完善性维护:满足用户提出的增加新功能或修改已有功能的改进意见。
4、预防性维护:为了改进未来的可维护性和可靠性,给未来的改进奠定基础而修改软件。
软件的可维护性
决定软件的可维护性的因素
1、可理解性:外人理解软件的结构、功能、接口、内部细节的难度
2、可测试性:
3、可修改性:耦合、内聚、信息隐藏影响可修改性
4、可移植性:程序转移计算环境的难度
5、可重用性:不加修改即可在不同环境中多次使用
预防性维护
维护旧软件时,对程序全部重新设计、编码、测试。
把今天的方法运用到昨天的系统,以支持明天的需求。
第九章面向对象方法学引论
面向对象方法
4个要点:
1、认为客观世界是由各种对象组成,任何事物都是对象,复杂的对象可以由简单的对象以某种方式组合而成。
2、把所有对象都划分成各种类,每个类定义了一组数据和一组方法。
3、按照子类(派生类)与父类(基类)的关系,把若干个对象类组成一个层次结构的系统(类等级)。
4、对象彼此之间仅通过传递消息互相联系。
OO = objects + classes + inheritance +communication with messages
面向对象就是既使用对象又使用类和继承的机制,且对象之间仅能通过传递消息实现通信。
面向对象方法学的优点:
1、与人类习惯的思维方法一致
2、容易开发大型产品
3、稳定性好
4、可重用性好
5、可维护性好
面向对象的概念
对象
对象的形象表示
对象的定义
定义1:对象是具有相同状态的一组操作的集合
定义2:对象是对问题域中某个东西的抽象,该抽象反映了系统保存有关这个东西的信息或与之交互的能力。
(是对属性值和操作的封装)
定义3:对象::= < ID,MS,DS,MI>
ID:对象名MS:操作集合DS:数据结构MI:对外接口
总之,对象是封装了数据结构以及可以施加在这些数据结构上的操作的封装体
对象的特点
1、以数据为中心,围绕数据设置操作
2、对象是主动的,对象是进行处理的主体
3、实现了数据封装,黑盒子
4、本质上具有并行性
5、模块独立性好,由于以数据为中心所以内聚强,由于数据封装所以耦合松。