软件工程第十一周
面向对象
面向对象编程(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:/…...

【超详细】英伟达Jetson Orin NX-YOLOv8配置与TensorRT测试
文章主要内容如下: 1、基础运行环境配置 2、Torch-GPU安装 3、ultralytics环境配置 4、Onnx及TensorRT导出详解 5、YOLOv8推理耗时分析 基础库版本:jetpack5.1.3, torch-gpu2.1.0, torchvision0.16.0, ultralytics8.3.146 设备的软件开发包基础信息 需…...

作为过来人,浅谈一下高考、考研、读博
写在前面 由于本人正在读博,标题中的三个阶段都经历过或正在经历,本意是闲聊,也算是给将要经历的读者们做个参考、排雷。本文写于2022年,时效性略有落后,不过逻辑上还是值得大家参考,若所述存在偏颇&#…...

《绩效管理》要点总结与分享
目录 绩效管理与目标设定 绩效管理的循环:PDCA 绩效目标的设定要点 绩效设定的工具:SMART法则 绩效跟踪与评估 刻板印象:STAR法 晕轮效应:对比评价法 近因效应:关键事项评估表 绩效面谈 面谈前准备工作 汉堡…...
C++2025.6.7 C++五级考题
城市商业街主干道是一条笔直的道路,商业街里有 n 家店铺,现给定 n 个店铺的位置,请在这条道路上找到一个中心点,使得所有店铺到这个中心点的距离之和最小,并输出这个最小值。 #include <bits/stdc.h> using nam…...

CLion社区免费后,使用CLion开发STM32相关工具资源汇总与入门教程
Clion下载与配置 Clion推出社区免费,就是需要注册一个账号使用,大家就不用去找破解版版本了,jetbrains家的IDEA用过的都说好,这里嵌入式领域也推荐使用。 CLion官网下载地址 安装没有什么特别,下一步就好。 启动登录…...
Ansible自动化运维全解析:从设计哲学到实战演进
一、Ansible的设计哲学:简单即正义 在DevOps工具链中,Ansible以其"无代理架构(Agentless)"设计独树一帜。这个用Python编写的自动化引擎,通过SSH协议与目标主机通信,彻底摒弃了传统配置管理工具…...
光学字符识别(OCR)理论概述与实践教程
一、 光学字符识别(OCR)理论基础 OCR,即Optical Character Recognition,旨在通过计算机视觉和模式识别技术,将图像中包含的文本信息转换为机器可编辑、可搜索的文本数据。这项技术是实现信息数字化、自动化处理纸质或图像化文档的关键。 1. OCR处理管线 OCR系统通常采用…...

快速上手 Metabase:从安装到高级功能实战
文章目录 1. 引言:Metabase——轻量级的数据分析工具🎯 学完本教程你能掌握: 2. 安装 Metabase:本地部署实操2.1 环境准备2.2 使用 Docker 安装 Metabase2.3 初始化设置2.4 连接外部数据库 3. 第一个数据探索:5分钟创建…...

有意向往gis开发靠,如何规划学习?
听说GIS开发工资不错、还不像互联网那么卷?心动了?但一看那些“WebGL”、“空间分析”、“OGC规范”的词儿就头大?别急! 今天咱就聊聊零基础/转行选手,咋规划学习GIS开发这条路。不整高大上,就讲实在的&am…...
理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
前言 在JavaScript面试中,map和parseInt的组合常常被用作考察候选人对这两个方法理解深度的题目。让我们通过一个简单的例子来深入探讨其中的原理。 问题现象 [1, 2, 3].map(parseInt) // 输出结果是什么?很多人可能会预期输出[1, 2, 3],但…...