奥林匹克资料:
软件工程:
是指导计算机软件开发和维护的工程学科。 运用工程的概念、原理、技术和方法开发和维护软件,将经过时间考验被证明是正确的管理技术和目前可以得到的最好的技术方法相结合,经济高效地开发和维护高质量的软件,这就是软件工程本质特性:
1 )软件工程关注大型程序的结构
2 )软件工程的中心任务是控制复杂性
3 )软件总是不断变化的
4 )软件开发的效率非常重要
5 )和谐合作是软件开发的关键
6 )软件必须有效支持用户
7 )在软件工程领域,通常由一个文化背景的人为另一个文化背景的人制作产品。
软件工程的基本原理
1 )严格按阶段性生命周期计划管理
2 )继续阶段评审
3 )实行严格的产品管理
4 )采用现代编程技术
5 )结果应能明确审查
6 )开发团队人员应该很少,很精干
7 )承认不断改进软件工程实践的必要性
软件工程方法论
在软件生命周期的整个过程中使用的一组技术方法称为方法论。
软件工程方法学,三要素:方法、工具、过程。
1 )传统方法论
2 )面向对象方法论
3 .软件生命周期:定义、开发和维护
问题的定义
可行性研究
需求分析
总体设计
详细设计
编码和单元测试
综合测试
软件维护
4 .软件过程:为了获得完成高质量软件所需的一套任务框架,规定了完成各项任务的工作程序。 通常使用生命周期模型简洁地描述软件过程。
瀑布模型
1 )各阶段的顺序性和依赖性
2 )划分逻辑设计和物理设计,尽量延缓程序的物理实现
3 )每一阶段都要完成规定文件,通过复审尽早发现其中的问题,尽早解决。
快速恢复模型
增量模型
从部分需求出发,首先建立不完备的系统,通过对该系统的测试运行获得经验和信息反馈,加深对软件需求的理解,进一步扩展和完善系统。 重复此操作,直到软件人员和用户对设计的软件系统满意为止。
渐进式开发下的软件是随着软件开发的过程而逐渐形成的。
渐进开发方法适合知识型软件的开发,设计系统时对用户需求的认识一开始并不清晰,需要在开发过程中不断认识,不断获取新知识来丰富和完善系统。 许多研究性考试软件一般都采用这种方法。
)4)螺旋模型
)5)喷泉模型
(6) Rational统一流程
)7)敏捷过程与极限编程
(8)微软进程
喷泉模型
Rational统一过程
敏捷过程与极限编程
微软流程
可行性研究
可行性研究的目的是用最小的成本判断能否在尽可能短的时间内解决问题。
问题定义任务:确定将用户要求具体化、量化的研发系统范围,明确研发边界。
问题定义阶段的工作:
1 )通过调查研究,了解系统需求
2 )确定系统的功能需求、性能需求、可靠性需求、安全和保密性、资源、开发费用和开发
进度等需求;
3 )问题定义阶段的产品-系统目标和范围说明书。
1 .可行性研究的任务
技术可行性
经济可行性
可操作性
2 .可行性研究过程
确认系统的规模和目标
研究现在正在使用的系统
导出新系统的高级逻辑模型
进一步定义问题
推导和评估供选择的解法
推荐行动方针
制定开发计划
编写文件并提交评论
3 .系统流程图
系统流程图是说明物理系统的传统工具。 其基本思想是用图形符号以黑盒子的形式描绘系统中的所有零件。 系统流程图表示部件的信息流,并不表示加工处理信息的控制过程。
4 .数据流图
DFD是一种以图形方式表示信息流和数据从输入到输出的过程中如何转换的技术。 与程序流程图不同,DFD不表示程序的控制结构,而是将只记述了数据流的DFD分为多层来表示,并逐步展开数据流和功能的详细内容。
创建数据流图的步骤
确定开发系统的外部项目,即系统的数据源和位置。
确定整个系统的输出数据流和输入数据流,并在系统加工环节绘制关联图。
确定系统的主要信息处理功能,从而将整个系统分解为几个加工环节,确定各加工的输出和输入数据流以及这些加工相关的数据存储。
本着自上而下、逐层分解的原则,对上层图的全部或部分加工环节进行分解。
重复该步骤直到逐步分解结束。
对图进行检查和合理配置,主要检查分解是否恰当、彻底,DFD各层有无渗漏、盛夏、碰撞处,各层DFD与同层DFD的关系是否获得及命名,编号是否恰当、合理等,避免出现错误和不当
与用户沟通,在用户完全理解数据报内容的基础上征求用户意见。
注意事项:
不要将控制流作为数据流
请勿显示激励条件
数据流必须从某个加工流出或流入某个加工,不能从外部项目直接流出到数据存储。
5 .数据词典
数据字典是有关数据的信息集合,是数据流图中所有元素的定义集合。
数据词典的内容
数据流、数据流成分、数据存储、处理
数据字典定义了数据流图中出现的所有名称。 数据字典条目由三个类别组成:数据流、数据项、文件项和加工项。
如何定义数据
:连接两个分量=:等于[] :用或|分隔分量{ } :重复大括号中的分量。 {字母或数字}7表示8位字符串o。 可以指定选项,即有无
数据词典的用途
数据词典的实现
6 .成本/效益分析
成本估算
1 )代码行技术
2 )任务分解技术
3 )成本自动估算技术
成本/利润分析方法
1 )货币的时间价值F=Pn次方
2 )投资回收期
3 )纯收入
4 )投资回收率
需求分析
1 )需求分析目的:
在可行性分析研究阶段,大致说明了用户的需求,也提出了一些可行的方案。 然而,许多细节被忽略,在最终的目标系统中不能忽略或忽略小细节。 因此,可行性研究不能代替需求分析。 需求分析的任务还不是确定系统如何完成其工作,而只是确定系统需要完成哪些工作,即对目标提出完整、准确、清晰、具体的要求。
通过需求分析,明确用户对目标软件系统在功能、性能、行为、设计约束等方面的期望,并回答软件系统“必须做什么”。
开发者要准确理解用户的要求,进行细致的调查分析,讲述用户形式的需求陈述转化为完整的需求定义,从需求定义转化为相应的需求规格说明的过程。
2 )需求分析方法:
需求分析方法由软件数据域和功能域的系统分析过程及其表示方式组成,定义了表示系统逻辑视图和物理视图的方式。 大多数需求分析方法都是数据驱动的。 总之,这些方法提供了表示数据域的机制,分析师根据该表示来确定软件的功能和特性,最终构建开发对象软件的抽象模型,即目标系统的逻辑模型。
2 .需求分析任务
识别问题、分析问题、导出综合的软件逻辑模型、创建文档的基本任务是“系统必须做什么? ”正确地回答。 这个问题。 需求分析的工作是深入描述软件的协同功能和性能,确定软件设计的限制和软件与其他系统元件连接的细节,定义软件的其他有效性需求。 需求分析的任务不是决定系统如何完成其工作,而是决定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。 其实现步骤如下
如图所示:
确定对系统的综合要求
系统功能要求
系统性能要求
可靠性和可用性需求、
错误处理需求
接口要求、
约束
逆需求
将来可能提出的需求
)2)分析系统数据需求
在理解当前系统“怎么做”的基础上,提取其“做什么”的本质,明确对象系统“做什么”,即可导出系统的详细逻辑模型。 具体方法:首先,确定目标系统与当前系统的逻辑差异; 而且,将变化部分看作新的处理步骤,调整功能图(一般为数据流图)和对象图; 最后对外和内分析变化部分,估计其结构,得到目标系统的逻辑模型。
该逻辑模型通常用数据流图、数字词典和主要处理算法描述。
分析系统数据通常需要采用建立数据模型的方法,经常使用图形工具来帮助绘制数据结
构建。
导出系统的逻辑模型
修改系统开发计划
3 .如何与用户沟通以获得需求
(1)采访
官方访谈、问卷调查和情景分析
面向数据流,自上而下竭尽全力
结构化分析:使用数据流图、数据字典、结构化英语、判定表、判定树等工具创建新的目标文档-要求规范,称为结构化说明书。 结构化分析法是面向数据流的顶层分阶段进行需求分析的方法,将数据流和数据存储定义到要素层面
)3)简易的应用规格说明技术
)4)快速建立软件原型
4 .分析建模和规格说明
(1)分析建模
数据模型( ER图)、功能模型(描绘了数据在软件系统内移动时被转换逻辑过程的数据模型)、表示系统所具有的转换数据的功能的行为模型)、表示作为外部事件结果的系统的动作的状态图) )
)2)软件要求规格书
为了解决用自然语言编写的软件需求规格书可能存在的不一致、模糊、模棱两可、不完备、抽象层次混乱等问题,采用形式化的方法描述用户对软件系统的需求。
5 .实体联系图(数据对象与数据对象的关系) ) ) ) ) ) ) ) ) ) )。
(1)数据对象
一系列不同性质或属性的事务
)2)属性
数据对象的性质
(3)联系
数据对象相互连接方法也称为\”连接\”、\”关系\”
6 .数据规范化
为了减少数据冗余,避免插入和删除异常,并简化修改数据的过程,通常需要对数据结构进行规范化。
第一范式
第二范式
第三范式
7 .状态转换图
通过描绘系统的状态和引起系统状态转移的事件来表示系统的行为。 状态图还说明了系统作为特定事件结果而执行的操作。
状态
活动
符号
8 .其他图示
层次框图:用树形结构的一系列多层次矩形描绘数据的层次结构。
wanrnier图IPO图:输入、处理、输出图的简称。
9 .软件要求验证:
需求分析阶段的工作结果是软件系统开发的重要基础,大量统计数字表明软件系统15%的错误来源于错误的需求。 为了提高软件质量,成功地进行软件开发,降低软件开发成本,在对目标系统提出一系列要求后,必须严格验证这些要求的正确性。
需要从以下四个方面进行验证:
1 )一致性所有需求必须一致,任何一个需求不得与其他需求相矛盾。
2 )完整性要求必须完整,规范应包括用户所需的所有功能或性能。
3 )现实中指定的需求应该可以通过现有的硬件技术和软件技术基本实现。 对于硬件技术的进步是可以预测的,但是对于软件技术的进步很难预测,只能从现有的技术水平来判断需求的现实性。
4 )有效性必须证明需求正确有效,能够切实解决用户面临的问题。
如何验证软件要求
用于需求分析的软件工具RSL PSL/PSA
形式化说明技术
用自然语言描述要求规格说明是典型的非形式化方法。 用数据流图或实体-关联图建立模型是典型的半形式化方法。 形式化方法是一种描述系统性质的基于数学的技术,也就是说,只要一种方法有坚实的数学基础,它就是形式化。
1 .概要
非形式化方法的缺点:用自然语言写的系统规格书可能存在矛盾、二义性、模糊性、不完备性、抽象层次混乱等问题。
形式化方法的优点
应用形式化方法的指导原则
2 .有穷状态机
当前状态事件谓词下一个状态
3.Petri网4. Z语言
形式化规格的说明可以用数学方法研究、验证。 另外,形式化的规范说明消除了二义性,通过鼓励软件开发者在软件工程过程的初期阶段使用更严格的方法,可以减少错误。
当然,形式化方法也有缺点。 形式化的规格说明大多主要关注系统的功能和数据,但问题在时序、控制和行为等方面的需求更难表达。 此外,形式化方法比形式化方法不足更难学习,不仅在训练阶段需要大量投资,而且对一些软件工程师来说还表现出“文化冲击”。
总体设计
总体设计的基本目的是“概括地说,系统应该如何实现? ”的回答。 由于这个问题,总体设计也称为概要设计或初步设计。
总体设计过程的两个主要阶段:
在系统设计阶段,确定系统的具体实现方案
结构设计阶段,软件结构决策
1 .设计流程
考虑选择的计划
选择合理的方案
最佳做法推荐
功能分解
软件结构的设计
数据库的设计
制定测试计划
文件编制:系统说明、用户手册、测试计划、详细实现计划、数据库设计结果;
审查和复审
2 .设计原理
模块化
将程序划分为具有独立名称的独立可访问模块,每个模块完成一个子功能,将这些模块集合在一起组成整体,指定的功能可以满足用户的需求。 把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。 模块化与软件成本的关系:根据总成本曲线,各程序具有相应的最优模块数m,使系统的开发成本最小。
抽象化
提取事务的本质特性,暂时不考虑这些细节
循序渐进
信息隐藏与局部化
包含在模块中的信息,不允许将不需要这些信息的其他模块调用信息局部化:物理上拉近关系密切的软件要素
模块独立
软件系统中的每个模块只处理软件请求的具体子功能,与软件系统中其他模块的接口简单。 模块独立概念是模块化、抽象、信息陷阱、局部化概念的直接结果。
1 )联轴器
也称为区块之间的联系。 表示软件系统结构中各模块之间相互关系密切程度的度量。 模块之间的联系越强,其耦合性就越强,模块的独立性就越差。 模块间耦合的高低取决于模块间接口的杂乱性、调用的方式以及所传递的信息。
数据联接:通过参数在两个模块之间交换信息,如果交换的信息只是数据。
控制耦合:模块传递的信息中有控制信息,称为控制耦合。
特征结合:为了将整个数据结构作为参数传递而被调用的模块,只需要使用其一部分的数据要素即可。
公共耦合:当一组模块通过同一公共数据环境相互作用时,它们之间的耦合称为公共耦合。
内容合并:如果出现以下情况之一,则会在两个模块之间发生内容合并: 一个模块直接访问另一个模块内部数据的一个模块不能通过普通入口移动到另一个模块内部。 两个模块有部分程序代码重叠,一个模块有多个入口
2 )聚集
也称为区块内联络。 模块功能强度的量度,即模块内部各元素相互紧密结合的程度。 一个模块内的各要素越紧密相连,其凝聚性就越高。
偶然凝聚:当一个模块的各部分之间没有关系或即使有关系,但这种关系松散时,称为偶然凝聚。
时间凝聚:当包含在一个模块中的任务必须在同一时间内执行时,称为时间凝聚。
逻辑凝聚:一个模块完成的任务在逻辑上属于相同或相似的类别
流程聚集:如果一个模块中的处理涉及并且需要按特定顺序执行,则称为流程聚集。
通信凝聚:如果一个模块中的所有元素都使用相同的输入数据或生成相同的输出数据,则称为通信凝聚。
顺序聚集:当一个模块中的处理元件与相同的功能密切相关并且必须按顺序执行这些处理时,称为顺序聚集。
功能凝聚:一个模块中所有处理元件归入一个单元,完成一项功能的,称为功能凝聚。
耦合性和内聚性是模块独立性的两个定性标准,在将软件系统划分为模块时,实现尽可能高的内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。 模块高聚集、低耦合原则被称为模块独立原则,也称为模块设计原则。
3 .启发规则
改进软件结构提高模块独立性
模块的规模必须适度
深度、宽度、扇出、扇入在软件结构中要控制的层数必须用合适的深度表示,它往往可以大致表示一个系统的大小和复杂性。 宽度是软件结构中同一层次的模块总数的最大值。 一般来说,宽度越大,系统越复杂。
受宽度影响最大的因素是模块扇出。
一个模块的扇入是指直接调用该模块的上级模块的数量。
一个模块的扇出是指该模块直接调用的下级模块的数量。
设计原则:低扇出、高扇入。
模块的作用域必须位于控制域中
的范围被定义为该模块中受一个判决影响的所有模块的集合。 的控制域是此模块本身以及直接或间接依赖的所有模块的集合
合上。
目标是降低模块接口的复杂性
设计单入口和单出口模块
模块功能应该可以预测
4 .绘制软件结构的图形工具
分层图和HIPO分层图用于描述软件的分层结构。
地图结构图与层次图类似,记述软件结构的图形工具生成最佳解
5 .面向数据流的设计方法
面向数据流的设计方法是将信息流映射到软件结构中,信息流的类型决定了映射方法。 数据流设计所要解决的问题是基于上述需求分析,将DFD映射到软件系统的结构中。
概念
转换流程
事务处理流
数据流图类型:交换型结构和事务型结构
开关结构:由三部分组成:输入路径、转换中心、输出路径。 系统的输入流经转换中心处理后转换为系统的输出流。
事务型结构:至少有一个接受路径,由一个事务中心和多个操作路径组成。 外部信息沿接收路径进入系统后,经过事务中心获得某个特定值,即可据此开始对某个工作路径的操作。
转换分析
转换分析是一系列设计步骤的总称,经过这些步骤将具有转换流特征的数据流图以预定模式映射到软件结构。
事务分析
优化设计
详细设计
详细设计阶段的根本目标是确定应该如何具体实现所要求的系统。 也就是说,经过这个阶段的设计工作,应该得到目标系统的正确描述,在编码阶段可以将该描述直接翻译成用某种编程语言编写的程序。
1 .结构编程
2 .人机界面设计
设计问题
系统响应时间
用户支援设施
错误处理
命令交互
设计过程
人机界面设计指南
一般交互式指南
信息显示指南
数据输入指南
3 .流程设计工具
程序流程图
盒装照片
电脑地图
判定表
判定树
过程设计语言
是以正文形式表示数据和处理过程的设计工具
4 .面向数据结构的设计方法
基于Jackson图改进的Jackson图Jackson方法Jackson方法是最有名的面向数据结构的设计方法,而不是面向数据流的设计方法。 信息驱动的,将信息转换为软件的程序结构
Jackson方法的基本步骤如下。
1 )分析并确定输入数据和输出数据的逻辑结果,用Jackson图描绘这些数据结构。
2 )找出与输入数据结构和输出数据结构存在对应关系的数据单元。
3 )从描绘数据结构的Jackson图中导出描绘程序结构的Jackson图
4 )列出所有操作和条件,并分配到程序图上的相应位置
5 )用伪代码表示程序
5 .程序复杂性的定量测量
)1) McCabe方法
基于过程控制流的复杂性定量测量过程的复杂性称为过程的循环历史:复杂性。 程序循环的复杂性取决于程序控制流的复杂性。 取决于复杂性,也就是程序结构的复杂性。
)2) Halstead方法从程序中的运算符和操作数的总数中测量程序的复杂性。
实现
通常,编码和测试统称为实现
1 .编码
选择编程语言
编码样式
1 )程序内部文档:符号名称命名、程序注释、标准书写格式
2 )数据说明)数据说明顺序应规范。 便于查找数据属性,也有助于测试、调试和维护
3 )句子结构)句子结构力求简单、直接,不要单方面为了追求效率而使句子复杂化。 使用标准的控制结构、尽可能地使用库函数、编写程序首先要考虑清晰度,注意使用got。 语句
4 )输入输出)输入输出地方式和格式应尽量善待用户,尽量方便用户使用。
5 )效率)程序效率)程序效率是指程序的执行速度和程序占用的存储区域。 影响程序效率的因素是多方面的。
2 .软件测试基础
软件测试目标:运行程序以发现程序中的错误的过程
软件测试指南
1 )所有测试都应该可以追溯到用户的需求
2 )测试开始前应制定测试计划
3 )将Pareto原理应用于软件测试4 )应从“小规模”测试开始,逐步进行“大规模”测试
5 )不可能进行全面测试。
6 )为了达到最好的测试效果,必须由独立的第三方从事测试。
测试方法
1 )黑匣子)将程序视为一个黑匣子,完全不考虑程序的内部结构和处理过程。 黑匣子)测试是在程序接口上进行的测试,只检查程序的功能是否能按照规格书的规定正常使用,程序是否能正确接收输入数据并生成正确的输出信息。
2 )白盒测试)结构测试将程序视为透明白盒,测试者完全了解程序的结构和处理算法。
测试步骤
1 )单元测试)保证各模块正常工作,发现编码和详细设计错误。
2 )子系统测试:将经过单元测试的模块集成在一起形成一个子系统测试。
3 )系统测试)被测试的子系统组装成完整的系统进行测试。
4 )验收测试:验证系统能否满足用户需求。
5 )平行运行:运行新旧系统进行比较。
测试阶段的信息流
3 .单元测试
主要采用白盒测试技术集中检测软件设计的最小单元模块。
测试重点
1 )模块接口
2 )本地数据结构
3 )重要执行路径
4 )错误处理路径
5 )边界条件
代码审查
计算机测试
驱动程序:接收测试数据,将这些数据传输到被测试的模块并打印结果。 存根程序:代替被测试的模块被调用的模块,也叫虚拟子程序。
4 .集成测试
也称为组装测试,除了单元测试外,还将所有模块组装到一个系统中进行测试。 在主要测试设计阶段出现的错误,集成测试计划应在概要设计阶段制定。
非渐进测试方法:对每个模块进行单独测试,然后根据设计要求将所有模块合并在一起
配合必要的步骤。
逐步测试:将下一个要测试的模块与已经测试的模块合并进行测试,测试结束后将下一个要测试的模块合并进行测试。
比较:
非渐进测试方法将单元测试和集成测试分为两个不同的阶段,在前一个阶段完成模块的单元测试,在后一个阶段完成集成测试。 渐进式测试往往将单元测试和集成测试放在一起,同时完成。 非递增式需要更多的工作量。 每个模块都需要驱动模块和存根,渐增式利用已测测试模块作为驱动模块或存根,工作量小。 渐增式可以早期发现接口间的错误,非渐增式的总装首次被发现。 渐进公式有利于调试,发生错误多与最近添加的模块相关,渐进公式中接口错误的发现延迟到最后,很难判断是哪个部分的接口错误。 增量增长比较彻底,已经测试的模块和新的模块将重新测试。 淡入式需要很多时间,如果不是淡入式,更多的驱动模块、桩模块也需要时间。 自上而下集成:从主控制模块开始,按照程序的控制级别下移,将各个模块连接在一起。
自下而上的集成:从原子模块,即软件结构最底层的模块进行组装和测试。
不同集成测试策略的比较
自顶向下测试方法的主要优点是不需要测试驱动程序,可以在测试阶段早期实现和验证系统的主要功能,并且可以早期发现上层模块的接口错误。
自顶向下测试方法的主要缺点是需要存根程序,相关测试可能比较困难,下级关键模块错误发现缓慢,且该方法不能早期充分开展人才。
混合策略:自顶向下测试方法、混合法的改进
回归测试:在集成测试中,所有新模块合并后,程序将会更改。 回归测试是指重新运行已经进行的测试的子集。
5 .确认测试:也称为验收测试,目标是使严重的软件有效
验证:一组活动,确保软件正确满足特定要求
确认:为了确保软件满足用户的需求
有效性:如果软件的功能和性能符合用户合理期望,则软件有效
确认测试的范围
软件配置验证
alpha测试:用户在开发人员的位置进行,由开发人员指导用户进行测试。 测试测试:软件最终用户在一个或多个客户地点进行。
6 .白盒测试技术
白盒测试将程序视为透明盒。 这意味着测试人员完全了解程序的内部结构和处理流程。 因此,在测试时,确认程序内部的逻辑测试程序、检查程序中的各路径是否按计划正确动作。 白盒测试也称为结构测试。
白盒测试多用于单元测试阶段。 逻辑复盖是主要的白盒测试技术。 白盒测试时,确定测试数据遵循程序内部逻辑和指定复盖方式。
逻辑上涵盖
1 )语句覆盖)至少执行一次被测量程序中的语句
2 )判断覆盖)不仅应该至少执行一次语句,而且应该针对每个判断的可能结果至少执行一次,也就是针对每个判断的分支至少执行一次
3 )条件覆盖)不仅每个句子至少执行一次,还使得每个判定式的条件都能得到各种可能的结果。
4 )判定/条件覆盖)使得判定式中各条件具有各种可能的值,且各判定式能够取得各种可能的结果
5 )条件组合覆盖)使得各判定式中的条件的各种可能的组合至少出现一次
6 )重点覆盖
7 )侧盖
8 )路径覆盖
控制结构测试
1 )基本路径测试
2 )条件测试
3 )循环测试
7 .黑匣子测试技术
黑匣子测试完全不考虑程序内部的结构和处理过程,按照规格书的规定只检查程序是否满足其功能要求。 黑匣子测试是在程序接口上进行的测试,也称为功能测试。
等价分类
将程序的输入字段分成几个数据类,并在此基础上导出测试用例。 采用等效划分法设计测试方案,首先需要划分输入数据的等效类,为此需要研究程序的功能说明,确定输入数据的有效等效类和无效等效类。
边界值分析
错误的推测
8 .调试
调试过程
调试路由
1 )蛮行法
2 )回溯法
3 )原因排除法
9 .软件可靠性
基本概念
1 )软件可靠性的定义)程序以规定的时间间隔,按照规格书的规定正常工作的概率
2 )软件可用性)在给定的时间点,根据规范中的规定正常运行的概率。
平均故障时间的估算方法
1 )符号
2 )基本假设
3 )估算平均故障时间
4 )如何估算错误总数
维护
1 .软件维护定义
软件交付并使用后,修改软件以纠正错误或满足新需求的过程
修正性维护:修正开发中未发现的遗留错误,即在程序使用中发现的程序错误进行诊断和修正的过程。
完整维护:此维护活动通常涉及软件维护活动的大部分,以满足用户在使用过程中为添加新功能或修改现有功能而执行的任务。
预防性维护:为提高将来的可维护性和可靠性而修改软件的工作。 为维持工作的劳动可以分为生产性活动和非生产性活动。
适应性维护:为了在变化的环境和正确配置而进行的软件修正活动,是必要且频繁的维护活动。 软件用于适应新的执行环境的工作;
2 .软件维护特点
结构化维护和非结构化维护有很大不同
1 )非结构化维护结构化维护
维护成本很高
维护问题很多
3 .软件维护流程
组织的维持
维护报告
维护的事件流
保存维护记录
评价维护活动
4 .软件可维护性
维护人员不容易理解、修改、更改或改进本软件。
决定软件可维护性的因素
1 )理解性
2 )可测试性
3 )可修正性
4 )可移植
5 )复用性
文档
1 )用户文档
2 )系统文档
保守性的重审
5 .预防性维护
6 .软件再工程流程
库存目录分析
重建文档
逆向工程:解析程序,在比源代码更高的抽象级别上创建程序的某种表示形式的过程。 这意味着逆向工程是恢复设计结果的过程,逆向工程工具从现有代码中提取有关数据、体系结构和处理过程的设计信息。
代码重建
重建数据
正向工程:一种创新或改造,它不仅从现有程序中恢复设计信息,还使用该信息修改或重建现有系统,以提高整体质量。 软件的可理解性、可测试性、可修改性、可移植性和可复用性是决定软件可维护性的基本要素。
面向对象的方法论
1 .面向对象方法论概述
面向对象方法的几点
面向对象方法的出发点和基本原则是尽量模拟人的习惯思维方式,使开发软件的方法和过程尽可能接近人认识世界和解决问题的方法和过程,也就是说使描述问题的问题空间和实现解法的解空间在结构上尽可能一致oo=objectsclassesinheritancecommunicationwithmessages面向对象是指同时使用对象、类和继承机制,只能通过对象之间的事务清除
实现彼此的通信。
面向对象方法的优点
1 )与人类习惯观念一致
2 )稳定性好
3 )复用性好
4 )便于开发大型软件产品
5 )维护性好
1 )面向对象软件稳定性好
2 )面向对象软件比较容易修改
3 )、面向对象软件更容易理解
4 )易于测试和调试
2 .面向对象的概念
对象
对象:封装数据结构和可应用于这些数据结构的操作的程序包,该程序包具有可唯一标识的名称,并向外部提供一组服务。 对象特征:以数据为中心的对象是能动的; 实现了数据的封装。本质上具有并行性的模块独立性好
其他概念
1 )类)具有相同数据和相同操作的相似对象组的定义,也就是说类是正确的
具有相同属性和行为的一个或多个对象的说明。
2 )实例)由特定类描述的特定对象。
3 )消息)消息发布时对象与外界相互关系的唯一途径。 对象可以向其他对象发送消息以请求服务,也可以响应来自其他对象的消息并完成特定操作,从而为其他对象提供服务。
消息是要求执行在定义了对象的类中定义的操作的规范
我来解释。 一条消息由三个部分组成。 接收消息的人; 消息选择器; 零或多个参数。
4 )方法)方法是对象可以执行的操作,即在类中定义的服务。 方法描述对象执行操作的算法以及响应消息的方式。
5 )属性)属性是指用类定义的数据,是对客观世界实体所具有的性质的抽象。
6 )封装:封装即信息的隐藏,通过封装对外界隐藏了对象的细节实现。
7 )继承:是现实世界中遗传关系的直接模拟。 它可用于表示类之间的内在联系,以及属性和操作的共享。 子类继承父类的特性,子类可以具有自己的属性和特性。
8 )多态性)子类对象可以像父类对象一样使用,可以向父类对象或子类对象发送相同的消息。
9 )重载:函数重载是指同一范围内几个参数特性不同的函数可以使用同一个函数名称。 运算符重意味着同一运算符可以应用于不同类型的操作数。
3 .面向对象建模
模型是为了理解事物而抽象事物,是对事物毫不含糊地进行书面描述。
描述系统数据结构的对象模型、描述系统控制结构的动态模型、描述系统功能的功能模型。 模型通常由一系列图形符号和组织这些符号的规则组成,它们用于定义和说明问题
标题域中的术语和概念。 此外,模型是一种思维工具,利用该工具可以规范地表达知识。
4 .目标模型
对象模型表示静态、结构化系统的“数据”性质,描述数据结构。 对模拟很客观
世界实体对象与对象关系的映射描述了系统的静态结构。
通常使用UML提供的类图对对象建模。 UML中术语“类”的实际含义是“一个类和属于该类的对象”。
类图的基本符号
1 )定义类
UML中类图形符号为长方形,用两条横线将长方形分为上、中、下三个区域,在三个区域分别放置类名、属性、服务器。
类名
性发展
服务
2 )定义属性
UML描述属性的语法格式如下: 可见性属性名称:类型名称=初始值{属性列}
3 )定义服务
服务是操作,UML将操作的语法格式描述为:
可见性操作名称:返回类型{属性列}
表示关系的符号
1 )关联)表示两个类的客体之间存在某种语义联系。
常规关联:只要类与类之间存在连接关系。
关系角色:关联涉及参与关联的对象所扮演的角色。 在某些情况下,显式指定角色名称可以更好地理解类图。
) c )限定关联)限定关联通常用于一对多或多对多的关联关系中,可以从一对多到一对一,或者从多对多到多对一简化模型中的权重。 在类图中,将限定词放入关系的最后一个小框中。
( d )相关类)可能需要一些额外信息来说明相关的性质。 可以引入记录这些信息的相关类。 关联类通过虚线连接到关联。
2 )聚集)聚集,又称聚合,是相关特例。 聚合表示类与类的关系是整体和部分的关系。
) a )共享集合)在集合关系中,位于部分侧的对象可以同时参与构成多个位于整体侧的对象的情况。
) b )组合集合)当一部分类完全属于全体类,一部分与全体共存,全体不存在的部分也消失时,将该集合称为组合集合。
3 )泛化)即继承关系,是共同要素与具体要素之间的分类关系。 一端用连接中空三角形的线表示泛化关系。 ( a )一般泛化;b )受限泛化;带约束条件) ) ) ) ) ) ) ) )一般泛化。
4 )依赖与细分
)依赖关系)依赖关系描述了两个模型元素(类、用例等)之间的语义连接关系。 一个模型元素是独立的,另一个模型元素不是独立的,而是从属于独立的模型元素。 独立的模型元素更改会影响从属的模型元素。
) b )细分关系)对同一事物用不同的抽象层次进行描述时,这些描述之间存在细分关系。
5 .动态模型
6 .功能模型:功能模型表示系统变化的“功能”性质,表示系统“应该做什么”,更直接地反映了用户对目标系统的需求。 功能模型通常由一系列数据流图组成。
(1)用例图:用例图中包含的模型要素是系统、行为者、用例、用例之间的关系。
1 )系统
2 )例句)系统进行的一系列动作,动作的结果被特定的行为者感知。 用例是表示功能类的类,而不是使用功能的特定实例。 用例实例是系统的实际用法,用例实例通常称为脚本。 脚本是系统的具体执行过程。
3 )行为人)与系统交互的人或其他系统。 表示外部实体。
4 )用例之间的关系
扩展关系:在一个用例中添加一些操作将构成另一个用例。 这两个用例之间的关系是扩展关系。 后者继承了前者的几种行为,通常将后者称为扩展用例。
使用关系:当一个用例使用另一个用例时,这两个用例之间形成了使用关系。
用例建模
1 )寻找行为人
2 )寻找用例
7 .三种模型之间的关系
在面向对象方法论中,对象模型是最基本和最重要的,为其他两个模型奠定了基础。
1 )在为每个类创建的动态模型中,描述类实例的生命周期或执行周期。
2 )在数据流图中通过处理,在用例图中通过映射到用例图中,类图中的服务也对应的状态转移来产生动作。
3 )功能模型中的处理与对象模型类提供的服务相对应。 通常,复杂的处理对应于纯粹的对象提供的服务,而简单的处理对应于更基本的对象提供的服务。 有时一个处理对应于多个服务,有时一个服务对应于多个处理。
4 )数据流图中的数据存储和数据的源/端点通常是对象模型中的对象。
5 )数据流图中的数据流往往是对象模型中对象的属性值,也是整个对象。
6 )实例中的行为者可能是对象模型中的对象。
7 )功能模型中的处理可能导致动态模型中的事件的发生。
8 )目标模型描述数据流图表中数据流、数据存储器和数据源的点/端点结构。
总之,功能模型表示系统“应该做什么”; 动态模型明确规定了什么时候制作; 对象模型定义了做事情的实体。
面向对象分析
软件开发和分析的过程都是提取系统需求的过程,要求系统分析人员通过用户与相关领域的专家交流,充分了解用户需求和相关领域的背景知识,最终将这种理解制作成文档资料。
1、分析工作主要内容:理解、表达、验证。
2、分析过程中得到的结果是软件需求说明文档,针对面向对象,由对象模型、动态模型、功能模型组成。
面向对象分析的关键是识别问题域中的类和对象,分析并确定它们之间的关系,最终建立问题域的对象模型、动态模型和功能模型。
1 .面向对象分析的基本过程
概要
面向对象分析是提取和组织用户需求,建立问题域的准确模型的过程。
基本流程流程:
1 )从分析描述用户需求的文件开始。
2 )要求的陈述通常是不完整、不准确或非正式的。 因此,需求陈述不是一成不变的,而是要通过分析,对其内容进行补充和修正。
3 )系统工作人员深入分析和理解用户需求,抽象出系统的本质属性,并通过模型准确表达。
4 )在建模过程中,分析师应该认真向领域专家学习,也应该仔细研究以前对相同或相似问题域进行过面向对象分析的结果。
子模型3和五个级别
a )对象模型)要解决大多数问题,需要从客观世界实体及实体之间的相互关系中抽象出极有价值的对象模型。
b )动态模型)问题涉及相互作用和时间顺序时最重要。 c )功能模型:在解决运算量大的问题时很重要。 在五个层次(主题层、类和对象层、结构层、属性层、服务层对应的面向对象分析过程中建立的对象模型是:类和对象发现、结构识别、结构识别、主题识别、属性识别、属性定义、属性定义综合以上见解,面向对象分析可以按照以下顺序进行。 识别类和对象、识别结构、识别主题、定义属性、提出动态模型、创建功能模型、定义服务
2 .需求说明
写下要点。 需求陈述通常包括问题范围、功能需求、性能需求、应用环境和假设条件等。
应该明确“做什么”,而不是“怎么办”
应该说明用户的需求,而不是提出解决问题的方法
应该指出哪个是系统所需要的性质,哪个是任意的性质
请勿对设计策略施加过度的约束,或描述系统的内部结构。
否则实现的灵活性就会受到限制
系统性能与外部环境的对话协议的记述是恰当的需求
采用的软件工程标准、模块结构标准、未来可能进行的扩展和可维
保护要件等的记述也是适当的需要
系统分析师要与用户和领域专家密切合作,提炼和组织用户需求.
范例
3 .建立对象模型
对象模型描述现实世界中的“类和对象”及其关系,并表示目标系统的静态数据结构。 静态数据结构对APP隐藏细节的依赖很少,在用户需求变化时,可以比较容易判断出静态数据结构相对稳定
确定类和对象
1 )找到候选类和对象
对象是问题域内有意义的事物的抽象,它们可能既是物理实体又是抽象概念
2 )筛选正确的类别和对象
非正式分析仅仅帮助我们找到一些候选的类与对象,接下来应该严格考察每个候选对象,从中去掉不正确的或不必要的,仅保留确实应该记录其信息或需要其提供服务的那些对象
1)冗余
2)无关
3)笼统
4)属性
5)操作
在需求陈述中有时可能使用一些既可作为名词,又可作为动词的词,应该慎重考虑它们在本问题中的含义,以便正确地决定把它们作为类还是作为类中定义的操作。
6)实现
在分析阶段不应该过早地考虑怎样实现目标系统。因此,应该去掉仅和实现有关的候选的对象/类。在设计和实现阶段,这些对象/类可能是重要的,但在分析阶段过早地考虑它们反而会分散我们的注意力。
确定关联
1)初步确定关联
直接提取动词短语得出的关联
需求陈述中隐含的关联
根据问题域知识得出的关联
2)筛选
己删去的类之间的关联
与问题无关的或在实现阶段考虑的关联
瞬时事件
三元关联
派生关联
3)进一步完善
正名
分解
补充
标明重数
划分主题
确定属性
1)分析
2)选择
识别继承关系
反复修改
4 .建立动态模型
编写脚本
设想用户界面
画事件跟踪图
画状态图
审查动态模型
各个类的状态图通过共享事件合并起来,构成了系统的动态模型。
5 .建立功能模型
功能模型表明了系统中数据之间的依赖关系,以及有关的数据处理功能,它由一组数据流图组成。其中的处理功能可以用IPO图、伪码等多种方式进一步描述。
通常在建立了对象模型和动态模型之后再建立功能模型。
画出基本系统模型图
基本系统模型由若干个数据源点/终点,及一个处理框组
成,这个处理框代表了系统加工、变换数据的整体功能。
画出功能级数据流图
把基本系统模型中的单一的处理框分解成若干个处理框,以描述系统加工、变换数据的基本功能,就得到功能级数据流图。
描述处理框功能
把数据流图分解细化到一定程度后,应该描述图中各个处理框的功能。注意,应该着重描述每个处理框所代表的功能,而不是实现功能的具体算法。
6 .定义服务
常规行为
从事件导出的操作
状态图中发往对象的事件也就是该对象接收到的消息,因此该对象必须提供由消息选择符指定的操作,这个操作修改对象状态并启动相应的服务。
与数据流图中处理框对应的操作
数据流图中每个处理框都与一个对象上的操作相应。应该仔细对照状态图和数据流图,以便更正确地确定对象应该提供的服务。
利用继承减少冗余操作
应该尽量利用继承机制以减少所需定义的服务数目.
面向对象设计
1.面向对象设计的准则
模块化
抽象
信息隐藏
弱耦合
1)交互耦合:对象之间的耦合通过消息来实现
2)继承耦合:应该提高继承耦合。
强内聚:衡量一个模块内各个元素彼此结合的紧密程度
1)服务内聚:一个服务应该完成一个且仅完成一个功能
2)类内聚
3) 一般特殊内聚
可重用
2 .启发规则
设计结果应该清晰易懂
一般-特殊结构的深度适当
设计简单的类
使用简单的协议
使用简单的服务
把设计变动减至最小
3 .软件重用
概述
1)重用:也叫再用或复用,是指同一事物不作修改或稍加改动就多次重及使用。
2)软件成分的重用级别
代码重用、设计结果重用、分析结果重用
3)典型的可重用软件成分
类构件:比较理想的可重用软构件
1)可重用软构件应具备的特点
模块独立性强、具有高度可塑性、接口清晰、简明、可靠
2)类构件的重用方式
实例重用、继承重用、多态重用
软件重用的效益
1)质量
2)生产率
3)成本
4 .系统分解
典型的面向对象设计模型,逻辑上由4部分组成:人机交互部分,问题域部分,任务管理部分,数据管理部分.
子系统之间的两种交互方式
1)客户-供应商关系
2)平等伙伴关系
组织系统的两种方案
1)层次组织
2)块状组织
设计系统拓扑结构
5 .设计问题域子系统
在面向对象设计过程中,可能面向对象分析所得出的问题域模型做的补充或修改:
调整需求
重用已有的类
把问题域类组合在一起
增添一般化类以建立协议
调整继承层次
6 .设计人机交互子系统
分类用户
描述用户
设计命令层次
设计人机交互类
7 .设计任务管理子系统
分析并发性
设计任务管理子系统
8 .设计数据管理子系统
选择数据存储管理模式
1)文件管理系统
2)关系数据库管理系统
3)面向对象数据库管理系统
设计数据管理子系统
1)设计数据格式
2)设计相应的服务
9 .设计类中的服务
确定类中应有的服务
设计实现服务的方法
1)设计实现服务的算法
2)选择数据结构
3)定义内部类和内部操作
10 .设计关联
关联的遍历
实现单向关联
实现双向关联
关联对象的实现
11 .设计优化
确定优先级
提高效率的几项技术
1)增加冗余关联以提高访问效率
2)调整查询次序
3)保留派生属性
调整继承关系
1)抽象与具体
2)为提高继承程度而修改类定义
3)利用委托实现行为共享
面向对象实现
面向对象实现包括:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。
1 .程序设计语言
面向对象设计的结果既可以用面向对象语言、也可以用非面向对象语言实现。使用面向对象语言时,由于语言本身充分支持面向对象概念的实现,因此,编译程序可以自动把面向对象概念映射到目标程序中。使用非面向对象语言编写面向对象程序,则必须由程序员自己把面向对象概念映射到目标程序中。
面向对象语言的优点
从原理上说,使用任何一种通用语言都可以实现面向对象概念。当然,使用面向对象语言,实现面向对象概念,远比使用非面向对象语言方便,但是,方便性也并不是决定选择何种语言的关键因素。选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性。从面向对象观点看来,能够更完整、更准确地表达问题域语义的面向对象语言的语法是非常重要的,因为这会带来
下述几个重要优点:
1) 一致的表示方法
2)可重用性
3)可维护性
面向对象语言的技术特点
1)支持类与对象概念的机制
2)实现整体-部分结构的机制
3)实现一般-特殊结构的机制
4)实现属性和服务的机制
5)类型检查
6)类库
7)效率
8)持久保存对象
9)参数化类
10)开发环境
选择面向对象语言
1)将来能否占主导地位
2)可重用性
3)类库和开发环境
4)其他因素
2 .程序设计风格
提高可重用性
1)提高方法的内聚
2)减小方法的规模
3)保持方法的一致性
4)把策略与现实分开
5)全面覆盖
6)尽量不使用全局信息
7)利用继承机制
提高可扩充性
1)封装实现策略
2)不要用一个方法遍历多条联链
3)避免使用多分支语句
4)精心确定公有方法
提高健壮性
1)预防用户的操作错误
2)检查参数的合法性
3)不要预先确定限制条件
4)先测试后优化
3 .测试策略
面向对象的单元测试
当考虑面向对象的软件时,单元的概念改变了。“封装”导致了类和对象的定义,这意味着类和类的实例包装了属性和处理这些数据的操作。现在,最小的可测试单元是封装起来的类和对象。一个类可以包含一组不同的操作,而一个特定的操作也可能存在于一组不同的类中。因此,对于面向对象的软件来说,单元测试的含义发生了很大变化。在测试面向对象软件时,不再孤立地测试单个操作,而应该把操作为类的一部分来测试。
面向对象的集成测试
因为在面向对象的软件中不存在层次的控制结构,传统的自顶向下或自底向上的集成策略就没有意义了。此外,由于构成类的各个成分彼此间存在直接或间接的交互,一次集成一个操作到类中通常是不现实的。
基于线程的测试和基于使用的测试两种
面向对象的确认测试:和传统的确认测试一样,面向对象的确认测试也集中检查用户可见的动作和用户可识别的输出。对于面向对象的软件来说,主要还是根据动态模型和描述系统行为的脚本来设计确认测试用例。在确认测试或系统测试层次,不再考虑类之间相互连接的细节。和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。
4 .设计测试用例
测试类的方法
1)随机测试
2)划分测试
1)基于状态的划分
2)基于属性的划分
3)基于功能的划分
3)基于故障的测试
集成测试方法
可采用基于线程或基于使用的策略完成集成测试,也可以采用随机测试和划分测试方法,从动态模型导出的测试用例,可以测试指定的类及其协作者。测试类协作可以使用随机测试方法和划分测试方法,以及基于情景的测试和行为测试来完成。
1)多类测试
2)从动态模型导出测试用例
确认测试
可以采用传统的黑盒方法完成测试工作,基于情景的测试是面向对象系统确认测试的主要方法。
软件项目管理
1.估算软件规模
代码行技术
功能点技术
2.工作量估算
软件估算模型使用由经验导出的公式来预测软件开发工作量,工作量是软件规模的函数,工作量的单位通常是人月。 静态单变量模型
动态多变量模型
C0C0M02模型
3 .进度计划
估算开发时间
Gantt 图 工程网络
估算工程进度
关键路径
机动时间
4 .人员组织
民主制程序员组:小组成员完全平等,充分享有民主通过协商做出决策。
主程序员组
现代程序员组
5 .质量保证
软件质量
软件与明确地和隐含地定义的需求相一致的程度。具体的说。软件质量是软件与明确地叙述的功能和性能需求、文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度
软件需求是度量软件质量的基础。
有没有显式描述的隐含需求。
不遵守一组指导软件开发的准则,会导致软件质量不高。
软件质量保证措施
基于非执行的测试、基于执行的测试、程序正确性证明
1)技术复审的必要性
2)走查
3)审查
4)程序正确性证明:使用数学方法严格验证程序是否与它的说明完全一致。
6 .软件配置管理
软件的整个生命期内管理变化的一组活动,目标是使变化更正确且更容易被适应,在必须变化时减少所需花费的工作量。
软件配置
1)软件配置项
2)基线:已经通过了正式更审的规格说明或中间产品,它可以作为进一步开发的基础,并且只有通过正式的变化控制过程才能改变它。
软件配置管理过程
1)标识软件配置中的对象
2)版本控制
3)变化控制
4)配置审计
正式的技术复审:关注被修改后的配置对象的技术正确性。软件配置审计:通过评估配置对象那些通常不在复审过程中考虑的特征,是
对正式技术复审的补充。
7 .能力成熟度模型CMM
基本思想:由于问题是由人们管理软件过程的方法不正当引起的,所以新软件技术的运用并不会自动提高软件的生产率和质量。能力成熟度模型有助于软件开发机构建立一个有规律、成熟的软件过程。
1)初始级
2)可重复级
3)已定义级
4)已管理级
5)优化级
自考资料网:建议开通永久VIP超级会员更划算,除特殊资源外,全站所有资源永久免费下载
1. 本站所有网课课程资料来源于用户上传和网络收集,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,助力考生上岸!
3. 如果你想分享自己的经验或案例,可在后台编辑,经审核后发布在“自考资料网”,有下载币奖励哦!
4. 本站提供的课程资源,可能含有水印,介意者请勿下载!
5. 如有链接无法下载、失效或广告,请联系管理员处理(在线客服)!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 星光不问赶路人,岁月不负有心人,不忘初心,方得始终!