软件工程之面向对象分析深度解析

前文基础:

1.软件工程学概述:软件工程学概述-CSDN博客 

2.软件过程深度解析:软件过程深度解析-CSDN博客 

3.软件工程之需求分析涉及的图与工具:软件工程之需求分析涉及的图与工具-CSDN博客 

4.软件工程之形式化说明技术深度解析:https://lzm07.blog.csdn.net/article/details/147803429 

5.软件工程之详细设计深度解析:https://blog.csdn.net/lzm12278828/article/details/147807034 

一、面向对象分析的基本过程

(一)概述

面向对象分析(Object-Oriented Analysis, OOA)是通过抽象问题域中的实体及其关系,建立系统精确模型的过程。其核心思想是将现实世界中的事物映射为对象(Object),通过封装、继承、多态等机制描述系统行为。与传统结构化分析相比,OOA更贴近人类认知方式,能有效降低复杂系统的开发难度。

OOA的目标是形成软件需求规格说明书,主要由三个子模型构成:

(1)对象模型描述系统静态结构(类、对象及其关系)。

(2)动态模型描述系统动态行为(状态变化、事件交互)。

(3)功能模型描述系统数据变换和处理逻辑

实际分析过程需反复迭代,通常遵循“理解→表达→验证”的循环:

(1)理解需求:与用户、领域专家协作,明确系统边界和功能。

(2)建立模型:通过三个子模型逐步细化需求,形成可验证的规格说明。

(2)验证模型:检查模型的一致性、完整性和可实现性,确保符合用户需求。

(二)3 个子模型与 5 个层次

1. 三个子模型

(1)对象模型:
以类图为核心,描述系统中对象的静态结构。例如,在线购物系统中的“用户”“商品”“订单”等类,以及它们之间的关联(如“用户下单”“订单包含商品”)。对象模型是系统的基础,其他模型依赖其提供的类和关系。

(2)动态模型:
以状态图和事件跟踪图为工具,描述对象的状态变化和事件交互。例如,订单的状态从“已提交”变为“已支付”再到“已发货”,需通过状态图明确触发状态转换的事件(如“用户支付”“仓库发货”)。

(3)功能模型:
以数据流图(DFD)为核心,描述系统的数据处理逻辑。例如,在线购物系统的“订单处理”功能可分解为“验证库存”“计算总价”“生成发票”等子处理,通过数据流图展示数据流动和处理过程。

2. 五个层次

复杂系统的对象模型通常包含五个层次,形成逐层细化的结构:

(1)主题层将系统划分为若干主题(如“用户管理”“订单管理”),便于理解大型模型。

(2)对象类层识别系统中的类与对象(如“用户”“商品”)。

(3)结构层定义类之间的关系(如继承、关联)。

(4)属性层为类添加属性(如“用户”的姓名、邮箱)。

(5)服务层定义类的操作(如“用户”的登录、注册)。

二、需求陈述

(一)书写要点

需求陈述是OOA的起点,需清晰、准确地描述系统功能和约束。关键要点包括:

(1)问题范围:明确系统边界,区分系统内外部实体。

(2)功能需求:列出系统必须完成的任务(如“用户可查询订单状态”)。

(3)性能需求:定义响应时间、吞吐量等指标(如“订单查询响应时间≤2 秒”)。

(4)应用环境:描述系统运行的软硬件环境(如“支持 Windows 和 macOS”)。

(5)假设条件:说明未经验证的前提(如“用户输入数据格式正确”)。

书写时应避免歧义,采用结构化语言(如“系统应允许用户……”),并优先使用动词短语描述功能。例如,“用户提交订单后,系统应发送确认邮件”比“系统要处理订单”更明确。

(二)例子:在线购物系统需求陈述

项目背景:
某电商平台需开发在线购物系统,支持用户浏览商品、下单、支付,以及管理员管理商品库存和订单。

需求陈述:

1.功能需求:

用户可注册、登录系统,浏览商品列表,查看商品详情。

用户可将商品加入购物车,修改购物车中商品的数量或删除商品。

用户提交订单后,系统应生成唯一订单号,并发送确认邮件。

管理员可添加、修改、删除商品信息,查看订单状态并更新物流信息。

2.性能需求:

商品搜索响应时间≤1 秒(数据量≤10 万条)。

订单处理吞吐量≥100 笔 / 分钟。

3.应用环境:

服务器端:Linux 操作系统,MySQL 数据库,Tomcat 应用服务器。

客户端:支持 Chrome、Firefox 等主流浏览器,移动端适配 iOS 和 Android。

4.假设条件:

用户已安装最新版本浏览器,网络连接稳定。

支付接口由第三方支付平台提供,系统无需处理支付安全问题。

三、建立对象模型

(一)确定类与对象

从需求陈述中提取名词短语,筛选出与问题域相关的类。例如,在线购物系统中的候选类包括“用户”“商品”“购物车”“订单”“支付”等。需排除冗余(如“系统”)、无关(如“网络”)或笼统(如“数据”)的类。

筛选原则:

(1)冗余类:重复表示同一概念的类(如“顾客”和“用户”)。

(2)无关类:与系统功能无关的类(如“操作系统”)。

(3)笼统类:过于抽象的类(如“实体”)。

(4)属性类:应作为属性而非类的概念(如“商品颜色”)。

(5)操作类:应作为方法而非类的概念(如“支付处理”)。

(二)确定关联

识别类之间的关系,如“用户下单”(用户与订单的关联)、“订单包含商品”(订单与商品的关联)。关联需明确重数(如“一个订单包含多个商品”)和方向(如“用户提交订单”)。

关联类型:

(1)普通关联:如“用户拥有购物车”。

(2)聚合关联:如“购物车由多个商品项组成”。

(3)继承关联:如“管理员是特殊用户”。

(三)划分主题

将类分组为主题,降低模型复杂度。例如,在线购物系统可划分为“用户管理”“商品管理”“订单管理”三个主题。主题应具有高内聚性,组内类关系紧密,组间耦合度低

(四)确定属性

为类添加描述性属性。例如,“用户”类的属性包括姓名、邮箱、地址;“商品”类的属性包括名称、价格、库存。属性应满足原子性(不可再分)和完整性(无遗漏关键信息)。

常见错误:

(1)误把对象当属性:如将“地址”作为“用户”的属性,而非独立类。

(2)属性冗余:如“订单总价”可通过“商品价格 × 数量”计算,无需存储。

(3)属性不一致:如“商品价格”在不同类中单位不统一(元 / 美元)。

(五)识别继承关系

通过泛化 - 特化关系(继承)简化类结构。例如,“管理员”是“用户”的子类,继承“用户”的属性和方法,并添加“权限管理”等特有功能。继承可减少代码冗余,提高可维护性。

继承策略:

(1)自底向上:从具体类中提取公共属性和方法,形成父类。

(2)自顶向下:从抽象父类逐步细化为具体子类。

(六)反复修改

对象模型需多次迭代优化。例如,初始模型中“订单”和“支付”是独立类,后续发现“支付”可作为“订单”的一个状态,从而合并为“订单”类的属性或子状态。

优化方法:

(1)分解复杂类:如将“现金兑换卡”分解为“卡信息”和“交易记录”。

(2)合并冗余类:如“分行”和“分行计算机”可合并为“分行”类。

(3)调整关联关系:如将三元关联拆分为二元关联。

四、建立动态模型

(一)编写脚本

描述系统典型交互场景(如“用户下单流程”),明确事件顺序和参与者。脚本需覆盖正常流程和异常情况,例如:
用户下单脚本:

(1)用户登录系统,浏览商品列表。

(2)用户选择商品,添加到购物车。

(3)用户确认订单信息,提交订单。

(4)系统验证库存,若库存不足,提示用户;否则生成订单。

(5)用户选择支付方式,完成支付。

(6)系统更新订单状态为“已支付”,并发送确认邮件。

(二)设想用户界面

设计系统的交互界面,确定用户操作方式(如按钮、菜单)和反馈机制(如提示信息)。例如,订单提交后显示“订单已提交,预计 24 小时内发货”。

(三)画事件跟踪图

以竖线表示对象,箭头表示事件,展示对象间的交互顺序。例如,用户下单的事件跟踪图如下:

用户 → 购物车:添加商品  

购物车 → 商品:查询库存  

商品 → 购物车:返回库存信息  

用户 → 系统:提交订单  

系统 → 订单:生成订单  

系统 → 支付接口:发起支付  

支付接口 → 系统:返回支付结果  

系统 → 用户:发送确认邮件  

以下是一个示例:

(四)画状态图

为关键类绘制状态图,描述其状态转换。例如,“订单”类的状态图:

初始状态 → 已提交  

已提交 → 已支付 [用户支付]  

已支付 → 已发货 [管理员发货]  

已发货 → 已完成 [用户确认收货]  

已提交 → 已取消 [用户取消订单]  

以上是一个示例:

(五)审查动态模型

检查状态图和事件跟踪图的一致性,确保事件触发的状态转换符合逻辑。例如,“已取消”状态不能直接转换为“已支付”,需通过“重新提交订单”事件触发。

五、建立功能模型

(一)画出基本系统模型图

用数据流图(DFD)描述系统与外部实体的交互。例如,在线购物系统的基本模型图:

外部实体:用户、管理员、支付平台  

处理:订单处理  

数据流:商品信息、订单请求、支付结果  

数据存储:商品库、订单库  

(二)画出功能及数据流图

逐层分解基本模型,细化处理逻辑。例如,“订单处理”可分解为“验证库存”“计算总价”“生成发票”等子处理,并用数据流连接各处理框。

0层数据流图:

用户 → 验证库存:商品ID、数量  

验证库存 → 商品库:查询库存  

商品库 → 验证库存:库存信息  

验证库存 → 计算总价:商品价格、数量  

计算总价 → 生成发票:订单金额  

生成发票 → 订单库:保存订单  

以下是数据流图的一个示例:

(三)描述处理框功能

用结构化语言或判定表详细说明每个处理框的逻辑。例如,“验证库存”处理框的逻辑:

IF 库存 ≥ 订单数量 THEN  

    返回库存充足 

ELSE  

    返回库存不足 

ENDIF  

六、定义服务

(一)常规行为

为类定义通用操作,如“用户”类的“登录”“注册”,“订单”类的“提交”“取消”。这些操作直接对应动态模型中的事件和状态转换。

(二)从事件导出的操作

根据事件跟踪图中的交互,确定对象需提供的方法。例如,“用户添加商品到购物车”事件对应“购物车”类的“添加商品”方法。

(三)与数据流图对应

将数据流图中的处理框映射为对象的操作。例如,“计算总价”处理框对应“订单”类的“计算总价”方法,该方法调用“商品”类的“获取价格”方法。

(四)利用继承减少冗余

通过继承机制复用父类服务。例如,“管理员”类继承“用户”类的“登录”方法,并添加“修改商品信息”等特有方法。

java代码示例:

// 父类:用户  public class User {  private String name;  private String email;  public void login(String username, String password) {  // 登录逻辑  }  }  // 子类:管理员  public class Admin extends User {  public void updateProduct(Product product) {  // 修改商品信息逻辑  }  } 

 

七、结语

面向对象分析通过三个子模型和五个层次,将用户需求转化为可执行的系统模型。实际应用中需注意:

(1)模型迭代:分析过程需反复优化,避免过早陷入细节。

(2)工具辅助:使用 UML 类图、状态图、DFD 等工具提高建模效率。

(3)跨模型关联:确保对象模型、动态模型、功能模型的一致性,例如对象的属性和操作需在数据流图中体现。

(4)领域知识:结合行业经验识别关键类和关系,例如金融系统需重点关注“账户”“交易”等类。

未来,随着AI辅助建模工具的发展,面向对象分析将更高效、智能化,进一步降低复杂系统的开发门槛。

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

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

相关文章

需求分析阶段测试工程师主要做哪些事情

在软件测试需求分析阶段,主要围绕确定测试范围、明确测试目标、细化测试内容等方面开展工作,为后续测试计划的制定、测试用例的设计以及测试执行提供清晰、准确的依据。以下是该阶段具体要做的事情: 1. 需求收集与整理 收集需求文档&#x…

vLLM部署Qwen2-7B模型推理

vllm简介 vLLM是一个高效的大语言模型推理和部署服务系统,专为大型语言模型的高效执行而设计。它不仅支持多种量化技术以减少模型大小和加速推理过程,还提供了与OpenAI API兼容的服务接口,使得现有的应用程序能够无缝对接。 一、前提环境 …

【STM32 学习笔记】GPIO输入与输出

GPIO详解 一、GPIO基本概念 GPIO(通用输入输出)是微控制器与外部设备交互的核心接口,具有以下特性: 可编程控制输入/输出模式支持数字信号的读取与输出集成多种保护机制复用功能支持片上外设连接 二、GPIO位结构解析 2.1 保护二…

安科瑞光伏综自系统在新能源电站中的应用及调度上传方案研究

摘要 随着全球对清洁能源需求的不断增长,光伏发电作为一种可持续的能源解决方案,正迅速发展。光伏综合自动化系统(综自系统)在确保光伏电站高效、稳定运行方面起着关键作用。本文详细介绍了安科瑞光伏综自系统,包括其背…

[python] 函数2-匿名函数

一 匿名函数 格式: 函数名 lambda 形参 : 返回值(表达式) 调用: 结果 函数名(实参) 一般只有一行代码,他是对def定义函数的一种简化,只能实现简单的逻辑 逻辑复杂时不要使用lambda add lambda a,b: ab # a,b就是形参 print(add(2,5)) 1.1 无参数 noargs_func lambda…

深入理解C/C++内存管理:从基础到高级优化实践

一、内存区域划分与基础管理机制​​ ​​栈(Stack)​​ 栈由系统自动管理,用于存储函数调用时的局部变量、参数及返回地址。其特点是高效但空间有限(通常1-8MB),遵循后进先出(LIFO)…

kafka 面试总结

Kafka的幂等性是一种机制,确保生产者发送的每条消息在Broker端只被持久化一次,即使生产者因网络问题等原因重试发送,也不会导致消息重复。 实现原理 生产者ID(PID) 每个生产者实例在初始化时,会被分配一个…

uniapp|实现多终端聊天对话组件、表情选择、消息发送

基于UniApp框架,实现跨平台多终端适配的聊天对话组件开发、表情选择交互设计及消息发送,支持文本与表情混合渲染。 目录 聊天界面静态组件实现消息列表布局消息气泡双向布局辅助元素定位与样式静态数据模拟与扩展性设计表情选择器静态模块浮层实现符号网格排列多端样式适配方…

LabVIEW超声波液位计检定

在工业生产、运输和存储等环节,液位计的应用十分广泛,其中超声波液位计作为非接触式液位测量设备备受青睐。然而,传统立式水槽式液位计检定装置存在受建筑高度影响、量程范围受限、流程耗时长等问题,无法满足大量程超声波液位计的…

C++漫步结构与平衡的殿堂:AVL树

文章目录 1.AVL树的概念2.AVL树的结构3.AVL树的插入4.AVL树的旋转4.1 左单旋4.2 右单旋4.3 右左双旋4.4 左右双旋 5.AVL树的删除6.AVL树的高度7.AVL树的平衡判断希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 二叉搜索树有其自身的缺陷&#xf…

Verilog Test Fixture 时钟激励

1、占空比50%时钟产生 always begin<clock> 1b0 ;#<PERIOD/2> ;<clock> 1b1 ;#<PERIOD/2> ; end reg <clock> 1b0 ;alwaysbegin#<PERIOD/2> ;<clock> ~<clock> ;end 2…

从人体姿态到机械臂轨迹:基于深度学习的Kinova远程操控系统架构解析

在工业自动化、医疗辅助、灾难救援与太空探索等前沿领域&#xff0c;Kinova轻型机械臂凭借7自由度关节设计和出色负载能力脱颖而出。它能精准完成物体抓取、复杂装配和精细操作等任务。然而&#xff0c;实现人类操作者对Kinova机械臂的直观高效远程控制一直是技术难题。传统远程…

探秘数据中台:五大核心平台的功能全景解析

数据中台作为企业数据资产的 “智慧中枢”&#xff0c;通过整合数据处理全流程的核心功能&#xff0c;实现数据价值的深度挖掘与高效应用。以下从五大核心平台出发&#xff0c;全面拆解数据中台的功能架构与应用价值。 一、数据可视化平台&#xff1a;让数据 “开口说话” 1.…

深度 |提“智”向新,奔向未来——当前机器人产业观察

机器人踏着“猫步”在T台走秀、进入工厂协助造车&#xff0c;教育、医疗、城市管理等领域都有了机器人的帮助……今天&#xff0c;机器人已得到广泛应用&#xff0c;走进你我的生活。    伴随着技术日新月异&#xff0c;机器人产业加快提“智”向新。特别是今年以来&#xf…

桥隧坡灾害监测报警:用科技筑起生命安全的“智能防线”

.2024年&#xff0c;梅大高速茶阳路段高边坡塌方事件造成重大伤亡&#xff0c;举国痛心。这场悲剧再次敲响警钟&#xff1a;桥梁、隧道、边坡等高风险区域的实时监测与精准报警&#xff0c;已成为交通安全的生命线。如何用技术手段在灾害发生前“抢跑”&#xff0c;第一时间阻断…

【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`

摘要 昨天&#xff0c; 我在让一个小朋友给我整理一次培训的视频的时候&#xff0c;我看到他把视频文件放到剪映里面处理。 我以为他要干什么呢&#xff0c; 还很期待&#xff0c;结果他只是为了导出音频而已。 于是就有了今天的这篇博客。 作为音视频处理领域的常用需求&…

PDF转长图工具

市面上的PDF转换工具数不胜数&#xff0c;福昕PDF、万兴PDF、Adobe Acrobat&#xff08;DC&#xff09;、PDF24等众多软件都具备PDF转图片的功能。然而&#xff0c;这些知名软件大多只能将单页PDF转换为单张图片&#xff0c;若要将PDF整体转换为一张长图&#xff0c;似乎并无此…

【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)

前言 前面咱们已经把 YOLOv1 和 YOLOv2 的老底都给掀了&#xff0c;今天轮到 YOLOv3 登场&#xff0c;这可是 Joseph Redmon 的“封神之作”。讲真&#xff0c;这哥们本来是搞学术的&#xff0c;结果研究的模型被某些军方拿去“整点活”——不是做人是做武器的那种活。于是他一…

算法攻略:接雨水问题的深度解析

算法攻略:接雨水问题的深度解析 一、引言 在算法的领域中,“接雨水”问题是一道经典且富有挑战性的题目。它不仅考查对数组操作的理解,更需要巧妙运用算法思想来解决看似复杂的实际场景问题。通过深入研究这一问题,我们能提升算法思维和编程能力,更好地应对各类算法难题。…

【Linux】Linux工具(1)

3.Linux工具&#xff08;1&#xff09; 文章目录 3.Linux工具&#xff08;1&#xff09;Linux 软件包管理器 yum什么是软件包关于 rzsz查看软件包——yum list命令如何安装软件如何卸载软件补充——yum如何找到要安装软件的下载地址 Linux开发工具Linux编辑器-vim使用1.vim的基…