软件工程第十一周
面向对象
面向对象编程(Object-Oriented Programming, OOP)不仅仅是一种程序设计方法,它更是一种深刻的软件工程开发思想。这种思想的核心在于通过抽象和封装来模拟现实世界中的对象和概念,以便更好地管理和解决复杂的软件工程问题。
面向对象编程的主要特点包括:
- 封装:将数据(属性)和操作数据的方法(行为)封装成一个整体(对象),隐藏内部实现的细节,只暴露有限的接口给外部使用。
- 继承:允许新创建的对象继承现有对象的属性和方法。这不仅简化了代码,而且增强了代码的可复用性。
- 多态:同一个行为具有多个不同表现形式或形态。它允许不同的对象对同一消息做出响应。
- 抽象:抽象是将复杂的现实世界简化为模型的过程,它只关注对象的必要特性,并忽略那些不重要的细节。

面向对象的这些特点使得它非常适合用于处理复杂的软件系统。通过面向对象的方法,可以更容易地对系统进行分解、组织和管理,增加代码的可读性、可维护性和可扩展性。此外,面向对象编程也有助于团队协作和代码重用,是现代软件开发中不可或缺的一部分。

处理现有软件系统的方法
维护
维护是软件生命周期中的一个重要阶段,它涉及到对软件产品进行必要的更新和改进,以应对环境变化、修复存在的缺陷、改善性能或增加新的功能。软件维护确保了软件产品能够持续有效地服务于其用户和业务需求。软件产品在开发完成并投入使用后,所进行的变更通常被称为维护。
软件再工程(C. Software Reengineering)
- 定义:软件再工程是指对现有软件系统进行分析、理解和修改的过程,目的是重构和更新软件,使其更容易理解、更易于维护。
- 应用场景:通常用于老旧的软件系统,这些系统可能由于技术陈旧、文档缺失或结构混乱而难以维护和扩展。
- 与维护的关系:软件再工程通常是一种更为深入和彻底的过程,可能包括重写代码、重构数据库或更新系统架构。这超出了日常维护的范畴,目的是彻底改善软件的结构和未来的可维护性。不仅涉及到分析理解,还涉及到了实操!
逆向工程(D. Reverse Engineering)
- 定义:逆向工程是指对一个软件系统的内部结构、功能和工作原理进行分析,而这一切通常是在没有它的源代码的情况下进行的。
- 应用场景:它常用于理解旧系统的工作方式,特别是在缺乏文档或源代码不可用的情况下。这有助于在重构或迁移到新系统时保留原有系统的功能。
- 与维护的关系:逆向工程更多地关注于理解现有软件系统的行为和结构,而不直接涉及日常维护活动。它可以作为软件维护、重构或再工程之前的一项重要分析活动。
总的来说,软件维护主要关注于日常的更新、修复和小范围的改进。软件再工程和逆向工程则通常用于更大范围、更深层次的软件系统重构和理解,它们往往是在软件需要重大改变或完全理解时才采用的策略。
是否可以将逆向工程看作软件再工程必要的的前置操作?
在某些特定情况下,尤其是面对遗留系统、缺少文档或源代码不明确的场景时,逆向工程确实可以作为软件再工程的一个重要步骤。通过先理解现有系统的内部结构和功能,再工程的过程可以更加高效和目标明确。
但是,如果软件的源代码和文档齐全、清晰,那么直接进行重构和改进可能就足够了,无需进行逆向工程。
主动类
在面向对象的编程中,术语“主动类”(Active Class)通常指的是那些在系统中承担主要功能和责任的类。这些类之所以被称为“主动”,是因为它们通常包含了触发和控制系统行为的关键逻辑。下面是为什么这些类完成了系统中的主要功能,以及它们为什么被称为“主动类”的原因:
完成主要功能
-
关键逻辑和操作:主动类通常包含系统的核心业务逻辑和操作。它们负责实现系统的主要功能,如数据处理、决策制定、事件触发等。
-
控制流程:这些类往往在软件的控制流程中扮演重要角色,负责协调和管理其他类的行为,以及系统与外界的交互。
-
主动发起行为:与被动响应系统事件或请求不同,主动类能够自发地触发行为和过程,推动系统向前发展。
被称为“主动类”的原因
-
主动性:它们不仅响应外部请求,还可能自发地开始活动,例如,定时检查、主动更新数据等。
-
动力源:在软件架构中,主动类像是动力源一样,推动整个系统的运作,使系统能够完成其旨在实现的目标。
-
独立性:这些类往往具有较高的独立性,它们能够在没有外部干预的情况下执行任务和维护自身状态。
因此,主动类在软件系统中的重要性和它们的主动性质决定了它们在设计和实现中的关键角色。它们是软件功能和逻辑的主要承载者,同时也是系统活动的主要推动者。
软件可维护性
软件文档与可维护性
软件文档是软件的重要组成部分,它是软件开发阶段的基础,并且还影响着软件的可维护性。详细解释如下:
- 软件文档通常包括需求说明、设计文档、用户手册、测试文档等,这些文档提供了对软件项目的详细描述,帮助开发人员、测试人员和最终用户理解软件。
- 良好的文档使得软件的维护(如错误修复、功能更新、性能优化等)更加容易和高效,因为开发人员可以快速理解软件的设计和功能,从而更有效地进行修改和扩展。
- 软件的可重用性、可扩展性和可移植性也是重要的考虑因素,但它们并不像可维护性那样直接受到软件文档质量的影响。
例题
下面的叙述中,与可维护性关系最密切的是( ) A. 软件从一个计算机系统和环境转移到另一个计算机系统和环境的容易程度 B. 尽管有不合法的输入,软件依然能继续正常工作的能力 C. 软件能够被理解、校正、适应及增强功能的容易程度 D. 在规定的条件下和规定的一段时间内,实现所指定的功能的能力
与可维护性关系最密切的描述是软件能够被理解、校正、适应及增强功能的容易程度。因此,在这个选择题中,正确的选项是:
C. 软件能够被理解、校正、适应及增强功能的容易程度
解释如下:
- 可维护性是指软件在其生命周期内容易进行修改的特性。这包括对软件进行修复、更新、扩展和优化的能力。
- 一个易于维护的软件系统应当能够被开发人员轻松理解,以便于在需要时进行有效的校正(修复缺陷)、适应(修改以适应新环境或需求)和增强(添加新功能或改善性能)。
其他选项与软件的其他质量属性相关,但不是直接指向可维护性:
- A项描述的是软件的可移植性。
- B项描述的是软件的健壮性或容错性。
- D项描述的是软件的可靠性。
动态模型
动态模型是理解和设计软件系统的关键组成部分,是属性值状态变化的集合,我们通过动态模型察看建立的对象是否完整,因为其中触发事件对应的是方法,建立完动态模型和用例才能完整地确定对象的属性和方法(服务)。

以下是对这一过程的进一步阐述:
动态模型的作用
-
状态变化追踪:动态模型关注于对象的行为和状态变化。它帮助开发者理解对象在系统中如何响应不同事件和操作。
-
对象完整性验证:通过动态模型,可以验证建立的对象是否完整和符合预期。这包括确认对象拥有正确的属性和响应机制。
-
方法与事件关联:动态模型强调触发事件和相应方法之间的关联。每个事件通常对应一个或多个方法,这些方法定义了对象如何响应特定的事件。
动态模型在对象设计中的应用
-
确定对象属性:动态模型通过分析对象在不同状态下的行为,帮助识别必要的属性。这些属性是对象在生命周期中存储状态信息的关键。
-
定义对象方法(服务):动态模型揭示了对象需要响应的事件,从而帮助确定必须实现的方法。这些方法是对象提供服务的方式。
-
用例与动态模型:用例分析通常与动态模型相结合使用。用例提供了系统功能的高层视图,而动态模型提供了更细粒度的行为和状态变化信息。二者共同工作,确保了对象设计的全面性和准确性。
在软件开发过程中,动态模型是理解和设计系统中对象的关键步骤。它不仅帮助确定对象的属性和方法,还确保这些元素在整个系统中协同工作,满足用例和业务需求。因此,在动态模型的帮助下,可以更有效地设计出反应迅速、功能完备的软件系统。
相关文章:
软件工程第十一周
面向对象 面向对象编程(Object-Oriented Programming, OOP)不仅仅是一种程序设计方法,它更是一种深刻的软件工程开发思想。这种思想的核心在于通过抽象和封装来模拟现实世界中的对象和概念,以便更好地管理和解决复杂的软件工程问…...
【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法
🎊专栏【Java基础】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The truth that you leave】 🥰欢迎并且感谢大家指出我的问题 文章目录 🌺双列集合的特点🎄Map🍔Ma…...
[Docker]六.Docker自动部署nodejs以及golang项目
一.自动部署nodejs 1.创建node项目相关文件 app.js代码如下: var express require(express);var appexpress();app.get(/,function(req,res){res.send(首页update); }) app.get(/news,function(req,res){res.send(首页); })//docker做端口映射的时候不要指定ip app.listen(30…...
FPC焊点剥离失效分析
一、案例背景 FPC在后续组装过程中,连接器发生脱落。在对同批次的样品进行推力测试后,发现连接器推力有偏小的现象。据此进行失效分析,明确FPC连接器脱落原因。 #1、#2样品连接器脱落连接器脱落;#3样品连接器未脱落;…...
Java爬虫框架下代理使用中的TCP连接池问题及解决方案
引言 当使用Java爬虫框架进行代理爬取时,可能会遇到TCP连接池问题,导致"java.net.BindException: Cannot assign requested address"等错误。本文将介绍如何以爬取小红书为案例,解决Java爬虫框架中代理使用中的TCP连接池问题&…...
PostgreSQL 数据定义语言 DDL
文章目录 表创建主键约束非空唯一约束检查约束外键约束默认值约束 触发器表空间构建表空间 视图索引索引的基本概念索引的分类创建索引 物化视图 表创建 PostgreSQL表的构建语句与所有数据库都一样,结构如下,其核心在于构建表时,要指定上一些…...
设计模式-行为型模式-策略模式
一、什么是策略模式 策略模式是一种行为设计模式,它允许在运行时选择算法或行为,并将其封装成独立的对象,使得这些算法或行为可以相互替换,而不影响使用它们的客户端。(ChatGPT生成) 主要组成部分ÿ…...
ResizeObserver观察元素宽度的变化
ResizeObserver观察元素宽度的变化 ResizeObserver观察元素宽度的变化 ResizeObserver观察元素宽度的变化 ResizeObserver 构造函数创建一个新的 ResizeObserver 对象,它可以用于监听 Element 内容盒或边框盒或者 SVGElement 边界尺寸的大小。查看详细说明 案例 &l…...
斐波那契数列,剑指offer,力扣
目录 题目地址: 我们直接看题解吧: 解题方法: 难度分析: 审题目事例提示: 解题思路(动态规划): 代码实现: 补充说明: 代码(优化)&…...
Mac安装CocoaPods
安装HomeBrew 安装 % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装失败 % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"curl: (28) F…...
APP专项测试方法和工具的使用(测试新手必看)
APP专项测试 1、网络测试 可使用抓包工具辅助网格测试推荐:fiddler,Charles (1)网络切换2G-3G-4G-wifi-网络信号差--无网(2)网络信号弱关注是否出现ANR、crash 2、中断测试 (1)…...
WordPress网站迁移实战经验
前几日,网站服务器到期,换了服务商,就把我的WordPress的网站迁移到本地电脑了。方便以后文章迁移。 本次迁移网站主要经历以下几个步骤。 1.域名转出。 2.备份数据库及网站文件下载。 3.重新搭建WordPress网站。 4.网站文件及数据库导入。 下面详细介绍下每个步骤的操作…...
3D全景视角,足不出户感知真实场景的魅力
近年来,随着科技的快速发展,普通的平面静态视角已经无法满足我们了,不管是视角框架的限制还是片面的环境展示,都不足以让我们深入了解场景环境。随着VR全景技术的日益成熟,3D全景技术的出现为我们提供了全新的视觉体验…...
C编译环境和预处理(非常详细,建议收藏)
C编译环境和预处理(非常详细,建议收藏) 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么? 2.2 运行环境 三、预处理详解3.1 预定义…...
LeetCode669. Trim a Binary Search Tree
文章目录 一、题目二、题解 一、题目 Given the root of a binary search tree and the lowest and highest boundaries as low and high, trim the tree so that all its elements lies in [low, high]. Trimming the tree should not change the relative structure of the …...
YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…...
【数据结构(二)】稀疏 sparsearray 数组(1)
文章目录 1. 稀疏数组的应用场景1.1. 一个实际的需求1.2. 基本介绍 2. 稀疏数组转换的思路分析3. 稀疏数组的代码实现3.1. 二维数组转稀疏数组3.2. 稀疏数组转二维数组 4. 课后练习 1. 稀疏数组的应用场景 1.1. 一个实际的需求 问题: 编写的五子棋程序中&…...
MySQL的执行器是怎么工作的
作为优化器后的真正执行语句的层,执行器有三种方式和存储引擎(一般是innoDB)交互 主键索引查询 查询的条件用到了主键,这个是全表唯一的,优化器会选择const类型来查询,然后while循环去根据主键索引的B树结…...
【目标测距】雷达投影测距
文章目录 前言一、读取点云二、点云投影图片三、读取检测信息四、点云投影测距五、学习交流 前言 雷达点云投影相机。图片目标检测,通过检测框约束等等对目标赋予距离。计算消耗较大,适合离线验证操作。在线操作可以只投影雷达检测框。 一、读取点云 py…...
uniapp、小程序canvas相关
1、圆形or圆形头像 //示例 const ctx uni.createCanvasContext(myCanvas); //canvas const round uni.upx2px(72) / 2; // 半径 const x uni.upx2px(92); //目标x轴位置 const y uni.upx2px(236); //目标y轴位置//if 图片是不是静态资源 async > const imgSrc https:/…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
