1.Software Overview
1.1software crisis
【1】定义
软件危机是指计算机软件的开发和维护过程中所遇到的一系列严重问题。
【2】典型表现
- 对软件开发成本和进度估计不准确
- 用户对完成的软件系统不满意
- 软件产品质量靠不住
- 软件不可维护
- 软件没有适当文档资料
- 软件成本在计算机系统中的总成本所占比例逐年上升
- 软件更新的速度远跟不上人们需求的速度
【3】产生原因
- 软件显著特点是规模庞大
- 开发和维护过程中采用了错误的方法
- 轻视维护
- 软件开发周期漫长
- 没有对用户需求进行准确了解就急于开发
- 管理协调不当
【4】消除危机
- 技术措施
- 组织管理措施
- 对计算机有正确的认识
- 总结借鉴前人的经验
1.2software engineering
【1】定义
采用工程的概念、原理、技术和方法来开发和维护软件(经验),把经过时间考验而证明正确的管理技术和当前得到的最好的技术方法结合起来(技术),以经济地开发出高质量的软件并有效地维护他(经济)。
把系统的、规范的、可度量的途径应用于软件开发、运行、维护过程,研究上述途径得到软件工程。
【2】本质特性
- 软件工程关注大型程序的构造
- 软件工程的中心课题是控制复杂性
- 软件经常变化
- 开发软件效率非常重要
- 和谐的合作
- 软件必须有效的支持用户
- 软件通常是由具有一种文化背景的人替具有另一种文化背景的人创造产品
【3】软件工程基本原理
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段评审
- 实行严格的产品控制
- 采用现代程序设计技术
- 结果应能清楚地审查
- 开发小组的人少而精
- 承认不断改进软件工程时间的必要性
【4】软件工程方法学(范型)
传统方法学&面向对象方法学
1.3software lifecycle
定义时期:问题定义、可行性研究、需求分析
开发时期:总体设计、详细设计、编码和单元测试、综合测试
维护时期:软件维护
1.4software methods
1.4.1structuration pattern
要点:顺序、选择、循环
优点:将生命周期划分为不同的阶段,每个阶段的工作的相对独立简单,方便人员分工协作,降低了软件开发的难度;
软件生命周期的每个阶段都采用科学的管理技术,在每个阶段结束前都进行严格审查,才开始下一阶段工作,保证了软件的质量提高了可维护性;
提高了软件开发的成功率,生产率也大大提高。
缺点:不利于开发大型程序和处理复杂的软件结构
1.4.2object-oriented pattern
要点:封装、继承、多态
优点:降低了软件产品的复杂性;
提高了软件的可理解性;
简化了软件的开发和维护工作;
提高了软件的可重用性
缺点:学习路线陡峭,需要花费更多的时间进行学习
1.5software process
软件过程:为了获得高质量软件需要完成的一系列任务的框架。
使用资源将输入转化为输出的活动所构成的系统。生命周期模型简单的描述软件过程。
软件生命周期模型:人们为开发更好的软件而归纳总结的软件生命周期的典型实践参考
1.5.1waterfall model
思想:按阶段执行,阶段间具有顺序性和依赖性;尽可能推迟程序的物理实现;每个阶段都必须完成规定的文档,并在阶段结束前对文档进行评审,尽早发现问题,纠正错误。
优点:强迫开发人员采用规范方法;严格的规定了每个阶段都必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证检查。
缺点:
模型由文档驱动,用户难以从静态文档中提出准确需求,产品最终难以满足用户的真正需求;
开发过程往往不可逆转,否则代价太大
特点:阶段见具有顺序性和依赖性;推迟程序的物理实现;质量保证观点(提交文档并审查)
1.5.2rapid prototyping model
思想:快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成功能的一个子集。然后不断收集用户的反馈意见,获得用户真实需求。
优点:快速开发出原型系统,加速开发过程节约成本;能够获取用户的真正需求;基本上做到线性顺序开发
缺点:可能导致系统设计差;难维护
1.5.3incremental model
将软件功能分为许多增量构件,构件最终组合形成最终产品。
优点:可以在较短时间内快速提交部分产品得到回报;方便用户的学习与适应
缺点:不同构件若是无法集成到一起可能会导致巨大风险
1.5.4spiral model
思想:在每个阶段之前都增加了风险分析过程的快速原型模型来降低开发风险
优点:减少了过多测试或测试不足带来的风险;
缺点:开发人员经验不足若没有发现风险将导致真正的巨大的风险。
应用:适用于内部大型软件开发项目,因为可以在风险较大时及时的终止
1.5.5fountain model
思想:主要用于描述面向对象的软件开发过程。为了避免使用喷泉模型开发软件时开发过程过分无序,应该把一个线性过程作为总目标,对软件早期开发对象的扩充。各个阶段使用统一的概念和表示方法,生命周期各阶段无缝连接。因而各个开发步骤就很容易迭代了。
缺点:由于喷泉模型在各个开发阶段是重叠的,在开发过程中需要大量的开发人员,因此不利于项目的管理。
喷泉模型要求严格管理文档,使得审核的难度加大尤其是面对可能随时加入的各种信息、需求与资料的情况。
优点:喷泉模型的各个阶段没有明显的界限,开发人员可以同步进行开发可以提高软件项目开发效率,节省开发时间适应于面向对象的软件开发过程。
2.Feasibility analysis
用最小的代价在在尽可能短的时间内确定问题是否值得去解决。
三个可行性研究:
- 技术可行性:使用现有的技术是否能实现这个系统
- 经济可行性:系统的经济效益能否超过开发成本
- 操作可行性:系统的操作方式在这个用户组织内是否可行
系统流程图:数据在系统各部件间的流动。(为了得到系统中的硬件等处理节点)
数据流图(DFD):数据从输入移动到输出的过程中所经受的变换。(为了得到不同类型的数据形式)
数据字典(DD):描述数据信息。(为了得到详细的数据信息)
3.Requirements engineering
准确的回答“系统必须做什么”。
需求分析原因:为了能开发出真正满足用户需求的软件产品
1.具体过程:沟通、分析建模、形成软件需求规格说明书、复审。
2.建立模型:
功能模型——数据流图
行为模型——状态转换图(为了得到外部操作的行为)
数据模型——E—R图(为了得到数据的结构组织方式)
算法:IPO图
规范化存储:范式
数据结构:层次方框图&Warnier图
3与用户沟通的方法
访谈
面向数据流自顶向下求精
简易的规格说明技术
快速建立软件原型
- 复审方面
一致性、完整性、现实性、有效性
4Integrated design
概括的讲,系统应该如何实现。
首先准备好材料,接着设计,最后写文档。书写的文档有,测试计划,数据库设计,详细实现计划,系统说明(就是将准备的材料和设计写成文档),用户手册
总体设计=系统设计阶段+结构设计阶段
4.1设计原理
- 模块化
把程序划分为可独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来成为一个整体,可以完成指定的功能满足用户需求。
- 抽象
相似的方面集中和概括起来,暂时忽略他们之间的差异
- 逐步求精
为了能集中精力解决主要问题而尽量推迟对问题细节的考虑
- 信息隐藏和局部化
隐藏模块的实现细节,将关系密切的软件元素物理的彼此靠近
- 模块独立
模块功能独立和其他模块间的相互作用少。
4.2耦合和内聚
4.2.1耦合
内容耦合>公共耦合>重复耦合>控制耦合>印记耦合(标记耦合)>数据耦合>非直接耦合
内容耦合:
1.一个模块直接访问另一个模块的内部数据;
2.一个模块不通过正常入口转到另一模块内部;
3.一个模块有多个入口。
公共耦合:一组模块访问同一个公共数据环境
重复耦合:两个模块含有同样逻辑的重复代码
控制耦合:调用模块向被调用模块传递的信息,控制了被调用模块的内部逻辑。
印记耦合:当被调用的模块可以使用的数据多于真实所需数据时,导致数据访问可能失控,给计算机犯罪提供机会.
数据耦合:如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。
非直接耦合:两个模块之间没有直接的关系,它们之间的联系完全通过主模块的控制和调用来实现。
总结:耦合程度由低向高就是模块间的联系逐渐紧密的过程,从只是传递一些数据参数信息,到传递过多的数据;到可以控制内部逻辑;到大量相似代码;到可以公用一个模块;到直接访问另一个模块。
4.2.2内聚
功能内聚>顺序内聚(信息内聚和它级别差不多)>通信内聚>过程内聚>时间内聚>逻辑内聚>偶然内聚
(1)高内聚
功能内聚:每个模块都完成单一功能,最理想。
顺序内聚:元素都相关同一功能,前一元素的输出就是下一元素的输入。
信息内聚:完成多个功能,每个功能都在同一数据结构,每个功能有一个唯一入口点。
(2)中内聚
通信内聚:模块内各功能使用相同的输入数据,或产生相同的输出数据。
过程内聚:模块内处理元素相关,必须以特定次序执行。
(3)低内聚
时间内聚:任务在同一时间段完成,只执行一次
逻辑内聚:把几种相关功能组合在一起
偶然内聚:各部分间没有联系,或者联系很松散
4.3启发规则
(1)高内聚低耦合
(2)模块规模适中
(3)深度、宽度、扇出、扇入都应该适中。
深度:软件结构中控制的层数。宽度:同一层上模块总数的最大值。扇出:直接调用的模块数。扇入:调用该模块的模块数。深度、宽度、扇出、扇入都应适当。通常顶层高扇出,中层低扇出,底层高扇入。
(4)模块作用于在控制阈范围内
- 降低模块接口复杂程度,设计单入口但出口的模块,模块功能可预测
4.4软件结构图形工具
HIPO图
结构图
4.5面向数据流的设计方法(一种设计软件结构的系统化途径)(对综合实践训练有启发思路作用,考试应该也不会考)
- 根据给出的要求设计出数据流图
- 区分是事物流(从若干行为中进行选择)还是数据流
- 确定输入流、输出流、变换中心
- 然后将整个系统的数据流图综合为整体的HIPO图
- 再根据输入流、输出流、变换中心将每一个模块向下逐步精化分解。
5.Detailed design
5.1结构程序设计
1.在编写程序时,强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构.尽可能避免使用会使程序质量受到影响的 GOTO 语句.
2.在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开
5.2人机界面设计
5.2.1系统响应时间
用户完成某个动作软件给出响应的这段时间
5.2.2用户帮助设施
用户在使用应用时遇到问题需要帮助时提供的帮助措施
5.2.3出错处理
提醒用户出错并减轻用户挫折感
5.2.4命令交互
比如快捷键之类的
5.3过程设计工具
程序流程图
盒图
PAD图
判定表&判定树
5.4面向数据结构的设计方法
得出对程序处理的描述
Jackson图
5.5程序复杂度定量度量
6.Realization
编码:把软件结果翻译成用某种程序设计语言书写的过程。
测试:在软件投入生产性运行之前,尽可能多地发现软件中的错误。
软件工程根本目标:开发出高质量的完全符合用户需求的软件。
效率:效率是性能要求,效率是靠好设计来提高的,程序的效率和程序的简单程度是一致的。
6.1软件测试目标
- 测试是为了发现程序中的错误而执行程序的过程。
- 好的测试方案是尽可能发现迄今为止尚未发现的错误的测试方案。
- 成功的测试是发现了迄今为止尚未发现的错误的测试。
- 测试阶段的根本目标是尽可能多的发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用。
6.2软件测试准则
- 所有测试都应该能追溯到用户需求
- 在测试开始之前就制定出测试计划
- 应该从“小规模”测试开始,并逐步进行“大规模”测试。
- 穷举测试是不可能的
- 为了达到最佳的测试效果,应该由独立的第三方进行测试任务测试方法
6.3白盒测试(结构测试)
测试者完全知道程序的结构和处理算法,按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。
6.4黑盒测试(功能测试)
在程序接口进行测试,只检查程序功能能否按照规格说明书的规定正常使用,程序是否能适当的接收数据并产生正确的输出结果,程序运行过程中能否保证外部信息的完整性。
6.5测试步骤
单元测试(模块测试),子系统测试,系统测试(集成测试),验收测试(确认测试),平行运行。
6.6单元测试
测试重点:模块接口;局部数据结构;重要的执行通路;出错处理通路;边界条件。
6.7集成测试
非渐增式测试:把所有模块放在一起,将所有程序作为一个整体来测试。缺点:测试者面对的情况十分复杂;想要诊断定位一个错误十分困难;一旦改正一个错误后又会遇到新的错误,没有尽头。
渐增式测试:把程序划分成小段来构造和测试。优点:比较容易定位和改造错误;对接口可以进行更彻底的测试;可以使用系统化的测试方法。
6.8回归测试
重新执行已经做过的测试地某个子集,以保证上述这些变化没有带来非预期的副作用。
6.9确认测试
Alpha测试:用户在开发者场所进行,并且在开发者对用户地“指导”下进行测试。
Beta测试:软件的最终用户在一个或者多个客户场所进行,软件在开发者不能控制的环境中运行。
6.10
软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
软件可用性:程序在给定的时间点,按照规格说明书的规定成功地运行的概率。
7.Maintaining
软件已经交付使用后,为了改正错误或满足新的需求而修改软件的过程。
7.1四项维护活动
预防性维护,完善性维护,改正性维护,适应性维护
7.2软件维护特点
- 结构化维护与非结构化维护差别巨大
- 维护的代价高昂
- 维护的问题很多
7.2软件维护的过程
本质上是修改和压缩了软件定义和开发的过程
7.3软件的可维护性因素
可理解性;可测试性;可修改性;可移植性;可重用性;
8.面向对象的程序设计
8.1分析
8.1.1OOA要点
OOA是一种尽可能模仿人类思维习惯,使开发软件的过程接近人类实际解决问题的过程,即尽可能使问题域与求解域一致。
对象:一个对象是数据及其行为的组合,就像现实世界中的对象,既有其特定的一些信息又有这个对象的一些特定行为。
8.1.2优点
与人类思维习惯一致;稳定性好;可重用性好;可维护性好;
开发大型软件容易
8.1.3基本概念
object
(1)问题域中实体的抽象。将实体的相关数据,对象的行为等等都封装在一起形成对象。或言之,对象是对属性值和操作的封装。
(2)对象=ID,MS,DS,MI ID标识or名字,MS操作集合,DS数据结构,MI对外接口,受理消息名集合。
(3)特点:对象以数据为中心;实现了数据的封装;对象是主动的;有并行性;每个对象间独立性好
class
将拥有相同属性和行为的对象的描述
instance
实例就是实际例子,它是类中的实际具体的例子。用以区分于对象
message
要求对象执行定义它的类中的操作
组成=消息名+接受对象+变元
method(C++成员函数)
对象可以实现的操作
attribute(C++数据成员)
特征
encapsulation
将操作与数据封装在一个黑盒子里,不需要知道内部是怎么工作的,只需要使用就可以。
封装条件:清晰的边界+接口(协议)+protected realize
inheritance
子类直接继承父类的特性不必再定义增加程序冗余,子类又可以在此基础上在定义新的特性
polymorphism
overloading
8.1.4建模
模型:为了理解事物而对事物做出的一种抽象,是对事物的一种没有歧义的书面描述
模型=图示符号+组织符号的规则
数据(静态)结构——对象模型————类图
控制结构——动态模型————状态图
系统计算结构——功能模型————用例图
国际对象管理组织OMG把UML作为面向对象技术的标准建模语言
【1】对象模型
静态的、结构化的、系统的“数据”性质
【2】动态模型
瞬时的、行为化的、系统的“控制”性质
【3】功能模型
变化的系统的功能性质,指明系统应该做什么
标签:期末考,测试,导论,开发,软件工程,模块,内聚,耦合,软件 From: https://blog.csdn.net/2201_75667888/article/details/143658828