软件工程(4)面向对象方法:面向对象软件工程OOSE与案例实践
OOSE(Object-Oriented Software Engineering,面向对象软件工程)是一种用于开发软件系统的工程方法论,它强调使用面向对象的技术和方法来设计和实现软件。OOSE 方法是由 Ivar Jacobson 提出的,主要包括以下几个关键方面:
1. 用例驱动(Use-Case Driven)
- 用例(Use Case) 是描述系统如何与外部用户或其他系统交互的一种方式。用例驱动意味着开发过程围绕用例进行,首先识别系统的用例,并基于这些用例设计和实现系统。
- 用例图(Use Case Diagram) 是用来表示用例和系统参与者之间关系的图示工具。
2. 模型驱动(Model Driven)
- 在OOSE中,软件开发过程依赖于创建和维护多个模型,这些模型描述系统的不同方面。主要的模型包括用例模型、类模型、顺序模型、状态模型等。
- 类图(Class Diagram) 显示系统中的类及其关系。
- 顺序图(Sequence Diagram) 描述对象之间的交互顺序。
- 状态图(State Diagram) 显示对象的状态变化。
3. 迭代增量(Iterative and Incremental)
- 开发过程被划分为多个迭代,每个迭代都产出一个可工作的增量。每个增量都是系统的一部分,并且通过反复迭代不断改进和扩展系统。
- 这种方法允许在开发过程中进行反馈和调整。
4. 面向对象的分析与设计(Object-Oriented Analysis and Design)
- 面向对象分析(OOA) 是分析阶段,通过识别和定义对象及其关系来理解系统的需求。
- 面向对象设计(OOD) 是设计阶段,基于分析阶段的成果,设计系统的架构和组件。
OOSE 的实践案例
案例1:图书管理系统
-
用例识别
- 主要用例:借书、还书、添加新书、删除书籍、查询书籍等。
- 参与者:读者、图书管理员、系统。
-
用例图设计
- 绘制用例图,展示读者和管理员如何与系统交互。
- 例:读者可以进行“借书”和“还书”操作;管理员可以进行“添加新书”和“删除书籍”操作。
-
类模型
- 类:书籍(Book)、读者(Reader)、图书管理员(Librarian)、借书记录(BorrowRecord)等。
- 关系:书籍与借书记录之间存在一对多关系;读者与借书记录之间也存在一对多关系。
-
顺序图
- 设计借书用例的顺序图,展示读者如何请求借书,系统如何处理请求并更新借书记录。
-
状态图
- 设计书籍的状态图,例如:书籍的状态可能包括“在馆”、“已借出”、“维护中”等。
-
迭代开发
- 每个迭代增加一个功能或改进现有功能,如第一个迭代完成基本的借书功能,第二个迭代增加还书功能,第三个迭代改进查询功能等
具体细化实践
图书管理系统案例详细实践
1. 用例识别
目标:确定系统的主要功能和参与者。
参与者:
- 读者:可以借书、还书、查询书籍。
- 图书管理员:可以添加新书、删除书籍、管理借还记录。
- 系统:负责处理所有操作和管理数据。
主要用例:
- 借书:读者可以选择书籍并进行借阅。
- 还书:读者将书籍归还给图书馆。
- 添加新书:管理员将新书添加到系统中。
- 删除书籍:管理员删除不再使用的书籍。
- 查询书籍:读者或管理员查询书籍的可用性及详细信息。
- 查看借阅记录:管理员查看借阅记录,了解书籍的借出情况。
2. 用例图设计
用例图帮助可视化用例与参与者之间的关系。
-
借书用例:
- 参与者:读者
- 用例:借书
- 描述:读者选择要借的书籍,系统检查书籍是否可借,并记录借阅信息。
-
添加新书用例:
- 参与者:图书管理员
- 用例:添加新书
- 描述:管理员输入书籍的详细信息(如标题、作者、ISBN、类别)并将其添加到系统中。
用例图示例:
+-------------------+
| 读者 |
+-------------------+||v
+-------------------+
| 借书用例 |
+-------------------+||v
+-------------------+
| 系统 |
+-------------------+||v
+-------------------+
| 查询书籍 |
+-------------------+
3. 类模型
类模型展示了系统中的主要类及其关系。
主要类:
-
Book:书籍
- 属性:
title,author,ISBN,category,status - 方法:
checkAvailability(),updateStatus()
- 属性:
-
Reader:读者
- 属性:
name,readerID,borrowedBooks - 方法:
borrowBook(),returnBook()
- 属性:
-
Librarian:图书管理员
- 属性:
name,librarianID - 方法:
addBook(),removeBook(),manageRecords()
- 属性:
-
BorrowRecord:借阅记录
- 属性:
recordID,book,reader,borrowDate,returnDate - 方法:
createRecord(),updateRecord()
- 属性:
类图示例:
+-------------------+
| 读者 |
+-------------------+||v
+-------------------+
| 借书用例 |
+-------------------+||v
+-------------------+
| 系统 |
+-------------------+||v
+-------------------+
| 查询书籍 |
+-------------------+
4. 顺序图
顺序图展示了用例的动态行为,即对象之间的交互顺序。
借书用例顺序图:
Reader System Book| | ||-------borrowBook()--->| || |---checkAvailability()--->|| |<--availability status---||<---confirmation-------| || | |
描述:
- 读者请求借书。
- 系统调用书籍对象的
checkAvailability()方法,检查书籍是否可借。 - 系统根据检查结果返回借书确认信息给读者。
5. 状态图
状态图展示了对象在其生命周期中的状态变化。
书籍状态图:
+------------------+
| Available |
+------------------+|| borrowv
+------------------+
| Borrowed |
+------------------+|| returnv
+------------------+
| Available |
+------------------+
描述:
- Available:书籍可借状态。
- Borrowed:书籍已被借出状态,不能借阅。
- 状态变更:从“Available”到“Borrowed”是借书操作,从“Borrowed”到“Available”是还书操作。
6. 迭代开发
第一迭代:实现基本的借书和还书功能。
- 目标:开发借书和还书用例,包括用例图、类图、顺序图和状态图的设计。
- 实现:提供基础的借书和还书功能,记录借阅信息。
第二迭代:实现书籍管理功能。
- 目标:开发添加新书和删除书籍功能。
- 实现:提供管理员界面,用于添加和删除书籍。
第三迭代:实现查询功能和用户界面改进。
- 目标:添加书籍查询功能和改进用户界面。
- 实现:实现书籍查询功能,优化用户体验,添加反馈机制。
通过这种详细的分步实施,可以有效地将OOSE方法应用于实际的项目开发中,使得软件系统的设计和实现过程更为清晰和高效。
相关文章:
软件工程(4)面向对象方法:面向对象软件工程OOSE与案例实践
OOSE(Object-Oriented Software Engineering,面向对象软件工程)是一种用于开发软件系统的工程方法论,它强调使用面向对象的技术和方法来设计和实现软件。OOSE 方法是由 Ivar Jacobson 提出的,主要包括以下几个关键方面…...
【数据结构篇】~链表算法题1(含快慢指针的解析)
前言 关于环形指针与快慢指针是算法题中的常客,如果能掌握将是我们的一大助力! 1.快慢指针 1 移除链表元素 https://leetcode.cn/problems/remove-linked-list-elements/description/ 1)思路 这道题可以用一个新链表来保存原链表中不…...
洛谷 P1135 奇怪的电梯
链接直达:P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 题目来源 洛谷 题目内容 奇怪的电梯 题目背景 感谢 yummy 提供的一些数据。 题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯&…...
vue使用axios请求后端数据
前后端分离项目的基础: 前后端跨域访问 vite.config.js中加入 // 1.为什么要跨域 //因为浏览器的同源策略,不同站点之间访问需要跨域 //实现跨域的方式:server: {proxy: {// 假设要跨域访问的后端 API 地址以 /api 开头/api: { //表示拦截以/api开头的…...
目标检测 | yolov10 原理和介绍
相关系列: 目标检测 | yolov1 原理和介绍 目标检测 | yolov2/yolo9000 原理和介绍 目标检测 | yolov3 原理和介绍 目标检测 | yolov4 原理和介绍 目标检测 | yolov5 原理和介绍 目标检测 | yolov6 原理和介绍 目标检测 | yolov7 原理和介绍 目标检测 | yolov8 原理和…...
基于Springboot 和Vue 的高校宿舍管理系统源码
网络上很多宿舍管理系统都不完整,大多数缺少数据库文件,所在使用极其不方便,由于本人程序员,根据代码,自己花时间不全了数据库文件,并且可以完美运行!!!!&…...
3:2比例的程序员专业显示器,效率提升显著,摸鱼时间又多了
对于我们程序员来说,显示器的重要性不言而喻,作为我们与代码交流的直接工具,他影响着我们的工作效率、舒适度和整体编程体验。我在家用的是自己笔记本的屏幕,简单写写代码还行,涉及到多任务协同或者大代码量开发就有点…...
vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字
如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…...
算法4:前缀和(上)
文章目录 一维前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积 一维前缀和 二维前缀和 寻找数组的中心下标 class Solution { public:int pivotIndex(vector<int>& nums) {int n nums.size();vector<int> f(n), g(n);f[0] nums[0];g[n - 1] num…...
美国政府紧急应对三星Galaxy手机安全漏洞
一、美国政府紧急通知更新三星Galaxy手机系统 美国政府近日发布紧急通知,要求联邦政府雇员在8月28日前更新三星Galaxy手机系统,否则将面临禁止使用这些设备的后果。这是继7月针对Pixel手机用户的类似要求之后的又一次紧急行动。此次事件的导火索是谷歌发…...
看 逆行人生
电影和我的职业本身有相关性,而且我特别喜欢徐峥执导的电影,这次的题材也算是碰上自己的胃口。 周六,下了大半天的雨,早上驱车到公司加班,下午六点多到时候特别想去看电影,果断再驱车从公司赶回来ÿ…...
0819、0820梳理及一些面试题梳理
一、抓包分析 二、HTTP服务器 三、动态库与静态库 四、一些面试题 指针数组和数组指针的区别:指针数组本质是一个数组,只是数组中存储的是指针变量。数组指针存储的是该数组的起始地址,对该指针来说每偏移一个单位就是偏移了一整个数组的地…...
HttpUtils工具类(一)常见的HttpUtils工具类及如何自定义java的http连接池
目录 一、几种常见的Http调用方式 1. 使用 Apache HttpClient 2. 使用 OKhttpClient 3. 使用第三方库(Hutool)的http链接池 4. 使用 Spring RestTemplate 5. 使用 Java 原生的HttpURLConnection 二、总结 常用三种HttpUtils对比总结 一、几种常见…...
使用 Lombok 遇到一个问题
起因是换了一个电脑,重新从服务器上拉了一个项目。项目是由maven构建的,在控制台中使用mvn命令编译项目时,没有任何问题,编译成功。如下图: 可是idea里面的源码,却标红了,如下: 错误…...
Linux基础环境开发工具gcc/g++ make/Makefile
1.Linux编译器-gcc/g使用 1. 预处理(进行宏替换) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标…...
ES 模糊查询 wildcard 的替代方案探索
一、Wildcard 概述 Wildcard 是一种支持通配符的模糊检索方式。在 Elasticsearch 中,它使用星号 * 代表零个或多个字符,问号 ? 代表单个字符。 其使用方式多样,例如可以通过 {"wildcard": {"field_name": "value&…...
Linux安装MQTT 服务器(图文教程)
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽和不稳定的网络环境设计,非常适合物联网(IoT)应用。 官网地址:https://www.emqx.com/ 一、版本选择 根据自己…...
【TCP】核心机制:延时应答、捎带应答和面向字节流
文章目录 延时应答捎带应答面向字节流粘包问题方案一:指定分隔符方案二:指定数据的长度 TCP 报头首部长度保留(6 位)选项序号确认序号 延时应答 尽可能降低可靠传输带来的性能影响 提升性能>让滑动窗口变大 如果我们立即返回 …...
题解:AT_abc352_e [ABC352E] Clique Connect
[题目通道]([ABC352E] Clique Connect - 洛谷) 鄙人今日写人生第一篇题解 希望管理大大通过 首先,我们先看题: 它说一共有n个点,m回操作。。。 每次操作 都有 一个Ki 和 Ci Ki代表有Ki个点,Ci代表每条边所赋的边权 一看就知道这是个最小生成树的板子…...
【代码随想录训练营第42期 Day32打卡 - 从零开始动态规划 - LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
目录 一、做题心得 二、动规五步走 三、题目与题解 题目一:509. 斐波那契数 题目链接 题解1:记忆性递归 题解2:动态规划 题目二:70. 爬楼梯 题目链接 题解:动态规划 题目三:746. 使用最小花费爬楼…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
