https://www.docin.com/p-1217261520.html?docfrom=rrela
https://www.cnblogs.com/jojop/p/11801241.html


软件危机

软件危机:计算机软件在开发和维护过程中遇到的一系列严重问题。

一般有如下一些表现形式:

  1. 对软件开发成本和进度估计不准确
  2. 软件成本,在总成本所占比例逐年上升
  3. 用户对“已完成软件”常常不满意
  4. 软件往往不可维护
  5. 软件没有文档资料

软件

软件:软件是程序(指令集合)、数据结构以及文档描述的集合。

  1. 程序是完成预定功能和性能的可在计算机系统上的指令序列;
  2. 数据是可以使程序适当处理信息的数据结构;
  3. 文档是在软件开发过程中所使用的一系列图文资料。

软件工程

软件工程:
(1)把系统的、规范的、可度量的方法应用于软件开发、运行和维护过程,即把工程化方法应用于软件
(2)在(1)中所述方法的研究


软件工程层次化技术

在这里插入图片描述


软件开发生命周期SDLC


瀑布模型waterfall model/经典生命周期classic life cycle


是一种系统化的、顺序的软件开发方法。
活动从用户需求规格说明开始,通过策划、建模、构建和部署的过程,最终提供一个完整的软件并提供持续的技术支持。


在这里插入图片描述

在这里插入图片描述


特点:系统化+顺序自上而下输出+文档+强调早期需求

  1. 各项活动按自上而下,相互衔接的固定次序,如 同瀑布逐级下落(阶段间具有顺序性和依赖性)
  2. 每个阶段必须完成规定的文档;每个阶段结束前完成文档审查
  3. 每个阶段都要有明确的输出,作为下一阶段的输入。如果下一阶段出现问题,就要返工,回到上一个阶段。
  4. 强调早期调研和需求分析,推迟编码实现

缺点:文档驱动,最后才有可交付产品,强调早期需求导致

  1. 不能对软件系统进行快速创建,对于一些急于交付的软件系统的开发很不方便。
  2. 系统中存在的重大缺陷,如果再可执行程序评审之前没被发现,修改成本巨大(如图1模型中,运行阶段发现需求问题,虚线就要回归到需求极端再走一遍瀑布模型)
  3. 客户必须有耐心,在可运行的软件产品交付给用户之前,用户只能通过文档来了解产品是什么样的。对最终开发出的产品可能并不是用户真正需要的
  4. 用户没有反馈和修改需求的机会,所以必须要求开发项目需求是稳定的,开发人员很熟悉这次开发才可以,否则稍有变动,前面的开发就是无效的,前功尽弃的。
  5. 依赖早期调研和需求分析,但客户通常很难清除描述所有需求,必然存在早期的不确定性
  6. 实际项目很少遵守瀑布模型顺序,这些变更会导致混乱。
  7. 人员闲置(阻塞状态),一些成员要等待另一些成员工作完成,才能开始工作,等待时间可能超过生产时间。

适用于:

1、瀑布模型适合于需求明确,且无大的需求变更的软件开发(编译系统、操作系统等)。而对于分析初期需求模糊的项目,瀑布模型也并不适合
2、能采用线性方法开发的工程


V模型:重视测试的瀑布模型

在这里插入图片描述
特点:本质瀑布,强调测试

1、V-model是瀑布模型的一个变体。
软件开发工作沿着V模型左侧向下推进(需求分析、概要设计、详细设计、软件编码)
2、编码结束后,沿着V模型右侧向上推进测试工作(单元测试、集成测试、系统测试、验收测试)。这些测试验证了左侧推进过程中生成的每个模型。

3、本质上和瀑布模型没区别,只是将验证确认动作应用于早期软件工程工作中,强调了测试阶段的重要性(对测试进行分级,并和开发阶段相对应)。

4、但是仍然一开始需要固定需求,没有改变瀑布型的缺点。阶段仍然是串行,用户没有反馈的机会


增量模型increment model:迭代的瀑布模型

在这里插入图片描述增量模型 = 迭代的瀑布模型

可以迅速为用户提供一套功能有限的软件产品,然后在后续版本中细化和扩展功能。

增量过程模型以迭代的方式运用瀑布模型,把软件产品作为一系列的增量构件来设计、编码、集成和测试。

增量模型时,第一个增量往往是核心功能。


模型特点:

  • 当使用增量模型时,第一个增量往往是核心产品(core product)
  • 客户对每个增量进行评价,根据评价结果制定下一个增量计划
  • 每个增量采用瀑布模型开发,提交一个可运行的产品。

模型优点:省人省钱+用户需求+风险小

  • 开发人员不足时,增量模型十分有用,早期的增量可以由少量人员实现,口碑不错的话,则可以继续投入人力
  • 更易于融入用户需求,因为每次曾两开发的时间很短。
  • 根据市场决定策略
  • 规避风险:风险分解到小增量,而不是全在一个线性大型开发中
  • 早期增量避免使用如交付时间不确定的硬件等等,避免延期。第一个可交付版本所需要的成本和时间很少;

模型局限:

  • 避免把难题往后推,首先完成的应该是高风险和重要的部分
  • 管理发生的成本、进度和配置的复杂性可能会超出组织的能力;

适用场景:

项目在既定的商业要求期限之前不可能找到足够的开发人员的情况。


演化模型:原型开发

在这里插入图片描述软件开发过程中,开发初期需求模糊,容易变更。为了适应这种需求的不确定性和变化,于是出现了快速原型(Rapid Prototype)开发方法。


模型特点:重点是给用户看可见功能,试探用户需求

1、快速原型通过【沟通-快速策划-快速建模-构建原型-部署】用来获取用户需求的,试探设计是否有效,根据反馈,不断细化软件需求

集中于软件中那些对客户可见的部分的表示

2、一旦需求或设计确定下来了,原型就将被抛弃。因此,快速原型要求快速构件、容易修改,以节约原型创建的成本、加快开发速度;
3、快速原型是暂时适用使用的,因此并不要求完整

它往往针对某个局部问题建立专门原型,如界面原型、工作流原型等;

4、快速原型不能贯穿软件的整个生命周期,它需要和其他的过程模型相结合才能产生作用

例如,在瀑布模型中应用快速原型,以解决瀑布模型在需求分析时期存在的不足。

模型优点:

1、 启发,明确需求,达成共识:能渐进地启发客户提出新的要求或任务,促使开发人员和用户达成共识;
2、减少了开发风险:避免了因为需求不确定而在开发过程中浪费了大量的资源。

模型局限:

1、没有考虑到软件的整体和长期的可维护性;
2、可能盲目为了方便给客户演示功能:采用不合适的算法,不合适的开发工具,还有不合适的操作系统被选择等等。

适用场景:

  1. 用户需求不清、需求经常变化的情况。
  2. 当系统规模不是很大也不太复杂时,采用该方法比较好。

演化模型:螺旋模型


在这里插入图片描述螺旋模型= 原型迭代+瀑布系统性可控性

螺旋模型将瀑布模型和演化模型结合起来,加入了两种模型均忽略的风险分析
自内向外每旋转一圈便开发 出更完善的一个新版本。

  1. 保留了瀑布模型中系统逐步细化的方法
  2. 同时纳入迭代框架
  3. 在项目的所有细化阶段,始终考虑风险

螺旋一圈/一层演化要经过的4个步骤是:

  1. 制定计划:确定软件的目标,选定实施方案,明确项目开发的限制条件;
  2. 风险评估:原型作为降低风险的机制;

如果风险不能排除,则停止开发工作或大幅度地削减项目规模。如果成功地排除了所有风险,则启动步骤3

  1. 实施工程:实施软件开发

本步骤从内到外相当于一个瀑布模型线性的生命周期

  1. 用户评估,提出建议,计划下一阶段。

模型优点:

1、规避风险、早期错误,提供纠错机会
2、强调阶段质量


模型局限:

  • 开发人员需要有较强的风险评估的经验;

适用场景:适用于开发大型系统,每个演化层都可以应对风险

螺旋模型强调风险分析,开发人员和用户在每一个演化层次,都可以更好地理解应对风险。因此,该模型适合用于庞大、复杂并且具有高风险的系统。


--------------

结构化方法

结构化方法 = 面向过程的方法= 传统软件开发方法
特点:

  1. 自顶向下分析设计,逐步求精
  2. 在获取完整需求之后实施开发部署

面向对象


面向对象 = 对象 + 类 + 继承 + 通信

  1. 认为客观世界由对象组成
  2. 具有相同属性和操作的对象,抽象为类,对象是类的一个实例
  3. 继承:类可以派生出子类,子类继承父类的全部属性和方法之外,还可以有自己的属性和方法
  4. 通信:对象之间通过消息传递维系

面向对象特点

  1. 抽象性:对象的数据抽象和行为抽象;
  2. 封装性:信息隐蔽
  3. 共享性
    同一类中所有实例共享数据结构和行为特征;
    同一应用中所有实例通过继承共享数据结构和行为特征;
    不同应用中所有实例通过复用共享数据结构和行为特征

名词解释

对象 = 一组属性+对属性的操作

类:具有相同属性和操作的对象,抽象为类,对象是类的一个实例

对象vs 类

  1. 类包含对象所有属性和操作,是对象的抽象末班;对象是类的实例
  2. 类可以创建多个对象
  3. 类本身不完成操作,只定义;对象完成操作

消息:实现对象间监护的手段


继承(Inheritance):抽象

继承是用来实现代码复用和设计复用的机制,是面向对象程序设计的重要特性之一。设计一个新类时,如果可以继承一个已有的设计良好的类然后进行二次开发,无疑会大幅度减少开发工作量。

把几个类之间共有的属性和行为,抽取放在一个泛化类中
把几个类各自特有的属性和行为,放在特殊化类中。
则可建立区特殊化类,对泛化类的继承。

派生类可以继承父类的公有成员,但是不能继承其私有成员

  1. 子类救护车,警车,消防车类都可以继承汽车父类的轮胎,方向盘公有属性,以及启动,刹车等共有方法。
  2. 子类救护车,警车,消防车类各自可以有各自的颜色,尺寸属性;

多态

是指基类的同一个方法不同派生类对象具有不同的表现和行为

如:派生类继承了基类行为和属性之后,对继承来的某些行为进行改变。

>>> class Animal(object): # 基类
	def show(self):
		print("i'm an animal")

		
>>> class Dog(Animal): # 继承基类的show方法
	def show(self):	# 重写
		print("i'm a dog")

		
>>> class Cat(Animal):
	def show(self):
		print("i'm a cat")

		
>>> class Test(Animal):# 没重写
	pass

>>> Dog().show()
i'm a dog
>>> Cat().show()
i'm a cat
>>> Test().show()
i'm an animal

UML


RUP统一开发过程(rational unified process)


面向对象的软件工程过程。
采用准确的UML描述系统模型基础体系结构。

定义:RUP是用例驱动的,以体系结构为核心的,以质量控制和风险管理为目标的,迭代的,增量的开发过程。

二维软件开发模型:

  1. 横轴:时间(周期:初始、细化、构造、移交)
  2. 纵轴:内容(开发过程的工作流)

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐