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

📌目录



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

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

--

相关推荐
传奇开心果编程12 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
梁辰兴19 小时前
软件工程:面向功能的度量
软件工程·梁辰兴·面向功能的度量·度量定义·功能点分析fpa·用例点ucp·生产率分析
GISMagic19 小时前
AI 时代的软件工程与架构能力提升路线
人工智能·架构·软件工程
沐欣工作室_lvyiyi1 天前
基于STM32的生活用水循环净化与浇灌系统(论文+源码)
stm32·软件工程·云平台·单片机毕业设计·单片机仿真·机械电子工程·伊犁师范学院
金字塔頂の蝸牛1 天前
每周GitCode开源项目推荐
开源·软件工程·ai编程
三环上的骑士2 天前
【领域篇17】软件研发与组织效能评估:100 个典型应用场景全景梳理(附分类体系)
软件工程·软件研发·代码质量·开发者体验·组织效能·效能评估·研发效能评估
郝学胜-神的一滴3 天前
游戏引擎原理与实践 01:聊聊游戏引擎的前世今生
开发语言·c++·游戏引擎·产品运营·软件工程·产品经理·untiy
workflower3 天前
企业竞争要素变迁,智能型企业走向新四化
人工智能·机器学习·机器人·无人机·软件工程
盖伦发发9 天前
软件工程SOLID 五大设计原则
后端·软件工程