《软件工程》第 13 章 - 软件维护

知识思维导图

13.1 软件维护与进化的概念

1. 核心概念

  • 软件维护:软件交付使用后,为纠正错误、改善性能或其他属性而进行的修改过程
  • 软件进化:随着时间推移,软件系统为适应环境变化和用户需求而不断演变的过程

2. 维护类型(Java 代码示例)

/*** 维护类型演示类*/
public class MaintenanceDemo {// 纠错性维护:修复除法溢出错误public double calculate(int a, int b) {if (b == 0) { // 纠错性维护新增的防御性代码throw new IllegalArgumentException("除数不能为0");}return a / b;}// 适应性维护:适配新操作系统的文件路径格式public String getFilePath(String fileName) {String os = System.getProperty("os.name").toLowerCase();if (os.contains("win")) { // 适应性维护的环境判断return "C:\\" + fileName;} else {return "/usr/local/" + fileName;}}// 完善性维护:新增日志功能public void processData(String data) {System.out.println("开始处理数据:" + data); // 完善性维护新增的日志// 原有处理逻辑}// 预防性维护:提前优化算法复杂度public List<Integer> optimizeAlgorithm(List<Integer> list) {// 预防性维护:将O(n²)算法优化为O(n log n)Collections.sort(list);return list;}
}

13.2 软件维护的过程模型

13.2.1 结构化与非结构化维护对比

维度结构化维护非结构化维护
文档支持完整的需求 / 设计 / 测试文档缺乏或无文档
修改流程遵循需求分析→设计→编码→测试流程直接修改代码,无规范流程
维护成本
风险可预测不可预测,易引发副作用

13.2.2 维护成本公式

                                           软件维护成本占比示意图

13.2.3 常见问题及解决方案

  • 问题 1:人员流动导致知识断层
    解决方案:建立维护知识库,录制代码讲解视频

  • 问题 2:技术债累积
    解决方案:制定技术债偿还计划,定期进行代码重构

13.3 可维护性

1. 可维护性三大指标

                                                         可维护性指标架构图

2. 提升可维护性的 Java 实践

// 可理解性:使用有意义的变量名和注释
public class UserService {// 可修改性:使用接口隔离原则private final UserRepository userRepository; // 依赖抽象而非具体实现public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 可测试性:分离业务逻辑与外部依赖public boolean validateUser(String userId) {if (StringUtils.isBlank(userId)) { // 使用工具类增强可读性log.error("用户ID为空");return false;}return userRepository.existsById(userId);}
}

13.4 维护活动及实施策略

1. 维护活动流程图

                                                           软件维护活动流程图

2. 版本控制最佳实践

# Git分支管理策略示例
git checkout -b feature/optimize-login  # 新建功能优化分支
# 修改代码并测试通过
git commit -m "优化登录功能可维护性"
git checkout main
git merge feature/optimize-login       # 合并到主分支

13.5 维护副作用

1. 副作用类型及预防措施

类型示例预防措施
代码副作用修改模块 A 导致模块 B 功能异常编写单元测试,使用依赖注入
数据副作用字段类型修改导致旧数据丢失数据迁移前做备份,增加兼容性校验
文档副作用代码修改后未更新设计文档建立文档更新 checklist

2. 副作用检测代码示例(JUnit 测试)

public class SideEffectTest {private MaintenanceDemo demo;@BeforeEachpublic void setUp() {demo = new MaintenanceDemo();}// 检测修改计算方法是否影响原有功能@Testpublic void testCalculateSideEffect() {assertDoesNotThrow(() -> demo.calculate(10, 2)); // 验证无异常抛出assertEquals(5.0, demo.calculate(10, 2), 0.01); // 验证结果正确性}
}

13.6 逆向工程与软件重构

1. 逆向工程步骤(以 Java 为例)

  1. 使用 JD-GUI 反编译.class 文件获取源代码
  2. 通过 UML 工具生成类图(示意图位置:图 4)
  3. 分析代码结构,推导设计模式

2. 代码重构实战:提取重复代码

重构前代码

// 重复代码示例
public void saveUser(User user) {String sql = "INSERT INTO user VALUES(?, ?, ?)";// 执行数据库操作
}public void updateUser(User user) {String sql = "UPDATE user SET name=?, age=? WHERE id=?";// 执行数据库操作(与save方法重复)
}

重构后代码

public class DatabaseHelper {private void executeSql(String sql, Object... params) {// 统一数据库操作逻辑}public void saveUser(User user) {String sql = "INSERT INTO user VALUES(?, ?, ?)";executeSql(sql, user.getId(), user.getName(), user.getAge());}public void updateUser(User user) {String sql = "UPDATE user SET name=?, age=? WHERE id=?";executeSql(sql, user.getName(), user.getAge(), user.getId());}
}

13.7总结

   软件维护是软件生命周期中耗时最长、成本最高的阶段,通过结构化维护流程、提升代码可维护性、规范版本管理等策略,能够有效降低维护成本并减少副作用。逆向工程和重构技术则为老旧系统的现代化改造提供了重要手段。建议在实际项目中建立维护日志,定期进行维护复盘,持续优化软件系统的可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI Agent助力医疗科研突破

最近&#xff0c;AI Agent在医疗科研领域的突破格外引人注目。非营利组织Future House宣布其多智能体系统Robin在约10周内&#xff0c;为干性年龄相关性黄斑变性&#xff08;dAMD&#xff09;发现了一种潜在新疗法&#xff0c;这一成果展示了AI在加速科学发现&#xff0c;特别是…

(高级)高级前端开发者指南:框架运用与综合实战

当您已经掌握了HTML5、CSS3和JavaScript的基础知识后&#xff0c;接下来就是学习现代前端框架和性能优化的高级阶段。本文将重点介绍Vue.js/React的组件化开发、状态管理和路由配置&#xff0c;以及前端性能优化的核心技巧。通过丰富的代码示例和详细讲解&#xff0c;帮助您在实…

提示词写的好,用VSCODE+python+Claude3.5开发edge扩展插件(2)

导入文件夹: 导入扩展成功: 通过网盘分享的文件&#xff1a;Meteor New Tab.zip 链接: https://pan.baidu.com/s/1fXOhuoYboO_Afzqhuo5Eew?pwdxeix 提取码: xeix edge收藏夹书签过多时在扩展显示可以搜索筛选,

CUDA加速的线性代数求解器库cuSOLVER

cuSOLVER是NVIDIA提供的GPU加速线性代数库&#xff0c;专注于稠密和稀疏矩阵的高级线性代数运算。它建立在cuBLAS和cuSPARSE之上&#xff0c;提供了更高级的线性代数功能。 cuSOLVER主要功能 1. 稠密矩阵运算 矩阵分解: LU分解 (gesvd) QR分解 (geqrf) Cholesky分解 (potrf…

Redis之金字塔模型分层架构

在分布式系统架构中&#xff0c;Redis 凭借其卓越的读写性能成为缓存层的核心组件。但如何精准判断数据是否适合进入 Redis&#xff0c;以及如何科学量化 “高频查询” 标准&#xff0c;始终是高性能系统设计的关键课题。 数据访问特征金字塔模型是用于评估数据是否适合进入 R…

JVM 垃圾回收机制深度解析(含图解)

JVM 垃圾回收机制深度解析&#xff08;含图解&#xff09; 一、垃圾回收整体流程 垃圾回收图解 #mermaid-svg-KPtxlwWntQx8TOj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KPtxlwWntQx8TOj3 .error-icon{fill…

MySQL快速入门篇---联合查询

一、什么是联合查询 1.1、概念 联合查询是SQL中用于合并多个SELECT语句结果集的操作。条件是被合并的结果集列数相同并且数据类型兼容。也可以说一次查询涉及两张或两张以上的表&#xff0c;就称为联合查询。 1.2、为什么要使用联合查询 如果数据被拆分到多个表中&#xff…

Spring Boot AI 之 Chat Client API 使用大全

ChatClient提供了一套流畅的API用于与AI模型交互,同时支持同步和流式两种编程模型。 流畅API包含构建Prompt组成元素的方法,这些Prompt将作为输入传递给AI模型。从API角度来看,Prompt由一系列消息组成,其中包含指导AI模型输出和行为的指令文本。 AI模型主要处理两类消息: …

基于点标注的弱监督目标检测方法研究

摘要 在计算机视觉领域&#xff0c;目标检测需要大量精准标注数据&#xff0c;但人工标注成本高昂。弱监督目标检测通过低成本标注训练模型&#xff0c;成为近年研究热点。本文提出一种基于点标注的弱监督目标检测算法&#xff0c;仅需在图像中物体中心点标注&#xff0c;即可高…

外网如何连接内网中的mysql数据库服务器?简单网络工具方案

当内网服务器部署好mysql数据库后&#xff0c;在局域网外需要用程序进行mysql 远程访问&#xff0c;而mysql因为安全的因素&#xff0c;默认的时候用户设置的是不能远程连接&#xff0c;只能本地连接&#xff0c;这个时候就需要自己去修改其中的设置。下面就介绍一下相关mysql的…

无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容

Occupancy Grid Map & Euclidean Signed Distance Field: 【注意】&#xff1a;目的是为了将有噪声的传感器收集起来&#xff0c;用于实时的建图。 Occupancy Grid Map&#xff1a; 概率栅格&#xff1a; 【注意】&#xff1a;由于传感器带有噪声&#xff0c;在实际中基于…

Rocky Linux 8.9 升级至 8.10 测试可通过以下步骤完成

一、执行升级‌ sudo dnf -y update --disablerepoappstream 二、重启系统‌ reboot ‌三、验证升级结果‌ ‌检查系统版本‌ 执行命令确认版本已更新 cat /etc/redhat-release 输出应包含 Rocky Linux release 8.10

固定翼无人机抛投技术分析!

一、技术要点 1. 结构设计优化 传动组件创新&#xff1a;采用齿轮-齿条传动&#xff08;替代传统丝杆结构&#xff09;&#xff0c;简化机械设计&#xff0c;降低成本并提高可靠性。例如&#xff0c;通过电机驱动齿轮带动齿条移动&#xff0c;实现柱销与抛投物插孔的精准分…

Oracle中的[行转列]与[列转行]

目录 一、原始数据 二、行转列的多种实现方式 1.CASE WHEN 2.DECODE 3.PIVOT(Oracle独有) 4.使用LEAD开窗函数 三、列转行的多种实现方式 1.UNPIVOT(Oracle独有) 2.UNION ALL合并结果集 四、行转列练习&#xff1a;CASE WHEN/DECODE/PIVOT/lag/LEAD 1.CASE WHEN 2…

【Excel VBA 】窗体控件分类

一、Excel 窗体控件分类 Excel 中的窗体控件分为两大类型&#xff0c;适用于不同的开发需求&#xff1a; 类型所在选项卡特点表单控件开发工具 → 插入 → 表单控件简单易用&#xff0c;直接绑定宏&#xff0c;兼容性好&#xff0c;适合基础自动化操作。ActiveX 控件开发工具…

[ 计算机网络 ] 深入理解OSI七层模型

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

线性代数之张量计算,支撑AI算法的数学原理

目录 一、张量计算的数学本质 1、线性代数:张量的几何与代数性质 2、微积分:梯度与自动微分 3、优化理论:张量分解与正则化 4、张量计算的核心操作 二、张量计算在AI算法中的作用 1、数据表示与处理 2、神经网络的参数表示 3、梯度计算与优化 三、张量计算在AI中的…

打造一个支持MySQL查询的MCP同步插件:Java实现

打造一个支持MySQL查询的MCP同步插件&#xff1a;Java实现 用Java实现一个MCP本地插件&#xff0c;直接通过JDBC操作本地MySQL&#xff0c;并通过STDIO与上层MCP客户端&#xff08;例如Cursor&#xff09;通信。插件注册一个名为mysql 的同步工具&#xff0c;接收连接参数及SQL…

【数据架构01】数据技术架构篇

✅ 9张高质量数据架构图&#xff1a;大数据平台功能架构、数据全生命周期管理图、AI技术融合架构等&#xff1b; &#x1f680;无论你是数据架构师、治理专家&#xff0c;还是数字化转型负责人&#xff0c;这份资料库都能为你提供体系化参考&#xff0c;高效解决“架构设计难、…

java三种常见设计模式,工厂、策略、责任链

设计模式实战解析 一、工厂模式&#xff08;点外卖模式&#xff09; 1. 核心思想 代替直接new对象像点外卖一样获取对象 2. 实际应用 Spring框架&#xff1a;BeanFactoryJDBC&#xff1a;DriverManager.getConnection() 3. 三种变体对比 类型特点示例场景简单工厂一个工…