软件工程:面向对象分析的基本任务与分析过程

📌目录



⚖️ 面向对象分析的基本任务与分析过程

面向对象分析(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);第五,注重模型的质量和可维护性。面向对象分析不仅是需求分析的手段,更是我们理解和建模现实世界的重要工具。通过合理的面向对象分析,我们可以构建出结构清晰、易于维护的软件系统。记住:好的面向对象分析是软件成功的基础。

--

相关推荐
@insist1233 小时前
系统集成项目管理工程师-启动过程组概述与制定项目章程
软件工程·软考·系统集成项目管理工程师·软考中项·软件水平考试
千维百策6662 天前
AI 软件开发中的人与智能体:软件工程循环、人在环路中与框架工程
大数据·人工智能·软件工程
老郑聊AI业财智造2 天前
TOGAF、DDD与微服务:软件架构的多维透视
spring boot·spring cloud·微服务·金融·架构·软件工程·制造
m0_547486662 天前
《软件工程与实践》 全套PPT课件2026
软件工程
梁辰兴3 天前
软件工程:类和实例
软件工程·实例··类的定义·梁辰兴·类的组成·类的类型
海天鹰3 天前
扩容U盘恢复
软件工程
梁辰兴5 天前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
梁辰兴5 天前
软件工程:详细设计规格说明
软件工程·梁辰兴·文档定位·内容体系·详细设计规格说明·核心要素·评审机制
XDevelop AI智能应用软件开发5 天前
AI演进下的“第五次软件危机”与软件工程重塑
人工智能·软件工程·ai编程·软件危机