[软件工程]八.软件演化

8.1什么是软件演化

由于种种不可避免的原因,系统开发完成后的软件需要进行修改来适应变更的需求,我们对软件的修改就叫软件演化。

8.2为什么软件会演化

  1. 由于业务的变更或者为了满足用户期待的改变,使得对已有的系统的新需求浮现出来。由于各种原因,软件的某些部分需要进行修改。
  2. 对于已安装的系统,随着业务流程和它的环境的变化,其需求也随之改变。

8.3软件演化的优点

  1. 可以更好地满足用户的需求,提高软件的性能和可用性等性能

8.4软件演化的缺点

  1. 对于一些大规模的企业来说,软件演化的代价及其昂贵

8.5演化和开发的螺旋模型

0dfc0584026242ffa2773ea8c0a8e728.png

  1. 每次有了新的需求都需要新的SRS,根据SRS来进行软件演化,直到软件的退役。
  2. 螺旋模型的每一圈都是一个生命周期,都会发布一个新的版本
  3. 这是这本书唯一一个与风险控制结合的模型

(螺旋模型通过在每个开发周期的各个阶段(规格说明、实现、确认和运行)中不断进行风险评估和控制,将风险控制与软件开发过程紧密结合。在螺旋模型中,每个周期的开始阶段都涉及风险评估,以识别和分析项目可能面临的风险。随着螺旋的旋转,每个阶段都提供了机会来评估项目进展,确保风险得到管理,并在必要时采取措施来减轻风险。通过这种方式,螺旋模型确保了项目在开发过程中持续地进行风险控制,从而提高了项目成功的可能性。)

8.6将演化和维修区别开的一个软件演化生命模型

80d3a56a615e49b5b4b63910da9b1964.png

8.7变更识别和演化过程

ccdb330e8a5749fcb66ac1eaa99b33a2.png

在所有的组织中,正式或者非正式的系统变更建议都是系统演化的动力。

8.8变更的实现流程

1)一般的变更流程

f62d6ec1716741fbaf2d82b438c10a14.png

2)紧急的变更流程

b75776423ff5411bb51ed9ccb8d96c45.png

1>紧急的变更流程

 

紧急的系统修补需要尽快地完成,应当选用一种快速地可行方法

2>为什么紧急的变更流程不可以直接修改代码

紧急的变更流程不直接修改代码的原因是为了确保软件的稳定性和质量。直接修改代码可能会引入新的错误或问题,特别是在没有充分测试的情况下。以下是几个关键原因:

1.代码审查:在修改代码之前进行代码审查可以确保变更符合代码标准和设计模式,减少引入错误的风险。

2.测试:变更后需要进行充分的测试,包括单元测试、集成测试和系统测试,以确保变更没有破坏现有功能。

3.版本控制:通过版本控制系统(如Git)进行变更,可以跟踪变更历史,便于回滚到之前的版本,同时确保团队成员可以访问最新的代码。

4.构建和部署:变更需要通过构建和部署流程,确保变更正确地集成到软件中,并且可以被部署到生产环境。

5.文档更新:变更需要更新相关的文档,包括设计文档、用户手册等,以确保文档与代码保持一致。

6.风险管理:直接修改代码而不遵循标准流程可能会导致不可预见的风险,如安全漏洞、性能问题等。

7.团队协作:遵循标准的变更流程可以确保团队成员之间的协作和沟通,避免因信息不对称导致的冲突。

8.合规性:对于某些行业(如医疗、金融等),直接修改代码可能违反法规要求,需要遵循特定的变更管理流程。

因此,即使在紧急情况下,也应遵循标准的变更管理流程,以确保软件的稳定性和质量。这有助于减少风险,提高软件的可靠性和可维护性。

3>紧急的修复过程带来的缺陷

紧急修补后,会加速软件的老化,所以在紧急修补后,最好对软件进行一次重构来提高代码质量和避免软件的老化。

*8.9遗留系统(Legacy System)

1)什么是遗留系统

遗留系统是比较老的系统,它们依赖于一些在新系统开发中不再使用的语言或者技术。经典情况下,它们已经被维护了很长的一段时间,它们的结构可能已经由于所做的修改而发生了退化。遗留软件可能无法依赖于更老的硬件

2)造成遗留系统的原因

  1. 更老的硬件
  2. 不再使用的语言或者技术
  3. 应用的数据会出现很多重复且不一致的情况,分散在大量的数据库中
  4. 业务流程的变动
  5. 业务政策和规则

3)遗留系统维护成本高的原因

  1. 遗留系统往往会缺少一个完备的规格说明
  2. 业务过程以及遗留系统的允许方式经常不可避免地交织在一起
  3. 重要的业务流程可能会蕴含在软件中,并且可能并没有进行专门的文档描述
  4. 新的软件开发从内在来讲也是充满风险的,因此新系统中可能会存在无法预见的问题

4)管理遗留系统

  1. 彻底废弃这个系统:当遗留系统不能再对业务流程过程产生有效的作用的时候。
  2. 对系统进行再工程以改善其可维护性:当系统质量由于经常性的变更已经下降,而且仍然需要进行做经常性地变更的时候
  3. 不再大量修改系统仅仅保持常规维护:当一个系统仍然由存在的必要,系统运行地平稳,而且用户没有提出太多对系统的变更要求的时候
  4. 用一个新的系统来代替整体或者部分系统:当其他因素使得新系统开发的成本非常合理的时候,就应该做出这样的改变。

8.10软件维护(Software maintenance)

1)什么是软件维护

软件的维护是指在软件发布后,为了保持其正常运行、修复缺陷、改进性能、适应环境变化或满足用户新需求而进行的一系列活动。软件维护是软件生命周期中的一个重要阶段,它确保软件能够持续满足用户的需求,并延长软件的使用寿命。

2)软件维护的类型

  1. 修复软件缺陷
  2. 使软件适应不同的操作韩环境
  3. 增加或修改系统功能

8.11软件再工程(reengineering)

1)什么是软件再工程

  1. Software Reengineering是指对现有软件系统进行分析、重构和改进的过程,以提高其可维护性、可扩展性、可重用性和性能。再工程通常涉及对软件的内部结构和外部行为的修改,而不改变其原有的功能。再工程的目的是为了使软件系统能够适应新的技术环境、业务需求或用户期望。
  2. 一般来说软件再工程不会对软件的功能产生改变,也应该尽力避免对系统体系结构的大的改动。

2)*软件再工程包括什么

  1. 对系统重新建立系统文档
  2. 重构系统体系结构
  3. 用一重更加先进的重新设计语言来转换系统
  4. 修改和更新系统的数据结构和系统的数据取值

3)什么时候使用reengineering

当系统使用了很长的时间了,性能不太好了,这时候我们需要再过程,增强结构性和可理解性。

8.12软件重构(refactoring)

1)什么是软件重构

  1. 软件重构是提升程序以减缓其由于更改或退化的过程。它意味着通过修改程序来改进程序的结构性,让程序变得更加容易理解。它意味着通过修改程序来改进程序的结构性,降低程序复杂性,让程序变得更加容易理解。重构有时被认为局限于面向对象的开发,但是其原理可以被任何开发方法使用。
  2. 重构是极限编程这样的敏捷方法中必有的过程,极限编程会让软件的体系结构很快退化,通过重构来减缓这个由于更改或退化的过程。

2)重构哪些不好的地方(坏味道)

1>冗余代码:

在程序的不同地方多次出现的代码

2>长方法:

如果方法太长了,我们应该重新设计这个方法,或者将它分解为几个短方法

3>选择语句:

这种情况往往会牵扯到重复,因为选择语句switch依靠的是同一个值的不同类型,选择语句可能会分散在程序的各个地方。

可以使用表驱动法(Table-Driven Method:使用表(如数组或哈希表)来存储逻辑,通过查找表来决定执行哪个操作,而不是使用条件语句。

多态(Polymorphism:通过继承和多态,可以使用基类的引用指向派生类的对象,并调用派生类的方法。这样,可以在运行时根据对象的实际类型来执行不同的行为,而不需要在编译时使用条件语句。】

 

1》表驱动法(Table-Driven Method)的例子

假设我们正在开发一个简单的计算器程序,该程序能够执行加法、减法、乘法和除法运算。使用表驱动法,我们可以创建一个操作表来决定执行哪种运算。


 

解释

在这个例子中,我们定义了一个 operations 的哈希表,它将运算符(如"+"、"-"、"*"、"/")映射到相应的 BiFunction<Double, Double, Double> 函数。当用户请求计算时,我们通过查找表来决定执行哪个操作,而不是使用 if-else 语句。

2》多态(Polymorphism)的例子

假设我们有一个动物类 Animal,它有一个 makeSound() 方法。我们创建了几个继承自 Animal 的子类,如 DogCat 和 Bird,每个子类都重写了 makeSound() 方法来发出不同的声音。

 

在这个例子中,我们使用了多态性。尽管 dogcat 和 bird 都是 Animal 类型的引用,但它们指向的是 DogCat 和 Bird 的对象。当调用 makeSound() 方法时,实际执行的是每个对象的 makeSound() 方法,这取决于对象的实际类型。这样,我们就不需要在编译时使用条件语句来决定调用哪个方法,而是让 Java 运行时根据对象的实际类型来决定。

 

 

4>数据聚集:

当同样的一组数据项(类中的域,方法中的参数)在程序中不同地方重复出现时,数据聚集就出现了。着通常可以通过用一个对象封装所有的数据来解决

 

假设我们正在开发一个在线书店系统,其中有一个订单类(Order)和一个订单项类(OrderItem)。每个订单包含多个订单项,每个订单项包含商品信息和数量。

解释

在这个例子中,Order 类和 OrderItem 类都包含了商品ID(productId)、商品名称(productName)、数量(quantity)和价格(price)。这些数据项在两个类中重复出现,导致了数据聚集。

优化后的代码:

为了解决数据聚集的问题,我们可以创建一个新的类 Product 来封装商品信息:
 

解释

通过将商品信息封装到 Product 类中,我们消除了 Order 和 OrderItem 类中的数据聚集。现在,如果商品信息需要修改(例如,商品名称或价格),我们只需要在一个地方修改 Product 类即可,这使得代码更加易于维护。

优点:

  • 减少重复代码:通过封装数据到一个对象中,减少了代码中的重复。
  • 提高可维护性:修改数据结构时只需在一个地方进行,降低了维护成本。
  • 提高可读性:代码更加清晰,因为数据项的含义和用途更加明确。

 

 

5>假设的一般性:

即开发者为了以后万一使用到在程序中包含了一般性。这通常可以简单地删除掉。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35499.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

【Liunx篇】基础开发工具 - yum

文章目录 &#x1f335;一.Liunx下安装软件的方案&#x1f43e;1.源代码安装&#x1f43e;2.rpm包安装&#x1f43e;3.包管理器进行安装 &#x1f335;二.软件包管理器-yum&#x1f335;三.yum的具体操作&#x1f43e;1.查看软件包&#x1f43e;2.安装软件包&#x1f43e;3.卸载…

第七节(2)、T型加减速优化处理【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍解决标准T型加减速过程中的两个缺陷&#xff0c;其一是使得初速度任意设置&#xff1b;其二是降低Cn递推计算量&#xff0c;提升速度上限 一. 加速减速过程计算 1.1计算不存在匀速过程 根据基本运动定理&#xff1a; w m a x w 0 a 0 ∗ t n 0 … …

什么是继承性?C++中如何实现继承? 继承的好处和注意事项有哪些?

1) 什么是继承性&#xff1f;C中如何实现继承&#xff1f; 一、继承性的概念 继承性是面向对象编程中的一个重要特性&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff08;称为父类或基类&#xff09;的属性和方法。继承的主要目的是实现…

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip&#xff1b;Wav2Lip是一种用于生成唇形同步&#xff08;lip-sync&#xff09;视频的深度学习算法&#xff0c;它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 &#xff08;Paper&#xff09; Wav2Lip模型…

ESP32使用TCA9548A IIC多路复用器拓展

ESP32使用TCA9548A IIC多路复用器拓展 本文将讲述如何使用TCA9458A IIC多路复用器扩展IIC总线端口。使用相同的IIC地址控制多个IIC设备&#xff0c;如多个OLED或BME280等 TCA9548介绍 IIC通信协可以实现在同一IIC总线上与多个IIC设备通信&#xff0c;只要所有设备都具有唯一…

BGP路径属性与路由反射器

BGP路径属性 路径属性&#xff1a; 任何一条BGP路由都拥有多个路径属性 当路由器将BGP路由通告给它的对等体时&#xff0c;一并被通告的还有路由所携带的各各路径属性 BGP的路径属性将影响路由优选 路径四个属性分类&#xff1a; 公认必遵&#xff1a;必须包括在每个upda…

C语言期末考试——重点考点

目录 1.C语言的结构 2.三种循环结构 3.逻辑真假判断 4. printf函数 5. 强制类型转化 6. 多分支选择结构 7. 标识符的定义 8. 三目运算符 1.C语言的结构 选择结构、顺序结构、循环结构 2.三种循环结构 for、while、do-while 3.逻辑真假判断 C语言用0表示false,用非0(不…

ci/cd配置任务超时时间

有两个地方决定了任务超时时间&#xff1a; 1. 2.gitlab-runner

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…

梯度下降法以及 Python 实现

文章目录 1. 引言2. 梯度法3. 例子4. 代码实现5. 讨论 — 学习率 η \eta η5.1 当 η \eta η 设置过大5.2 当 η \eta η 设置过小 参考 1. 引言 梯度下降法&#xff0c;可以根据微分求出的斜率计算函数的最小值。 在人工智能中&#xff0c;经常被应用于学习算法。 2. 梯…

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

详细了解IO分类

按照数据流方向如何划分&#xff1f; 输入流&#xff08;Input Stream&#xff09;&#xff1a;从源&#xff08;如文件、网络等&#xff09;读取数据到程序。 输出流&#xff08;Output Stream&#xff09;&#xff1a;将数据从程序写出到目的地&#xff08;如文件、网络、控…

Appium 安装问题汇总

好生气好生气&#xff0c;装了几天了&#xff0c; opencv4nodejs 和 mjpeg-consumer 就是装不了&#xff0c;气死我了不管了&#xff0c;等后面会装的时候再来完善&#xff0c;气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…

目标检测知识点总结

1、数据增强 2、指标 3、vit 、swint ViT算法&#xff0c;创新性地将图像划分成一个个patch&#xff0c;并将每个patch展平为一个向量&#xff0c;使得图像数据转化为序列化数据&#xff0c;之后输入到Transformer模型中&#xff0c;实现了Transformer在图像分类任务中的应用。…

Lecture 11 - List,Set,Map

List, Set and Map are all interfaces: they define how these respective types work, but they don’t provide implementation code overview 1. List&#xff08;列表&#xff09;&#xff1a; &#xff08;1&#xff09; 创建、访问和操作列表&#xff1a;ArrayList …

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台&#xff0c;旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量&#xff0c;能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后&#xff0c;通过集成百度OCR服务的API&#xf…

应对超声波测试挑战,如何选择合适的数字化仪?

一、数字化仪的超声波应用 超声波是频率大于人类听觉范围上限的声学声压&#xff08;声学&#xff09;波。超声波设备的工作频率为20 kHz至几千MHz。表1总结了一些更常见的超声波应用的特征。 每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…