📌目录
- [⚖️ 面向对象分析的基本任务与分析过程](#⚖️ 面向对象分析的基本任务与分析过程)
-
- [🎯 一、面向对象分析概述](#🎯 一、面向对象分析概述)
- [📦 二、面向对象分析的基本任务](#📦 二、面向对象分析的基本任务)
- [🌐 三、面向对象分析的过程](#🌐 三、面向对象分析的过程)
- [💡 四、面向对象分析的方法](#💡 四、面向对象分析的方法)
- [📊 五、面向对象分析的工具](#📊 五、面向对象分析的工具)
-
- (一)工具概览
- [(二)Rational Rose](#(二)Rational Rose)
- [(三)Enterprise Architect](#(三)Enterprise Architect)
- (四)PlantUML
- [📋 六、面向对象分析的应用](#📋 六、面向对象分析的应用)
- [📝 总结](#📝 总结)

⚖️ 面向对象分析的基本任务与分析过程
面向对象分析(Object-Oriented Analysis, OOA)是面向对象方法的第一步,它通过面向对象的概念和原则来分析系统需求,建立系统的对象模型。本文将详细介绍面向对象分析的基本任务与分析过程。

🎯 一、面向对象分析概述
(一)面向对象分析的定义
面向对象分析(OOA)是面向对象方法的第一步,它通过面向对象的概念和原则来分析系统需求,建立系统的对象模型。
OOA概念:
#mermaid-svg-hvi0n5Kh8bvbJb4W{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hvi0n5Kh8bvbJb4W .error-icon{fill:#552222;}#mermaid-svg-hvi0n5Kh8bvbJb4W .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hvi0n5Kh8bvbJb4W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .marker.cross{stroke:#333333;}#mermaid-svg-hvi0n5Kh8bvbJb4W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hvi0n5Kh8bvbJb4W p{margin:0;}#mermaid-svg-hvi0n5Kh8bvbJb4W .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .cluster-label text{fill:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .cluster-label span{color:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .cluster-label span p{background-color:transparent;}#mermaid-svg-hvi0n5Kh8bvbJb4W .label text,#mermaid-svg-hvi0n5Kh8bvbJb4W span{fill:#333;color:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .node rect,#mermaid-svg-hvi0n5Kh8bvbJb4W .node circle,#mermaid-svg-hvi0n5Kh8bvbJb4W .node ellipse,#mermaid-svg-hvi0n5Kh8bvbJb4W .node polygon,#mermaid-svg-hvi0n5Kh8bvbJb4W .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .rough-node .label text,#mermaid-svg-hvi0n5Kh8bvbJb4W .node .label text,#mermaid-svg-hvi0n5Kh8bvbJb4W .image-shape .label,#mermaid-svg-hvi0n5Kh8bvbJb4W .icon-shape .label{text-anchor:middle;}#mermaid-svg-hvi0n5Kh8bvbJb4W .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .rough-node .label,#mermaid-svg-hvi0n5Kh8bvbJb4W .node .label,#mermaid-svg-hvi0n5Kh8bvbJb4W .image-shape .label,#mermaid-svg-hvi0n5Kh8bvbJb4W .icon-shape .label{text-align:center;}#mermaid-svg-hvi0n5Kh8bvbJb4W .node.clickable{cursor:pointer;}#mermaid-svg-hvi0n5Kh8bvbJb4W .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .arrowheadPath{fill:#333333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hvi0n5Kh8bvbJb4W .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hvi0n5Kh8bvbJb4W .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hvi0n5Kh8bvbJb4W .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hvi0n5Kh8bvbJb4W .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .cluster text{fill:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W .cluster span{color:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hvi0n5Kh8bvbJb4W .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hvi0n5Kh8bvbJb4W rect.text{fill:none;stroke-width:0;}#mermaid-svg-hvi0n5Kh8bvbJb4W .icon-shape,#mermaid-svg-hvi0n5Kh8bvbJb4W .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hvi0n5Kh8bvbJb4W .icon-shape p,#mermaid-svg-hvi0n5Kh8bvbJb4W .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hvi0n5Kh8bvbJb4W .icon-shape .label rect,#mermaid-svg-hvi0n5Kh8bvbJb4W .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hvi0n5Kh8bvbJb4W .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hvi0n5Kh8bvbJb4W .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hvi0n5Kh8bvbJb4W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 面向对象分析
需求分析
对象识别
模型建立
理解需求
识别对象
建立模型
(二)面向对象分析的目标
OOA目标:
| 目标 | 说明 |
|---|---|
| 理解需求 | 深入理解系统需求 |
| 识别对象 | 识别系统中的对象 |
| 建立模型 | 建立系统的对象模型 |
| 验证需求 | 验证需求的正确性 |
(三)面向对象分析的特点
OOA特点:
| 特点 | 说明 |
|---|---|
| 封装性 | 信息隐藏 |
| 抽象性 | 抽取本质 |
| 继承性 | 代码重用 |
| 多态性 | 灵活扩展 |
| 一致性 | 统一模型 |
📦 二、面向对象分析的基本任务
(一)基本任务概览
基本任务:
#mermaid-svg-K5Sxoy5oUBTEO8VA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-K5Sxoy5oUBTEO8VA .error-icon{fill:#552222;}#mermaid-svg-K5Sxoy5oUBTEO8VA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-K5Sxoy5oUBTEO8VA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .marker.cross{stroke:#333333;}#mermaid-svg-K5Sxoy5oUBTEO8VA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-K5Sxoy5oUBTEO8VA p{margin:0;}#mermaid-svg-K5Sxoy5oUBTEO8VA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .cluster-label text{fill:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .cluster-label span{color:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .cluster-label span p{background-color:transparent;}#mermaid-svg-K5Sxoy5oUBTEO8VA .label text,#mermaid-svg-K5Sxoy5oUBTEO8VA span{fill:#333;color:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .node rect,#mermaid-svg-K5Sxoy5oUBTEO8VA .node circle,#mermaid-svg-K5Sxoy5oUBTEO8VA .node ellipse,#mermaid-svg-K5Sxoy5oUBTEO8VA .node polygon,#mermaid-svg-K5Sxoy5oUBTEO8VA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .rough-node .label text,#mermaid-svg-K5Sxoy5oUBTEO8VA .node .label text,#mermaid-svg-K5Sxoy5oUBTEO8VA .image-shape .label,#mermaid-svg-K5Sxoy5oUBTEO8VA .icon-shape .label{text-anchor:middle;}#mermaid-svg-K5Sxoy5oUBTEO8VA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .rough-node .label,#mermaid-svg-K5Sxoy5oUBTEO8VA .node .label,#mermaid-svg-K5Sxoy5oUBTEO8VA .image-shape .label,#mermaid-svg-K5Sxoy5oUBTEO8VA .icon-shape .label{text-align:center;}#mermaid-svg-K5Sxoy5oUBTEO8VA .node.clickable{cursor:pointer;}#mermaid-svg-K5Sxoy5oUBTEO8VA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .arrowheadPath{fill:#333333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-K5Sxoy5oUBTEO8VA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-K5Sxoy5oUBTEO8VA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-K5Sxoy5oUBTEO8VA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-K5Sxoy5oUBTEO8VA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .cluster text{fill:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA .cluster span{color:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-K5Sxoy5oUBTEO8VA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-K5Sxoy5oUBTEO8VA rect.text{fill:none;stroke-width:0;}#mermaid-svg-K5Sxoy5oUBTEO8VA .icon-shape,#mermaid-svg-K5Sxoy5oUBTEO8VA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-K5Sxoy5oUBTEO8VA .icon-shape p,#mermaid-svg-K5Sxoy5oUBTEO8VA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-K5Sxoy5oUBTEO8VA .icon-shape .label rect,#mermaid-svg-K5Sxoy5oUBTEO8VA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-K5Sxoy5oUBTEO8VA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-K5Sxoy5oUBTEO8VA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-K5Sxoy5oUBTEO8VA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基本任务
需求收集
对象识别
类定义
关系识别
模型建立
模型验证
收集需求
识别对象
定义类
识别关系
建立模型
验证模型
(二)任务一:需求收集
需求收集任务:
| 任务 | 说明 |
|---|---|
| 需求收集 | 收集用户需求 |
| 需求分析 | 分析需求可行性 |
| 需求规格 | 编写需求规格说明书 |
| 需求验证 | 验证需求正确性 |
需求收集方法:
| 方法 | 说明 |
|---|---|
| 访谈 | 与用户访谈 |
| 问卷 | 发放问卷 |
| 观察 | 观察用户操作 |
| 文档 | 分析现有文档 |
| 原型 | 构建原型 |
需求收集示例:
python
# 需求收集
# 项目:图书馆管理系统
#
# 用户访谈记录:
# - 图书管理员:需要管理图书信息、读者信息、借阅记录
# - 读者:需要查询图书、借阅图书、归还图书
# - 系统管理员:需要管理用户、系统配置
#
# 需求列表:
# 1. 图书管理
# - 添加图书
# - 修改图书信息
# - 删除图书
# - 查询图书
# 2. 读者管理
# - 添加读者
# - 修改读者信息
# - 删除读者
# - 查询读者
# 3. 借阅管理
# - 借阅图书
# - 归还图书
# - 续借图书
# - 查询借阅记录
(三)任务二:对象识别
对象识别任务:
| 任务 | 说明 |
|---|---|
| 名词分析 | 分析需求中的名词 |
| 场景分析 | 分析使用场景 |
| 领域分析 | 分析领域知识 |
| 模式识别 | 识别常见模式 |
对象识别方法:
| 方法 | 说明 |
|---|---|
| 名词分析 | 分析需求中的名词 |
| 场景分析 | 分析使用场景 |
| 领域分析 | 分析领域知识 |
| 模式识别 | 识别常见模式 |
对象识别示例:
python
# 名词分析
# 需求文档中的名词:
# - 图书、读者、借阅、管理员、分类、书架
#
# 识别对象:
# - Book(图书)
# - Reader(读者)
# - BorrowRecord(借阅记录)
# - Librarian(管理员)
# - Category(分类)
# - Shelf(书架)
# 场景分析
# 场景1:读者借阅图书
# - 参与者:读者、图书、借阅记录
# - 动作:查询图书、借阅图书、生成借阅记录
#
# 场景2:读者归还图书
# - 参与者:读者、图书、借阅记录
# - 动作:查询借阅记录、归还图书、更新借阅记录
(四)任务三:类定义
类定义任务:
| 任务 | 说明 |
|---|---|
| 属性定义 | 定义类的数据成员 |
| 方法定义 | 定义类的操作行为 |
| 约束定义 | 定义类的约束条件 |
| 关系定义 | 定义类之间的关系 |
类定义示例:
python
# Book类
class Book:
def __init__(self, book_id, title, author, isbn, category):
# 属性
self.book_id = book_id
self.title = title
self.author = author
self.isbn = isbn
self.category = category
self.is_borrowed = False
self.borrower = None
# 方法
def borrow(self, reader):
if not self.is_borrowed:
self.is_borrowed = True
self.borrower = reader
return True
return False
def return_book(self):
self.is_borrowed = False
self.borrower = None
def get_info(self):
status = "已借出" if self.is_borrowed else "可借阅"
return f"《{self.title}》- {self.author} [{status}]"
# Reader类
class Reader:
def __init__(self, reader_id, name, max_books=5):
# 属性
self.reader_id = reader_id
self.name = name
self.max_books = max_books
self.borrowed_books = []
# 方法
def borrow_book(self, book):
if len(self.borrowed_books) < self.max_books:
if book.borrow(self):
self.borrowed_books.append(book)
return True
return False
def return_book(self, book):
if book in self.borrowed_books:
book.return_book()
self.borrowed_books.remove(book)
return True
return False
(五)任务四:关系识别
关系识别任务:
| 任务 | 说明 |
|---|---|
| 关联识别 | 识别一般关系 |
| 聚合识别 | 识别整体部分关系 |
| 组合识别 | 识别强整体部分关系 |
| 继承识别 | 识别泛化关系 |
| 依赖识别 | 识别使用关系 |
关系类型:
| 关系 | 说明 |
|---|---|
| 关联 | 一般关系 |
| 聚合 | 整体部分关系 |
| 组合 | 强整体部分关系 |
| 继承 | 泛化关系 |
| 依赖 | 使用关系 |
关系识别示例:
python
# 关系识别
class Book:
def __init__(self, book_id, title, category):
self.book_id = book_id
self.title = title
self.category = category # 关联:图书关联分类
class Reader:
def __init__(self, reader_id, name):
self.reader_id = reader_id
self.name = name
self.borrowed_books = [] # 关联:读者关联图书
class Library:
def __init__(self, name):
self.name = name
self.books = [] # 聚合:图书馆聚合图书
self.readers = [] # 聚合:图书馆聚合读者
class BorrowRecord:
def __init__(self, reader, book):
self.reader = reader # 组合:借阅记录组合读者
self.book = book # 组合:借阅记录组合图书
(六)任务五:模型建立
模型建立任务:
| 任务 | 说明 |
|---|---|
| 类图建立 | 描述类及其关系 |
| 对象图建立 | 描述对象实例 |
| 用例图建立 | 描述系统功能 |
| 顺序图建立 | 描述对象交互 |
模型建立示例:
#mermaid-svg-5gheoOsUjxSCPJK1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5gheoOsUjxSCPJK1 .error-icon{fill:#552222;}#mermaid-svg-5gheoOsUjxSCPJK1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5gheoOsUjxSCPJK1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5gheoOsUjxSCPJK1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5gheoOsUjxSCPJK1 .marker.cross{stroke:#333333;}#mermaid-svg-5gheoOsUjxSCPJK1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5gheoOsUjxSCPJK1 p{margin:0;}#mermaid-svg-5gheoOsUjxSCPJK1 g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-5gheoOsUjxSCPJK1 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-5gheoOsUjxSCPJK1 .cluster-label text{fill:#333;}#mermaid-svg-5gheoOsUjxSCPJK1 .cluster-label span{color:#333;}#mermaid-svg-5gheoOsUjxSCPJK1 .cluster-label span p{background-color:transparent;}#mermaid-svg-5gheoOsUjxSCPJK1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5gheoOsUjxSCPJK1 .cluster text{fill:#333;}#mermaid-svg-5gheoOsUjxSCPJK1 .cluster span{color:#333;}#mermaid-svg-5gheoOsUjxSCPJK1 .nodeLabel,#mermaid-svg-5gheoOsUjxSCPJK1 .edgeLabel{color:#131300;}#mermaid-svg-5gheoOsUjxSCPJK1 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-5gheoOsUjxSCPJK1 .label text{fill:#131300;}#mermaid-svg-5gheoOsUjxSCPJK1 .labelBkg{background:#ECECFF;}#mermaid-svg-5gheoOsUjxSCPJK1 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-5gheoOsUjxSCPJK1 .classTitle{font-weight:bolder;}#mermaid-svg-5gheoOsUjxSCPJK1 .node rect,#mermaid-svg-5gheoOsUjxSCPJK1 .node circle,#mermaid-svg-5gheoOsUjxSCPJK1 .node ellipse,#mermaid-svg-5gheoOsUjxSCPJK1 .node polygon,#mermaid-svg-5gheoOsUjxSCPJK1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5gheoOsUjxSCPJK1 .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 g.clickable{cursor:pointer;}#mermaid-svg-5gheoOsUjxSCPJK1 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-5gheoOsUjxSCPJK1 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-5gheoOsUjxSCPJK1 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-5gheoOsUjxSCPJK1 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-5gheoOsUjxSCPJK1 .dashed-line{stroke-dasharray:3;}#mermaid-svg-5gheoOsUjxSCPJK1 .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-5gheoOsUjxSCPJK1 #compositionStart,#mermaid-svg-5gheoOsUjxSCPJK1 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #compositionEnd,#mermaid-svg-5gheoOsUjxSCPJK1 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #dependencyStart,#mermaid-svg-5gheoOsUjxSCPJK1 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #dependencyStart,#mermaid-svg-5gheoOsUjxSCPJK1 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #extensionStart,#mermaid-svg-5gheoOsUjxSCPJK1 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #extensionEnd,#mermaid-svg-5gheoOsUjxSCPJK1 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #aggregationStart,#mermaid-svg-5gheoOsUjxSCPJK1 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #aggregationEnd,#mermaid-svg-5gheoOsUjxSCPJK1 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #lollipopStart,#mermaid-svg-5gheoOsUjxSCPJK1 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 #lollipopEnd,#mermaid-svg-5gheoOsUjxSCPJK1 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5gheoOsUjxSCPJK1 .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-5gheoOsUjxSCPJK1 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5gheoOsUjxSCPJK1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5gheoOsUjxSCPJK1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5gheoOsUjxSCPJK1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} borrowed by
borrows
has
has
contains
contains
1
1
1
1
1
1
0..1
0..*
0..*
0..*
0..*
0..*
Book
+book_id: String
+title: String
+author: String
+is_borrowed: boolean
+borrow(reader: Reader)
+return_book()
Reader
+reader_id: String
+name: String
+max_books: int
+borrow_book(book: Book)
+return_book(book: Book)
BorrowRecord
+reader: Reader
+book: Book
+borrow_date: Date
+return_date: Date
Library
+name: String
+books: List<Book>
+readers: List<Reader>
(七)任务六:模型验证
模型验证任务:
| 任务 | 说明 |
|---|---|
| 评审 | 专家评审 |
| 原型 | 构建原型 |
| 测试 | 测试验证 |
| 模拟 | 模拟运行 |
模型验证示例:
python
# 模型验证
# 创建对象
book1 = Book("B001", "Python编程", "张三", "978-7-111-12345-6", "计算机")
book2 = Book("B002", "Java编程", "李四", "978-7-111-23456-7", "计算机")
reader1 = Reader("R001", "王五", max_books=3)
reader2 = Reader("R002", "赵六", max_books=5)
# 测试借阅
print("=== 测试借阅 ===")
if reader1.borrow_book(book1):
print(f"✓ {reader1.name}成功借阅《{book1.title}》")
else:
print(f"✗ {reader1.name}借阅失败")
print(book1.get_info()) # 《Python编程》- 张三 [已借出]
print(reader1.get_borrow_info()) # 王五已借阅1/3本
# 测试归还
print("\n=== 测试归还 ===")
if reader1.return_book(book1):
print(f"✓ {reader1.name}成功归还《{book1.title}》")
else:
print(f"✗ {reader1.name}归还失败")
print(book1.get_info()) # 《Python编程》- 张三 [可借阅]
print(reader1.get_borrow_info()) # 王五已借阅0/3本
# 测试边界条件
print("\n=== 测试边界条件 ===")
# 测试最大借阅数
for i in range(4):
book = Book(f"B00{i+3}", f"图书{i+3}", "作者", "ISBN", "分类")
if reader1.borrow_book(book):
print(f"✓ 借阅第{i+1}本书成功")
else:
print(f"✗ 借阅第{i+1}本书失败(超过最大借阅数)")
🌐 三、面向对象分析的过程
(一)分析过程概览
分析过程:
#mermaid-svg-tjpDMjKo3WU27MOT{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tjpDMjKo3WU27MOT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tjpDMjKo3WU27MOT .error-icon{fill:#552222;}#mermaid-svg-tjpDMjKo3WU27MOT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tjpDMjKo3WU27MOT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tjpDMjKo3WU27MOT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tjpDMjKo3WU27MOT .marker.cross{stroke:#333333;}#mermaid-svg-tjpDMjKo3WU27MOT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tjpDMjKo3WU27MOT p{margin:0;}#mermaid-svg-tjpDMjKo3WU27MOT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tjpDMjKo3WU27MOT .cluster-label text{fill:#333;}#mermaid-svg-tjpDMjKo3WU27MOT .cluster-label span{color:#333;}#mermaid-svg-tjpDMjKo3WU27MOT .cluster-label span p{background-color:transparent;}#mermaid-svg-tjpDMjKo3WU27MOT .label text,#mermaid-svg-tjpDMjKo3WU27MOT span{fill:#333;color:#333;}#mermaid-svg-tjpDMjKo3WU27MOT .node rect,#mermaid-svg-tjpDMjKo3WU27MOT .node circle,#mermaid-svg-tjpDMjKo3WU27MOT .node ellipse,#mermaid-svg-tjpDMjKo3WU27MOT .node polygon,#mermaid-svg-tjpDMjKo3WU27MOT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tjpDMjKo3WU27MOT .rough-node .label text,#mermaid-svg-tjpDMjKo3WU27MOT .node .label text,#mermaid-svg-tjpDMjKo3WU27MOT .image-shape .label,#mermaid-svg-tjpDMjKo3WU27MOT .icon-shape .label{text-anchor:middle;}#mermaid-svg-tjpDMjKo3WU27MOT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tjpDMjKo3WU27MOT .rough-node .label,#mermaid-svg-tjpDMjKo3WU27MOT .node .label,#mermaid-svg-tjpDMjKo3WU27MOT .image-shape .label,#mermaid-svg-tjpDMjKo3WU27MOT .icon-shape .label{text-align:center;}#mermaid-svg-tjpDMjKo3WU27MOT .node.clickable{cursor:pointer;}#mermaid-svg-tjpDMjKo3WU27MOT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tjpDMjKo3WU27MOT .arrowheadPath{fill:#333333;}#mermaid-svg-tjpDMjKo3WU27MOT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tjpDMjKo3WU27MOT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tjpDMjKo3WU27MOT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tjpDMjKo3WU27MOT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tjpDMjKo3WU27MOT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tjpDMjKo3WU27MOT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tjpDMjKo3WU27MOT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tjpDMjKo3WU27MOT .cluster text{fill:#333;}#mermaid-svg-tjpDMjKo3WU27MOT .cluster span{color:#333;}#mermaid-svg-tjpDMjKo3WU27MOT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tjpDMjKo3WU27MOT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tjpDMjKo3WU27MOT rect.text{fill:none;stroke-width:0;}#mermaid-svg-tjpDMjKo3WU27MOT .icon-shape,#mermaid-svg-tjpDMjKo3WU27MOT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tjpDMjKo3WU27MOT .icon-shape p,#mermaid-svg-tjpDMjKo3WU27MOT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tjpDMjKo3WU27MOT .icon-shape .label rect,#mermaid-svg-tjpDMjKo3WU27MOT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tjpDMjKo3WU27MOT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tjpDMjKo3WU27MOT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tjpDMjKo3WU27MOT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 分析过程
需求收集
对象识别
类定义
关系识别
模型建立
模型验证
收集需求
识别对象
定义类
识别关系
建立模型
验证模型
(二)阶段一:需求收集阶段
需求收集阶段:
输入:
- 用户需求
- 业务需求
- 系统需求
输出:
- 需求规格说明书
- 需求列表
- 需求模型
活动:
| 活动 | 说明 |
|---|---|
| 需求收集 | 收集用户需求 |
| 需求分析 | 分析需求可行性 |
| 需求规格 | 编写需求规格说明书 |
| 需求验证 | 验证需求正确性 |
工具:
| 工具 | 说明 |
|---|---|
| 访谈工具 | 用户访谈 |
| 问卷工具 | 问卷调查 |
| 原型工具 | 原型构建 |
| 文档工具 | 文档分析 |
(三)阶段二:对象识别阶段
对象识别阶段:
输入:
- 需求规格说明书
- 需求列表
输出:
- 对象列表
- 对象模型
活动:
| 活动 | 说明 |
|---|---|
| 名词分析 | 分析需求中的名词 |
| 场景分析 | 分析使用场景 |
| 领域分析 | 分析领域知识 |
| 模式识别 | 识别常见模式 |
工具:
| 工具 | 说明 |
|---|---|
| UML工具 | 建模工具 |
| 分析工具 | 分析工具 |
| 原型工具 | 原型工具 |
(四)阶段三:类定义阶段
类定义阶段:
输入:
- 对象列表
- 对象模型
输出:
- 类定义
- 类图
活动:
| 活动 | 说明 |
|---|---|
| 属性定义 | 定义类的数据成员 |
| 方法定义 | 定义类的操作行为 |
| 约束定义 | 定义类的约束条件 |
| 关系定义 | 定义类之间的关系 |
工具:
| 工具 | 说明 |
|---|---|
| UML工具 | 建模工具 |
| 设计工具 | 设计工具 |
| 代码工具 | 代码生成 |
(五)阶段四:关系识别阶段
关系识别阶段:
输入:
- 类定义
- 类图
输出:
- 关系模型
- 完整类图
活动:
| 活动 | 说明 |
|---|---|
| 关联识别 | 识别一般关系 |
| 聚合识别 | 识别整体部分关系 |
| 组合识别 | 识别强整体部分关系 |
| 继承识别 | 识别泛化关系 |
| 依赖识别 | 识别使用关系 |
工具:
| 工具 | 说明 |
|---|---|
| UML工具 | 建模工具 |
| 分析工具 | 分析工具 |
(六)阶段五:模型建立阶段
模型建立阶段:
输入:
- 类定义
- 关系模型
输出:
- 完整模型
- 模型文档
活动:
| 活动 | 说明 |
|---|---|
| 类图建立 | 描述类及其关系 |
| 对象图建立 | 描述对象实例 |
| 用例图建立 | 描述系统功能 |
| 顺序图建立 | 描述对象交互 |
工具:
| 工具 | 说明 |
|---|---|
| UML工具 | 建模工具 |
| 文档工具 | 文档生成 |
(七)阶段六:模型验证阶段
模型验证阶段:
输入:
- 完整模型
- 模型文档
输出:
- 验证报告
- 修正模型
活动:
| 活动 | 说明 |
|---|---|
| 评审 | 专家评审 |
| 原型 | 构建原型 |
| 测试 | 测试验证 |
| 模拟 | 模拟运行 |
工具:
| 工具 | 说明 |
|---|---|
| 评审工具 | 评审工具 |
| 原型工具 | 原型工具 |
| 测试工具 | 测试工具 |
💡 四、面向对象分析的方法
(一)方法概览
OOA方法:
| 方法 | 说明 |
|---|---|
| Coad/Yourdon方法 | 经典OOA方法 |
| Booch方法 | Booch的OOA方法 |
| OMT方法 | Rumbaugh的OOA方法 |
| UML方法 | 统一建模语言 |
(二)Coad/Yourdon方法
Coad/Yourdon方法:经典的面向对象分析方法。
方法特点:
| 特点 | 说明 |
|---|---|
| 主题层 | 组织模型结构 |
| 类层 | 定义类和对象 |
| 结构层 | 定义类间关系 |
| 属性层 | 定义类属性 |
| 服务层 | 定义类方法 |
方法步骤:
#mermaid-svg-zCLdocNqWGMFvob5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zCLdocNqWGMFvob5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zCLdocNqWGMFvob5 .error-icon{fill:#552222;}#mermaid-svg-zCLdocNqWGMFvob5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zCLdocNqWGMFvob5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zCLdocNqWGMFvob5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zCLdocNqWGMFvob5 .marker.cross{stroke:#333333;}#mermaid-svg-zCLdocNqWGMFvob5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zCLdocNqWGMFvob5 p{margin:0;}#mermaid-svg-zCLdocNqWGMFvob5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zCLdocNqWGMFvob5 .cluster-label text{fill:#333;}#mermaid-svg-zCLdocNqWGMFvob5 .cluster-label span{color:#333;}#mermaid-svg-zCLdocNqWGMFvob5 .cluster-label span p{background-color:transparent;}#mermaid-svg-zCLdocNqWGMFvob5 .label text,#mermaid-svg-zCLdocNqWGMFvob5 span{fill:#333;color:#333;}#mermaid-svg-zCLdocNqWGMFvob5 .node rect,#mermaid-svg-zCLdocNqWGMFvob5 .node circle,#mermaid-svg-zCLdocNqWGMFvob5 .node ellipse,#mermaid-svg-zCLdocNqWGMFvob5 .node polygon,#mermaid-svg-zCLdocNqWGMFvob5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zCLdocNqWGMFvob5 .rough-node .label text,#mermaid-svg-zCLdocNqWGMFvob5 .node .label text,#mermaid-svg-zCLdocNqWGMFvob5 .image-shape .label,#mermaid-svg-zCLdocNqWGMFvob5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zCLdocNqWGMFvob5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zCLdocNqWGMFvob5 .rough-node .label,#mermaid-svg-zCLdocNqWGMFvob5 .node .label,#mermaid-svg-zCLdocNqWGMFvob5 .image-shape .label,#mermaid-svg-zCLdocNqWGMFvob5 .icon-shape .label{text-align:center;}#mermaid-svg-zCLdocNqWGMFvob5 .node.clickable{cursor:pointer;}#mermaid-svg-zCLdocNqWGMFvob5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zCLdocNqWGMFvob5 .arrowheadPath{fill:#333333;}#mermaid-svg-zCLdocNqWGMFvob5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zCLdocNqWGMFvob5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zCLdocNqWGMFvob5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zCLdocNqWGMFvob5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zCLdocNqWGMFvob5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zCLdocNqWGMFvob5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zCLdocNqWGMFvob5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zCLdocNqWGMFvob5 .cluster text{fill:#333;}#mermaid-svg-zCLdocNqWGMFvob5 .cluster span{color:#333;}#mermaid-svg-zCLdocNqWGMFvob5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zCLdocNqWGMFvob5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zCLdocNqWGMFvob5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zCLdocNqWGMFvob5 .icon-shape,#mermaid-svg-zCLdocNqWGMFvob5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zCLdocNqWGMFvob5 .icon-shape p,#mermaid-svg-zCLdocNqWGMFvob5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zCLdocNqWGMFvob5 .icon-shape .label rect,#mermaid-svg-zCLdocNqWGMFvob5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zCLdocNqWGMFvob5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zCLdocNqWGMFvob5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zCLdocNqWGMFvob5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Coad/Yourdon方法
主题层
类层
结构层
属性层
服务层
组织模型
定义类
定义关系
定义属性
定义方法
(三)Booch方法
Booch方法:Booch提出的面向对象分析方法。
方法特点:
| 特点 | 说明 |
|---|---|
| 类图 | 描述类结构 |
| 对象图 | 描述对象实例 |
| 状态图 | 描述状态变化 |
| 交互图 | 描述对象交互 |
方法步骤:
#mermaid-svg-tSEugDmTrbWjY69H{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tSEugDmTrbWjY69H .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tSEugDmTrbWjY69H .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tSEugDmTrbWjY69H .error-icon{fill:#552222;}#mermaid-svg-tSEugDmTrbWjY69H .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tSEugDmTrbWjY69H .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tSEugDmTrbWjY69H .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tSEugDmTrbWjY69H .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tSEugDmTrbWjY69H .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tSEugDmTrbWjY69H .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tSEugDmTrbWjY69H .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tSEugDmTrbWjY69H .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tSEugDmTrbWjY69H .marker.cross{stroke:#333333;}#mermaid-svg-tSEugDmTrbWjY69H svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tSEugDmTrbWjY69H p{margin:0;}#mermaid-svg-tSEugDmTrbWjY69H .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tSEugDmTrbWjY69H .cluster-label text{fill:#333;}#mermaid-svg-tSEugDmTrbWjY69H .cluster-label span{color:#333;}#mermaid-svg-tSEugDmTrbWjY69H .cluster-label span p{background-color:transparent;}#mermaid-svg-tSEugDmTrbWjY69H .label text,#mermaid-svg-tSEugDmTrbWjY69H span{fill:#333;color:#333;}#mermaid-svg-tSEugDmTrbWjY69H .node rect,#mermaid-svg-tSEugDmTrbWjY69H .node circle,#mermaid-svg-tSEugDmTrbWjY69H .node ellipse,#mermaid-svg-tSEugDmTrbWjY69H .node polygon,#mermaid-svg-tSEugDmTrbWjY69H .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tSEugDmTrbWjY69H .rough-node .label text,#mermaid-svg-tSEugDmTrbWjY69H .node .label text,#mermaid-svg-tSEugDmTrbWjY69H .image-shape .label,#mermaid-svg-tSEugDmTrbWjY69H .icon-shape .label{text-anchor:middle;}#mermaid-svg-tSEugDmTrbWjY69H .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tSEugDmTrbWjY69H .rough-node .label,#mermaid-svg-tSEugDmTrbWjY69H .node .label,#mermaid-svg-tSEugDmTrbWjY69H .image-shape .label,#mermaid-svg-tSEugDmTrbWjY69H .icon-shape .label{text-align:center;}#mermaid-svg-tSEugDmTrbWjY69H .node.clickable{cursor:pointer;}#mermaid-svg-tSEugDmTrbWjY69H .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tSEugDmTrbWjY69H .arrowheadPath{fill:#333333;}#mermaid-svg-tSEugDmTrbWjY69H .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tSEugDmTrbWjY69H .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tSEugDmTrbWjY69H .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tSEugDmTrbWjY69H .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tSEugDmTrbWjY69H .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tSEugDmTrbWjY69H .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tSEugDmTrbWjY69H .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tSEugDmTrbWjY69H .cluster text{fill:#333;}#mermaid-svg-tSEugDmTrbWjY69H .cluster span{color:#333;}#mermaid-svg-tSEugDmTrbWjY69H div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tSEugDmTrbWjY69H .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tSEugDmTrbWjY69H rect.text{fill:none;stroke-width:0;}#mermaid-svg-tSEugDmTrbWjY69H .icon-shape,#mermaid-svg-tSEugDmTrbWjY69H .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tSEugDmTrbWjY69H .icon-shape p,#mermaid-svg-tSEugDmTrbWjY69H .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tSEugDmTrbWjY69H .icon-shape .label rect,#mermaid-svg-tSEugDmTrbWjY69H .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tSEugDmTrbWjY69H .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tSEugDmTrbWjY69H .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tSEugDmTrbWjY69H :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Booch方法
类图
对象图
状态图
交互图
描述类
描述对象
描述状态
描述交互
(四)OMT方法
OMT方法:Rumbaugh提出的面向对象分析方法。
方法特点:
| 特点 | 说明 |
|---|---|
| 对象模型 | 描述对象结构 |
| 动态模型 | 描述动态行为 |
| 功能模型 | 描述功能流程 |
方法步骤:
#mermaid-svg-pqdb66DhvKDxGsZ4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pqdb66DhvKDxGsZ4 .error-icon{fill:#552222;}#mermaid-svg-pqdb66DhvKDxGsZ4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pqdb66DhvKDxGsZ4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .marker.cross{stroke:#333333;}#mermaid-svg-pqdb66DhvKDxGsZ4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pqdb66DhvKDxGsZ4 p{margin:0;}#mermaid-svg-pqdb66DhvKDxGsZ4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .cluster-label text{fill:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .cluster-label span{color:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .cluster-label span p{background-color:transparent;}#mermaid-svg-pqdb66DhvKDxGsZ4 .label text,#mermaid-svg-pqdb66DhvKDxGsZ4 span{fill:#333;color:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .node rect,#mermaid-svg-pqdb66DhvKDxGsZ4 .node circle,#mermaid-svg-pqdb66DhvKDxGsZ4 .node ellipse,#mermaid-svg-pqdb66DhvKDxGsZ4 .node polygon,#mermaid-svg-pqdb66DhvKDxGsZ4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .rough-node .label text,#mermaid-svg-pqdb66DhvKDxGsZ4 .node .label text,#mermaid-svg-pqdb66DhvKDxGsZ4 .image-shape .label,#mermaid-svg-pqdb66DhvKDxGsZ4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-pqdb66DhvKDxGsZ4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .rough-node .label,#mermaid-svg-pqdb66DhvKDxGsZ4 .node .label,#mermaid-svg-pqdb66DhvKDxGsZ4 .image-shape .label,#mermaid-svg-pqdb66DhvKDxGsZ4 .icon-shape .label{text-align:center;}#mermaid-svg-pqdb66DhvKDxGsZ4 .node.clickable{cursor:pointer;}#mermaid-svg-pqdb66DhvKDxGsZ4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .arrowheadPath{fill:#333333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pqdb66DhvKDxGsZ4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pqdb66DhvKDxGsZ4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pqdb66DhvKDxGsZ4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pqdb66DhvKDxGsZ4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .cluster text{fill:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 .cluster span{color:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pqdb66DhvKDxGsZ4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pqdb66DhvKDxGsZ4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-pqdb66DhvKDxGsZ4 .icon-shape,#mermaid-svg-pqdb66DhvKDxGsZ4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pqdb66DhvKDxGsZ4 .icon-shape p,#mermaid-svg-pqdb66DhvKDxGsZ4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pqdb66DhvKDxGsZ4 .icon-shape .label rect,#mermaid-svg-pqdb66DhvKDxGsZ4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pqdb66DhvKDxGsZ4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pqdb66DhvKDxGsZ4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pqdb66DhvKDxGsZ4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OMT方法
对象模型
动态模型
功能模型
描述结构
描述行为
描述功能
(五)UML方法
UML方法:统一建模语言,是目前最常用的OOA方法。
UML图类型:
| 图类型 | 说明 |
|---|---|
| 用例图 | 描述系统功能 |
| 类图 | 描述类结构 |
| 对象图 | 描述对象实例 |
| 顺序图 | 描述对象交互 |
| 活动图 | 描述活动流程 |
| 状态图 | 描述状态变化 |
UML方法步骤:
#mermaid-svg-GkIrVwNPfPXVkODX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GkIrVwNPfPXVkODX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GkIrVwNPfPXVkODX .error-icon{fill:#552222;}#mermaid-svg-GkIrVwNPfPXVkODX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GkIrVwNPfPXVkODX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GkIrVwNPfPXVkODX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GkIrVwNPfPXVkODX .marker.cross{stroke:#333333;}#mermaid-svg-GkIrVwNPfPXVkODX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GkIrVwNPfPXVkODX p{margin:0;}#mermaid-svg-GkIrVwNPfPXVkODX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GkIrVwNPfPXVkODX .cluster-label text{fill:#333;}#mermaid-svg-GkIrVwNPfPXVkODX .cluster-label span{color:#333;}#mermaid-svg-GkIrVwNPfPXVkODX .cluster-label span p{background-color:transparent;}#mermaid-svg-GkIrVwNPfPXVkODX .label text,#mermaid-svg-GkIrVwNPfPXVkODX span{fill:#333;color:#333;}#mermaid-svg-GkIrVwNPfPXVkODX .node rect,#mermaid-svg-GkIrVwNPfPXVkODX .node circle,#mermaid-svg-GkIrVwNPfPXVkODX .node ellipse,#mermaid-svg-GkIrVwNPfPXVkODX .node polygon,#mermaid-svg-GkIrVwNPfPXVkODX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GkIrVwNPfPXVkODX .rough-node .label text,#mermaid-svg-GkIrVwNPfPXVkODX .node .label text,#mermaid-svg-GkIrVwNPfPXVkODX .image-shape .label,#mermaid-svg-GkIrVwNPfPXVkODX .icon-shape .label{text-anchor:middle;}#mermaid-svg-GkIrVwNPfPXVkODX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GkIrVwNPfPXVkODX .rough-node .label,#mermaid-svg-GkIrVwNPfPXVkODX .node .label,#mermaid-svg-GkIrVwNPfPXVkODX .image-shape .label,#mermaid-svg-GkIrVwNPfPXVkODX .icon-shape .label{text-align:center;}#mermaid-svg-GkIrVwNPfPXVkODX .node.clickable{cursor:pointer;}#mermaid-svg-GkIrVwNPfPXVkODX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GkIrVwNPfPXVkODX .arrowheadPath{fill:#333333;}#mermaid-svg-GkIrVwNPfPXVkODX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GkIrVwNPfPXVkODX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GkIrVwNPfPXVkODX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GkIrVwNPfPXVkODX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GkIrVwNPfPXVkODX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GkIrVwNPfPXVkODX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GkIrVwNPfPXVkODX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GkIrVwNPfPXVkODX .cluster text{fill:#333;}#mermaid-svg-GkIrVwNPfPXVkODX .cluster span{color:#333;}#mermaid-svg-GkIrVwNPfPXVkODX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GkIrVwNPfPXVkODX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GkIrVwNPfPXVkODX rect.text{fill:none;stroke-width:0;}#mermaid-svg-GkIrVwNPfPXVkODX .icon-shape,#mermaid-svg-GkIrVwNPfPXVkODX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GkIrVwNPfPXVkODX .icon-shape p,#mermaid-svg-GkIrVwNPfPXVkODX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GkIrVwNPfPXVkODX .icon-shape .label rect,#mermaid-svg-GkIrVwNPfPXVkODX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GkIrVwNPfPXVkODX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GkIrVwNPfPXVkODX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GkIrVwNPfPXVkODX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} UML方法
用例图
类图
对象图
顺序图
活动图
状态图
描述功能
描述类
描述对象
描述交互
描述流程
描述状态
📊 五、面向对象分析的工具
(一)工具概览
OOA工具:
| 工具 | 说明 |
|---|---|
| Rational Rose | IBM的UML工具 |
| Enterprise Architect | Sparx的UML工具 |
| Visio | Microsoft的绘图工具 |
| StarUML | 开源UML工具 |
| PlantUML | 文本UML工具 |
(二)Rational Rose
Rational Rose:IBM的UML建模工具。
工具特点:
| 特点 | 说明 |
|---|---|
| 可视化 | 可视化建模 |
| 代码生成 | 自动生成代码 |
| 逆向工程 | 从代码生成模型 |
| 团队协作 | 支持团队协作 |
(三)Enterprise Architect
Enterprise Architect:Sparx的UML建模工具。
工具特点:
| 特点 | 说明 |
|---|---|
| 功能强大 | 功能全面 |
| 易于使用 | 界面友好 |
| 支持标准 | 支持UML标准 |
| 可扩展 | 支持扩展 |
(四)PlantUML
PlantUML:基于文本的UML工具。
工具特点:
| 特点 | 说明 |
|---|---|
| 文本描述 | 文本描述UML |
| 版本控制 | 易于版本控制 |
| 自动化 | 支持自动化 |
| 开源免费 | 开源免费 |
PlantUML示例:
plantuml
@startuml
class Student {
+student_id: String
+name: String
+age: int
+enroll(course: Course)
+get_info(): String
}
class Course {
+course_id: String
+name: String
+credit: int
+add_student(student: Student)
}
Student "1" --> "0..*" Course : enrolls
@enduml
📋 六、面向对象分析的应用
(一)应用背景
项目:学生选课系统
需求描述:
- 学生可以选课
- 学生可以查看课程
- 学生可以查看成绩
- 教师可以管理课程
- 管理员可以管理学生和课程
(二)需求收集
需求收集:
python
# 需求收集
# 功能需求:
# 1. 学生选课
# - 浏览课程
# - 选择课程
# - 退选课程
# - 查看已选课程
# 2. 成绩管理
# - 查看成绩
# - 导出成绩
# 3. 课程管理
# - 添加课程
# - 修改课程
# - 删除课程
# - 查询课程
# 4. 学生管理
# - 添加学生
# - 修改学生信息
# - 删除学生
# - 查询学生
# 非功能需求:
# 1. 系统响应时间 < 2秒
# 2. 系统可用性 > 99%
# 3. 系统安全性要求高
(三)对象识别
对象识别:
python
# 名词分析
# 需求文档中的名词:
# - 学生、课程、教师、成绩、管理员、选课记录
#
# 识别对象:
# - Student(学生)
# - Course(课程)
# - Teacher(教师)
# - Grade(成绩)
# - Administrator(管理员)
# - Enrollment(选课记录)
(四)类定义
类定义:
python
# Student类
class Student:
def __init__(self, student_id, name, age, major):
self.student_id = student_id
self.name = name
self.age = age
self.major = major
self.enrollments = []
def enroll(self, course):
"""选课"""
enrollment = Enrollment(self, course)
self.enrollments.append(enrollment)
course.add_student(self)
return enrollment
def drop(self, course):
"""退课"""
for enrollment in self.enrollments:
if enrollment.course == course:
self.enrollments.remove(enrollment)
course.remove_student(self)
return True
return False
def get_enrolled_courses(self):
"""获取已选课程"""
return [e.course for e in self.enrollments]
# Course类
class Course:
def __init__(self, course_id, name, teacher, credit, capacity):
self.course_id = course_id
self.name = name
self.teacher = teacher
self.credit = credit
self.capacity = capacity
self.students = []
def add_student(self, student):
"""添加学生"""
if len(self.students) < self.capacity:
self.students.append(student)
return True
return False
def remove_student(self, student):
"""移除学生"""
if student in self.students:
self.students.remove(student)
return True
return False
def is_full(self):
"""是否已满"""
return len(self.students) >= self.capacity
# Enrollment类
class Enrollment:
def __init__(self, student, course):
self.student = student
self.course = course
self.enroll_date = datetime.now()
self.grade = None
def set_grade(self, grade):
"""设置成绩"""
self.grade = grade
def get_info(self):
"""获取信息"""
return f"{self.student.name}选修{self.course.name}, 成绩:{self.grade}"
(五)关系识别
关系识别:
#mermaid-svg-orVCeqzyrYT2XEJ9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-orVCeqzyrYT2XEJ9 .error-icon{fill:#552222;}#mermaid-svg-orVCeqzyrYT2XEJ9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-orVCeqzyrYT2XEJ9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-orVCeqzyrYT2XEJ9 .marker.cross{stroke:#333333;}#mermaid-svg-orVCeqzyrYT2XEJ9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-orVCeqzyrYT2XEJ9 p{margin:0;}#mermaid-svg-orVCeqzyrYT2XEJ9 g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-orVCeqzyrYT2XEJ9 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-orVCeqzyrYT2XEJ9 .cluster-label text{fill:#333;}#mermaid-svg-orVCeqzyrYT2XEJ9 .cluster-label span{color:#333;}#mermaid-svg-orVCeqzyrYT2XEJ9 .cluster-label span p{background-color:transparent;}#mermaid-svg-orVCeqzyrYT2XEJ9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-orVCeqzyrYT2XEJ9 .cluster text{fill:#333;}#mermaid-svg-orVCeqzyrYT2XEJ9 .cluster span{color:#333;}#mermaid-svg-orVCeqzyrYT2XEJ9 .nodeLabel,#mermaid-svg-orVCeqzyrYT2XEJ9 .edgeLabel{color:#131300;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-orVCeqzyrYT2XEJ9 .label text{fill:#131300;}#mermaid-svg-orVCeqzyrYT2XEJ9 .labelBkg{background:#ECECFF;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-orVCeqzyrYT2XEJ9 .classTitle{font-weight:bolder;}#mermaid-svg-orVCeqzyrYT2XEJ9 .node rect,#mermaid-svg-orVCeqzyrYT2XEJ9 .node circle,#mermaid-svg-orVCeqzyrYT2XEJ9 .node ellipse,#mermaid-svg-orVCeqzyrYT2XEJ9 .node polygon,#mermaid-svg-orVCeqzyrYT2XEJ9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-orVCeqzyrYT2XEJ9 .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 g.clickable{cursor:pointer;}#mermaid-svg-orVCeqzyrYT2XEJ9 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-orVCeqzyrYT2XEJ9 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-orVCeqzyrYT2XEJ9 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-orVCeqzyrYT2XEJ9 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-orVCeqzyrYT2XEJ9 .dashed-line{stroke-dasharray:3;}#mermaid-svg-orVCeqzyrYT2XEJ9 .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-orVCeqzyrYT2XEJ9 #compositionStart,#mermaid-svg-orVCeqzyrYT2XEJ9 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #compositionEnd,#mermaid-svg-orVCeqzyrYT2XEJ9 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #dependencyStart,#mermaid-svg-orVCeqzyrYT2XEJ9 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #dependencyStart,#mermaid-svg-orVCeqzyrYT2XEJ9 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #extensionStart,#mermaid-svg-orVCeqzyrYT2XEJ9 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #extensionEnd,#mermaid-svg-orVCeqzyrYT2XEJ9 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #aggregationStart,#mermaid-svg-orVCeqzyrYT2XEJ9 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #aggregationEnd,#mermaid-svg-orVCeqzyrYT2XEJ9 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #lollipopStart,#mermaid-svg-orVCeqzyrYT2XEJ9 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 #lollipopEnd,#mermaid-svg-orVCeqzyrYT2XEJ9 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-orVCeqzyrYT2XEJ9 .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-orVCeqzyrYT2XEJ9 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-orVCeqzyrYT2XEJ9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-orVCeqzyrYT2XEJ9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-orVCeqzyrYT2XEJ9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} has
has
taught by
enrolls
1
1
0..*
0..*
0..*
0..*
1
0..*
Student
+student_id: String
+name: String
+age: int
+major: String
+enroll(course: Course)
+drop(course: Course)
+get_enrolled_courses() : : List
Course
+course_id: String
+name: String
+teacher: Teacher
+credit: int
+capacity: int
+add_student(student: Student)
+remove_student(student: Student)
+is_full() : : boolean
Teacher
+teacher_id: String
+name: String
+department: String
Enrollment
+student: Student
+course: Course
+enroll_date: Date
+grade: float
+set_grade(grade: float)
+get_info() : : String
(六)模型验证
模型验证:
python
# 模型验证
# 创建对象
teacher = Teacher("T001", "张教授", "计算机系")
course1 = Course("C001", "Python编程", teacher, 4, 50)
course2 = Course("C002", "Java编程", teacher, 3, 40)
student1 = Student("S001", "李四", 20, "计算机科学")
student2 = Student("S002", "王五", 21, "软件工程")
# 测试选课
print("=== 测试选课 ===")
enrollment1 = student1.enroll(course1)
enrollment2 = student1.enroll(course2)
enrollment3 = student2.enroll(course1)
print(f"✓ {student1.name}选了{len(student1.get_enrolled_courses())}门课")
print(f"✓ {student2.name}选了{len(student2.get_enrolled_courses())}门课")
print(f"✓ {course1.name}有{len(course1.students)}个学生")
print(f"✓ {course2.name}有{len(course2.students)}个学生")
# 测试退课
print("\n=== 测试退课 ===")
if student1.drop(course2):
print(f"✓ {student1.name}退选了{course2.name}")
print(f"✓ {student1.name}现在选了{len(student1.get_enrolled_courses())}门课")
print(f"✓ {course2.name}现在有{len(course2.students)}个学生")
# 测试成绩
print("\n=== 测试成绩 ===")
enrollment1.set_grade(85)
enrollment2.set_grade(92)
enrollment3.set_grade(78)
print(enrollment1.get_info())
print(enrollment2.get_info())
print(enrollment3.get_info())
📝 总结
面向对象分析的基本任务与分析过程是软件开发的重要环节。
🎯 基本任务:
- 需求收集:收集用户需求,理解系统需求
- 对象识别:识别系统中的对象
- 类定义:定义类的属性和方法
- 关系识别:识别类之间的关系
- 模型建立:建立系统的对象模型
- 模型验证:验证模型的正确性
💡 分析过程:
- 需求收集阶段:收集用户需求,编写需求规格说明书
- 对象识别阶段:识别系统中的对象
- 类定义阶段:定义类的属性和方法
- 关系识别阶段:识别类之间的关系
- 模型建立阶段:建立系统的对象模型
- 模型验证阶段:验证模型的正确性
📊 分析方法:
- Coad/Yourdon方法:经典OOA方法
- Booch方法:Booch的OOA方法
- OMT方法:Rumbaugh的OOA方法
- UML方法:统一建模语言
📋 分析工具:
- Rational Rose:IBM的UML工具
- Enterprise Architect:Sparx的UML工具
- Visio:Microsoft的绘图工具
- StarUML:开源UML工具
- PlantUML:文本UML工具
核心启示:面向对象分析的基本任务与分析过程是软件开发的重要环节,通过面向对象的概念和原则来分析系统需求,建立系统的对象模型。理解面向对象分析的基本任务和分析过程,掌握各个阶段的方法和工具,是掌握面向对象技术的关键。在实际工作中,我们需要注意:第一,深入理解面向对象分析的基本任务(需求收集、对象识别、类定义、关系识别、模型建立、模型验证);第二,掌握面向对象分析的过程(需求收集阶段、对象识别阶段、类定义阶段、关系识别阶段、模型建立阶段、模型验证阶段);第三,熟练使用面向对象分析的方法(Coad/Yourdon方法、Booch方法、OMT方法、UML方法);第四,合理使用面向对象分析的工具(Rational Rose、Enterprise Architect、Visio、StarUML、PlantUML);第五,注重模型的质量和可维护性。面向对象分析不仅是需求分析的手段,更是我们理解和建模现实世界的重要工具。通过合理的面向对象分析,我们可以构建出结构清晰、易于维护的软件系统。记住:好的面向对象分析是软件成功的基础。
--