【软件工程】第一章概述与软件生命周期

目录

软件开发方法学:

两大类

  • 结构化方法
  • 面向对象方法

结构化方法

概念:结构化方法是一种以过程为中心的软件设计方法。它主要关注程序的结构和功能,将程序划分为模块或函数,并通过顺序、选择和重复等基本控制结构组合来实现程序逻辑。

代表语言:C语言

面向对象方法

概念:面向对象方法是一种以对象为中心的软件设计方法。它将程序中的数据和操作封装在对象中,强调对象之间的交互和消息传递。

特点:面向对象方法的特点包括封装、继承、多态等。它通过定义类和对象来描述问题的解决方案,提高了代码的重用性、可维护性和扩展性。

代表语言:C++,Python,Java

两种开发方法的区别

  • 结构化方法侧重于程序的结构和功能,通过过程和函数来组织程序;而面向对象方法则更注重将数据和操作封装在对象中,并通过对象之间的交互来实现程序逻辑。
  • 在结构化方法中,数据和函数是分开的,而在面向对象方法中,它们被组合在一起形成对象。
  • 面向对象方法更适合于复杂系统的设计和开发,而结构化方法则更适合于简单的问题解决。

从结构到面向对象

  • 传统的结构化方法很难解决软件危机,而面向对象却能适应。为了适应复杂多变的需求,让程序更复杂是合适的。
  • 面向对象的类、对象、封装、继承、多态等概念,可以模拟这个现实世界。

面向对象技术的优势

  • 稳定------较小的需求变化不会导致系统结构大变
  • 复用

什么是软件?

  • 定义:软件 = 程序 + 数据 + 文档
  • 软件 = 计算机程序、方法、规则和相关文档资料以及在计算机上运行时所必需的数据。

为什么出现软件工程学科?

因为软件危机的出现。

软件危机

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

典型表现:

  • 对软件开发成本和进度的估计常常很不明确
  • 用户对"已完成的"软件系统不满意的现象经常发送
  • 软件产品的质量往往靠不住
  • 软件常常是不可维护的
  • 软件通常没有适当的文档资料;计算机软件不仅仅是程序,还应该有一整套文档资料
  • 软件成本在计算机系统总成本中所占的比例逐年上升
  • 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势

产生软件危机的原因:

  • 与软件的本身特点有关,它是计算机系统中的逻辑部件,而不是物理部件
  • 与软件开发和维护的方法不正确有关

消除软件危机的途径:

  • 对计算机软件有正确的认识
  • 认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目
  • 应该推广使用在实践中总结出来的开发软件的成功技术和方法,并继续研究探索
  • 应该开发和使用更好的软件工具
  • 总之,要有技术措施和管理措施。

软件工程的概念

是用工程化的方法指导计算机软件开发维护的一门工程学科。

软件生命(存)周期------------重点⭐

软件生命周期 :
软件产品从形成概念开始,经过开发、使用和维护,直到最后退役的全过程(记)。

分为三个时期:软件定义,软件开发,软件维护。

每个时期又进一步划分为若干个阶段。

软件生命周期可分为三个时期,八个阶段。(三八---速记技巧)

每个时期每个阶段的基本任务及文档

1.问题定义

任务:问题是什么?

  • 通过对客户的访查调查,系统分析员扼要(抓重点)的写出关于问题性质,工程目标和工程规模的书面报告。
  • 经过讨论和必要的修改之后这份报告应该得到客户的确认。

结果:

关于系统规模和目标的报告书

例如:

2.可行性研究

任务:有可行的解吗?

主要从三部分考虑:技术可行性、经济可行性、操作可行性

  • 系统分析员需要进行一次大大压缩和简化了的系统分析和设计过程。
  • 研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法

结果:

  • 系统的高层逻辑模型(数据流图、成本效益分析)
  • 可行性论证报告(立即进行/推迟进行/不能或不值得进行)

3.需求分析

任务:必须做什么?(从用户的角度)

  • 主要是确定目标系统必须具备哪些功能。
  • 系统分析员必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。

结果:

  • 系统的逻辑模型:
    • 数据流图、数据字典、(结构化)
    • 用例图、类图、顺序图(面向对象)-----重点
  • 用规格说明书准确地记录对目标系统的需求(文字,图形)

例子:

用例图:

类图:

4.概要设计

任务:

  • "概括地说,应该怎样实现目标系统?"
  • 简单的说:划分模块及设计模块间关联。又称:生成软件体系结构
  • 设计出实现目标系统的几种可能的方案(低、中、高成本)
  • 用适当的表达工具描述每种方案,分析优缺点,推荐一个最佳方案,制定出实现最佳方案的详细计划。设计程序的体系结构
    结果:
  • 可能的解法(系统流程图)
  • 推荐的系统体系结构(层次图或结构图、架构、类图等)

5.详细设计

任务:怎样实现该系统

  • 详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。

结果:

  • 每个模块的算法和数据结构(程序流程图、伪代码等)。

6.编码和单元测试

任务:得到正确的程序模块

  • 选取一种适当的高级程序设计语言(必要时用汇编语言),把详细设计的结果翻译成用选定的语言书写的程序
  • 并且仔细测试编写的每一个模块

结果:

  • 代码和测试报告

7.综合测试

任务:得到符合要求的软件

  • 通过集成测试、验收测试、现场测试、平行运行等方法对目标系统进一步测试检验。
  • 通过对软件测试结果的分析可以预测软件的可靠性;反之,根据对软件可靠性的要求,也可以决定测试和调试过程什么时候可以结束

结果:

  • 测试计划、详细测试方案以及实际测试结果
  • 完整一致的软件配置

8.软件维护

任务:使系统持久的满足用户的需要

  • 改正性维护:诊断软件的错误
  • 适应性维护:修改软件以适应环境的变化。
  • 完善性维护:根据用户要求改进和扩充软件,工作量最大。
  • 预防性维护:修改软件为将来的维护活动做准备。

结果:完整准确的维护记录

常见软件生存周期模型⭐

瀑布模型

瀑布模型的特点:

  • 阶段间具有顺序性和依赖性,不允许同时进行
    • 前一阶段的工作完成之后,才能开始后一阶段的工作;
    • 前一阶段的输出文档就是后一阶段的输入文档
  • 推迟实现的观点
    • 对于规模越大的软件项目来说,往往编码开始的越早最终完成开发工作所需要的时间反而越长。
  • 质量保证的观点
    • 每个阶段都必须完成规定的文档,是"文档驱动"的模型;
    • 每个阶段结束前都要对所完成的文档进行评审,尽早发现问题,改正错误。

缺点:

客户要准确、完整、全部的表达出自己的需求。

缺乏灵活性。一旦需求存在偏差,最终只能终止或者失败

用户只能通过文档了解产品,不经过实践的需求是不切实际的。

适合瀑布模型的项目特征:

  • 预知,需求明确
  • 技术,方法,框架,方案成熟
  • 小型项目

增量模型

该模型假设需求是可以分段的,称为一系列增量产品,每一增量可以单独开发。


优点:

  • 作为瀑布模型的变体,拥有瀑布模型的全部优点
  • 第一个可以交付的版本所需要的成本和时间少,迅速占领市场。
  • 承担的风险小
  • 当配备的人员有限,不能在设定的期限内完成产品时,可以提供先推出核心产品的途径
  • 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品

难点:

  • 软件体系结构必须是开放的
  • 如果分增量块过多的话,会增加管理成本。
  • 不同的构件并行地构建有可能加快工程进度,冒无法集成到一起的风险

使用项目特征:

  • 需求会变动
  • 对完成期限有严格要求,开发早期获得资金回报,对于市场和用户的把我需要逐步了解,进行已有产品升级

快速原型模型

  • 使用原型(样本)思想获取用户需求。
  • 原型也可能是公司现有的一个类似软件,或只是界面,或只是文档。可能是最终产品能完成的功能的一个子集。
  • 一旦原型完全符合用户需求,开发人员根据其写说明书。

特点:

  • 快速原型的本质是"快速"。应该尽可能快地建造出原型系统,以加速软件开发过程,节约成本。
  • 在整个开发过程中,初始及多次迭代的原型可能跟用户的需求完全不同,引起客户不满。但同时用户也能随时看到实物和进展

使用项目特征:

  • 需求不明确
  • 减少项目需求的不确定性
  • 项目小,简单
  • 有快速原型开发工具或软件类型产品、

螺旋模型

思想:增加了风险分析过程的瀑布模型和快速原型模型混合。

风险分析是对工程建设项目投资决策或企业生产经营决策可能造成的失误和带来的经济损失所进行的估计

优点:

  • 主要优势在于它是风险驱动的。在评估和风险分析阶段都可作出项目是否继续,以规避无法承担的风险。
  • 维护只是模型的另一个周期,维护和开发之间没有本质区别
  • 螺旋循环的次数指示了已消耗的资源

缺点:

  • 采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失。
  • 过多的迭代次数会增加开发成本,延迟提交时间

使用项目特征:

  • 特别适用于庞大、复杂并具有高风险的系统

喷泉模型

特点:主要用于支持面向对象 开发过程。

体现了软件创建所固有的迭代和无缝隙的特征。

  • 迭代的意思是在软件开发过程中可以反复地回到之前的阶段,并对其进行进一步的完善和改进。
相关推荐
ragnwang3 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
lqqjuly6 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++
冰红茶兑滴水7 小时前
云备份项目--工具类编写
linux·c++
刘好念7 小时前
[OpenGL]使用 Compute Shader 实现矩阵点乘
c++·计算机图形学·opengl·glsl
酒鬼猿7 小时前
C++进阶(二)--面向对象--继承
java·开发语言·c++
姚先生978 小时前
LeetCode 209. 长度最小的子数组 (C++实现)
c++·算法·leetcode
小王爱吃月亮糖9 小时前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio
aworkholic9 小时前
opencv sdk for java中提示无stiching模块接口的问题
java·c++·opencv·jni·opencv4android·stiching
程序员老冯头9 小时前
第十六章 C++ 字符串
开发语言·c++
Xenia2239 小时前
复习篇~第二章程序设计基础
c++·算法