[软件工程]八.软件演化
8.1什么是软件演化
由于种种不可避免的原因,系统开发完成后的软件需要进行修改来适应变更的需求,我们对软件的修改就叫软件演化。
8.2为什么软件会演化
- 由于业务的变更或者为了满足用户期待的改变,使得对已有的系统的新需求浮现出来。由于各种原因,软件的某些部分需要进行修改。
- 对于已安装的系统,随着业务流程和它的环境的变化,其需求也随之改变。
8.3软件演化的优点
- 可以更好地满足用户的需求,提高软件的性能和可用性等性能
8.4软件演化的缺点
- 对于一些大规模的企业来说,软件演化的代价及其昂贵
8.5演化和开发的螺旋模型

- 每次有了新的需求都需要新的SRS,根据SRS来进行软件演化,直到软件的退役。
- 螺旋模型的每一圈都是一个生命周期,都会发布一个新的版本
- 这是这本书唯一一个与风险控制结合的模型
(螺旋模型通过在每个开发周期的各个阶段(规格说明、实现、确认和运行)中不断进行风险评估和控制,将风险控制与软件开发过程紧密结合。在螺旋模型中,每个周期的开始阶段都涉及风险评估,以识别和分析项目可能面临的风险。随着螺旋的旋转,每个阶段都提供了机会来评估项目进展,确保风险得到管理,并在必要时采取措施来减轻风险。通过这种方式,螺旋模型确保了项目在开发过程中持续地进行风险控制,从而提高了项目成功的可能性。)
8.6将演化和维修区别开的一个软件演化生命模型

8.7变更识别和演化过程

在所有的组织中,正式或者非正式的系统变更建议都是系统演化的动力。
8.8变更的实现流程
1)一般的变更流程

2)紧急的变更流程

1>紧急的变更流程
紧急的系统修补需要尽快地完成,应当选用一种快速地可行方法
2>为什么紧急的变更流程不可以直接修改代码
紧急的变更流程不直接修改代码的原因是为了确保软件的稳定性和质量。直接修改代码可能会引入新的错误或问题,特别是在没有充分测试的情况下。以下是几个关键原因:
1.代码审查:在修改代码之前进行代码审查可以确保变更符合代码标准和设计模式,减少引入错误的风险。
2.测试:变更后需要进行充分的测试,包括单元测试、集成测试和系统测试,以确保变更没有破坏现有功能。
3.版本控制:通过版本控制系统(如Git)进行变更,可以跟踪变更历史,便于回滚到之前的版本,同时确保团队成员可以访问最新的代码。
4.构建和部署:变更需要通过构建和部署流程,确保变更正确地集成到软件中,并且可以被部署到生产环境。
5.文档更新:变更需要更新相关的文档,包括设计文档、用户手册等,以确保文档与代码保持一致。
6.风险管理:直接修改代码而不遵循标准流程可能会导致不可预见的风险,如安全漏洞、性能问题等。
7.团队协作:遵循标准的变更流程可以确保团队成员之间的协作和沟通,避免因信息不对称导致的冲突。
8.合规性:对于某些行业(如医疗、金融等),直接修改代码可能违反法规要求,需要遵循特定的变更管理流程。
因此,即使在紧急情况下,也应遵循标准的变更管理流程,以确保软件的稳定性和质量。这有助于减少风险,提高软件的可靠性和可维护性。
3>紧急的修复过程带来的缺陷
紧急修补后,会加速软件的老化,所以在紧急修补后,最好对软件进行一次重构来提高代码质量和避免软件的老化。
*8.9遗留系统(Legacy System)
1)什么是遗留系统
遗留系统是比较老的系统,它们依赖于一些在新系统开发中不再使用的语言或者技术。经典情况下,它们已经被维护了很长的一段时间,它们的结构可能已经由于所做的修改而发生了退化。遗留软件可能无法依赖于更老的硬件
2)造成遗留系统的原因
- 更老的硬件
- 不再使用的语言或者技术
- 应用的数据会出现很多重复且不一致的情况,分散在大量的数据库中
- 业务流程的变动
- 业务政策和规则
3)遗留系统维护成本高的原因
- 遗留系统往往会缺少一个完备的规格说明
- 业务过程以及遗留系统的允许方式经常不可避免地交织在一起
- 重要的业务流程可能会蕴含在软件中,并且可能并没有进行专门的文档描述
- 新的软件开发从内在来讲也是充满风险的,因此新系统中可能会存在无法预见的问题
4)管理遗留系统
- 彻底废弃这个系统:当遗留系统不能再对业务流程过程产生有效的作用的时候。
- 对系统进行再工程以改善其可维护性:当系统质量由于经常性的变更已经下降,而且仍然需要进行做经常性地变更的时候
- 不再大量修改系统仅仅保持常规维护:当一个系统仍然由存在的必要,系统运行地平稳,而且用户没有提出太多对系统的变更要求的时候
- 用一个新的系统来代替整体或者部分系统:当其他因素使得新系统开发的成本非常合理的时候,就应该做出这样的改变。
8.10软件维护(Software maintenance)
1)什么是软件维护
软件的维护是指在软件发布后,为了保持其正常运行、修复缺陷、改进性能、适应环境变化或满足用户新需求而进行的一系列活动。软件维护是软件生命周期中的一个重要阶段,它确保软件能够持续满足用户的需求,并延长软件的使用寿命。
2)软件维护的类型
- 修复软件缺陷
- 使软件适应不同的操作韩环境
- 增加或修改系统功能
8.11软件再工程(reengineering)
1)什么是软件再工程
- Software Reengineering是指对现有软件系统进行分析、重构和改进的过程,以提高其可维护性、可扩展性、可重用性和性能。再工程通常涉及对软件的内部结构和外部行为的修改,而不改变其原有的功能。再工程的目的是为了使软件系统能够适应新的技术环境、业务需求或用户期望。
- 一般来说软件再工程不会对软件的功能产生改变,也应该尽力避免对系统体系结构的大的改动。
2)*软件再工程包括什么
- 对系统重新建立系统文档
- 重构系统体系结构
- 用一重更加先进的重新设计语言来转换系统
- 修改和更新系统的数据结构和系统的数据取值
3)什么时候使用reengineering
当系统使用了很长的时间了,性能不太好了,这时候我们需要再过程,增强结构性和可理解性。
8.12软件重构(refactoring)
1)什么是软件重构
- 软件重构是提升程序以减缓其由于更改或退化的过程。它意味着通过修改程序来改进程序的结构性,让程序变得更加容易理解。它意味着通过修改程序来改进程序的结构性,降低程序复杂性,让程序变得更加容易理解。重构有时被认为局限于面向对象的开发,但是其原理可以被任何开发方法使用。
- 重构是极限编程这样的敏捷方法中必有的过程,极限编程会让软件的体系结构很快退化,通过重构来减缓这个由于更改或退化的过程。
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 的子类,如 Dog、Cat 和 Bird,每个子类都重写了 makeSound() 方法来发出不同的声音。
在这个例子中,我们使用了多态性。尽管 dog、cat 和 bird 都是 Animal 类型的引用,但它们指向的是 Dog、Cat 和 Bird 的对象。当调用 makeSound() 方法时,实际执行的是每个对象的 makeSound() 方法,这取决于对象的实际类型。这样,我们就不需要在编译时使用条件语句来决定调用哪个方法,而是让 Java 运行时根据对象的实际类型来决定。
4>数据聚集:
当同样的一组数据项(类中的域,方法中的参数)在程序中不同地方重复出现时,数据聚集就出现了。着通常可以通过用一个对象封装所有的数据来解决
假设我们正在开发一个在线书店系统,其中有一个订单类(Order)和一个订单项类(OrderItem)。每个订单包含多个订单项,每个订单项包含商品信息和数量。
未
解释
在这个例子中,Order 类和 OrderItem 类都包含了商品ID(productId)、商品名称(productName)、数量(quantity)和价格(price)。这些数据项在两个类中重复出现,导致了数据聚集。
优化后的代码:
为了解决数据聚集的问题,我们可以创建一个新的类 Product 来封装商品信息:
解释
通过将商品信息封装到 Product 类中,我们消除了 Order 和 OrderItem 类中的数据聚集。现在,如果商品信息需要修改(例如,商品名称或价格),我们只需要在一个地方修改 Product 类即可,这使得代码更加易于维护。
优点:
- 减少重复代码:通过封装数据到一个对象中,减少了代码中的重复。
- 提高可维护性:修改数据结构时只需在一个地方进行,降低了维护成本。
- 提高可读性:代码更加清晰,因为数据项的含义和用途更加明确。
5>假设的一般性:
即开发者为了以后万一使用到在程序中包含了一般性。这通常可以简单地删除掉。
相关文章:
[软件工程]八.软件演化
8.1什么是软件演化 由于种种不可避免的原因,系统开发完成后的软件需要进行修改来适应变更的需求,我们对软件的修改就叫软件演化。 8.2为什么软件会演化 由于业务的变更或者为了满足用户期待的改变,使得对已有的系统的新需求浮现出来。由于…...
【大数据学习 | 面经】yarn的资源申请和分配的单位-Container
在yarn中,资源的申请和分配是以container为单位进行的,而不是直接以application和task为单位。 每个提交到yarn上的应用程序(application)都有一个对应的ApplicationMaster(AM)。这个AM负责与ResourceMana…...
WiFi受限不再愁,电脑无网络快速修复指南
有时在试图连接WiFi时,会发现网络连接受限,或无法正常访问互联网。这种情况不仅影响了工作效率,还可能错过重要的信息。那么,究竟是什么原因导致了电脑WiFi连接受限呢?又该如何解决这一问题呢?小A今天就来教…...
【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。
文章目录 前言一、简单版Tabs代码实现: 二、下划线带动画的TabsAPI回顾:代码实现: 三、内容区域滑动切换切换动画代码实现:(2)禁用手势滑动切换(3)内容区域换为插槽 四、标签栏可滚动…...
TDesign:Picker 选择器
Picker 选择器 API文档地址 单列选择器用法 /// view onTap:(){TDPicker.showMultiPicker(context,data: [controller.coinList],title: ,rightTextStyle: TextStyle(color: AppColors.ColorMain),onConfirm: (selected) {controller.onTapCoin(selected);Navigator.of(contex…...
【AI赋能心理学论文创作策略】第十二章 AI辅助临床启示撰写指南
AI赋能心理学论文创作策略-系列文章目录 第十二章 AI辅助临床启示撰写指南 文章目录 AI赋能心理学论文创作策略-系列文章目录第十二章 AI辅助临床启示撰写指南 前言基础分析框架第一阶段:核心要素分析第二阶段:应用场景展开 关键环节提示第三阶段&#x…...
Pynsist 打包应用 和 PyWebIO 构建Web 应用
Pynsist:一键打包Python 应用代码为Windows 安装程序。 项目地址: https://github.com/takluyver/pynsist PyWebIO:为Python 开发者提供了一种快速、简洁的方式来创建Web 应用,无需学习前端技术 项目地址:https://g…...
git 使用配置
新拿到机器想配置git 获取代码权限,需要的配置方法 1. git 配置用户名和邮箱 git config --global user.name xxxgit config --global user.email xxemail.com 2. 生成ssh key ssh-keygen -t rsa -C "xxemail.com" 3. 获取ssh key cat ~/.ssh/id_rsa.…...
记一次Mysql的SELECT command denied to user...报错(非权限问题)
java.sql.SQLSyntaxErrorException: SELECT command denied to user ‘user_name’‘1.1.1.1’ for table ‘table_name’。错误信息的字面意思是:表“table_name”拒绝用户“user_name”“1.1.1.1”的SELECT命令 。 比较多的情况是:用户没有查看user表…...
element-plus的el-tree的双向绑定
el-tree改造了下 可选可取消 有默认值 不包含父级id 默认展开 点击节点也可触发选择 节点内容自定义 <template>{{ childKeys }}<!--default-checked-keys:默认展开值(正常来说需要包含父级id的 但是我们后端不要后端id )show-checkbox&#x…...
代码随想录-算法训练营day41(动态规划04:01背包,01背包滚动数组,分割等和子集)
第九章 动态规划part04● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集 正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码…...
c#中context.SaveChanges()方法
跟踪实体的状态: Entity Framework 使用 Change Tracker 来跟踪上下文中所有实体的状态。实体的状态可以是: Added:新添加的实体(即将插入到数据库中)。Modified:已修改的实体(即将更新数据库中…...
李飞飞首个“空间智能”模型发布:一张图,生成一个3D世界 | LeetTalk Daily
“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 在人工智能技术迅速发展的背景下,李飞飞创立的世界实验室于近期发布了首个“空间智能”模型,这一创新成果引发了3D生…...
Node.js简单接口实现教程
Node.js简单接口实现教程 1. 准备工作 确保您的计算机已安装: Node.js (建议版本16.x以上)npm (Node包管理器) 2. 项目初始化 # 创建项目目录 mkdir nodejs-api-tutorial cd nodejs-api-tutorial# 初始化npm项目 npm init -y# 安装必要依赖 npm install expres…...
AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!
AIGC 012-Video LDM-Stable Video diffusion前身,将LDM扩展到视频生成任务! 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者,作者在SD的架构上进行扩展,实现了视频的生成。后续在Vid…...
windows文件下换行, linux上不换行 解决CR换行符替换为LF notepad++
html文件是用回车换行的,在windows电脑上,显示正常。 文件上传到linux服务器后,文件不换行了。只有一行。而且相关js插件也没法正常运行。 用notepad查看,显示尾部换行符,是CR,这就是原因。CR是不被识别的。…...
npm, yarn, pnpm之间的区别
前言 在现代化的开发中,一个人可能同时开发多个项目,安装的项目越来越多,所随之安装的依赖包也越来越臃肿,而且有时候所安装的速度也很慢,甚至会安装失败。 因此我们就需要去了解一下,我们的包管理器&#…...
静态链接和动态链接的特点
静态链接 链接方式:在编译时,所有依赖的库代码被直接打包到生成的可执行文件中。这意味着在程序运行时,不需要再加载任何外部库文件。 优点: 独立性强:生成的可执行文件可以在没有依赖库的系统上直接运行&am…...
Mac曲线救国实现Bandizip右键一级菜单
一、前言 个人认为:Bandizip是Mac上最好用的压缩软件,没有之一。 在Mac系统上,学习版的Bandizip由于签名检验问题无法在访达右键的一级菜单显示 解压相关菜单。 有能力的,希望还是支持正版,找找优惠渠道应该100左右。…...
进度与预算
一个项目,如果进度上可以按时完成,一般来说预算不会超标,或者超标幅度有限。 一个项目,如果进度上严重超期,预算基本上会超标,而且超标很大。 现在很多项目,人力成本占比都比较大,…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
