软件工程本科生宝典
首页/课程学习引导/面向对象分析与设计(UML)
软件工程 · 大二上

面向对象分析与设计(UML)

Object-Oriented Analysis and Design (UML)

软件工程
课程类别
大二上
建议学期
重要性
重要程度
难度
学习难度

📖这门课到底讲什么

面向对象分析与设计讲授如何把需求转化为可实现的软件结构:以 UML 为表达语言,学习用例图、类图、时序图、活动图、状态图、组件与部署图;以对象职责分配为核心思想,掌握封装、继承、多态、抽象、接口隔离等原则,并引入 SOLID 原则与经典的架构模式。课程强调从问题域建模到设计模型的完整链路,而非画图技巧。学完你应能读懂并绘制规范 UML 图、把一段需求文字转化成类图与交互图、判断设计中耦合与内聚的优劣、用 SOLID 原则重构一个糟糕的对象结构,并与团队用统一的图形语言沟通设计。

🎯为什么必须学好

它是软件工程系列课程的方法论基石,需求、测试、体系结构、设计模式都建立在建模能力之上;校招技术面试会问你如何设计一个类、如何抽象、面向对象的三大特性如何在代码中体现,甚至要求现场设计类图。真正的价值在于提升代码结构能力:很多人能写业务代码但结构混乱,根源是分析与设计训练不足。它也是读研做软件工程方向与进入大厂中台团队的能力基础。

📌核心知识清单

  • 面向对象基本概念:对象与类、属性与方法、封装、继承、多态、抽象类与接口的语义差别
  • UML 结构图:类图(类、属性、方法、可见性与关系符号)、对象图、组件图、部署图、包图
  • UML 行为图:用例图(参与者、用例、包含与扩展关系)、时序图(消息类型、生命线与激活)、协作图、活动图、状态图
  • 需求到设计的转化:用例描述与场景分析、名词短语法寻找类、CRC 卡片进行职责分配
  • 设计原则:单一职责、开闭、里氏替换、接口隔离、依赖倒置(SOLID),以及高内聚低耦合、迪米特法则
  • UML 与代码的映射:类图到 Java/C++ 代码的转换、关联与聚合与组合在代码中的实现差异、多重性与导航性
  • 常用设计技巧:继承与组合的取舍、接口与抽象类的选择、贫血模型与充血模型之争、领域模型初步
  • 建模工具与流程:PlantUML 或 StarUML 的使用、模型的迭代与评审、模型驱动开发与学生项目中的裁剪

✍️怎么学(可执行步骤)

  1. 教材用《UML和模式应用》(Larman)为主线,重点第1至4部分关于用例、领域模型与交互图的内容,边读边把书中案例自己画一遍
  2. 用 PlantUML 以文本方式画所有图(类图、时序图、用例图),纳入 Git 管理,这样图与代码一起演进,比拖拽工具效率高得多
  3. 给自己出题:选一个真实场景(图书馆、外卖、选课、二手交易),写需求明细、画用例图与领域模型、画关键用例的时序图,再写出对应的类骨架代码
  4. 把课程项目的代码拿来做设计评审:找出违反 SOLID 的地方,画出重构前后的类图并写出重构理由,形成设计文档

📚推荐教材与书籍

UML和模式应用(第3版)Craig Larman · 经典

以案例驱动讲 UP 迭代开发与 UML 建模,第2至4部分是核心,最适合本科教学

UML精粹(第3版)Martin Fowler · 入门

薄书速查,讲清 UML 常用符号的准确用法与常见误用,适合作为画图时的参考手册

设计模式:可复用面向对象软件的基础GoF · 进阶

经典四人组著作,先读第1章导论理解面向对象设计原则,再读具体模式

敏捷软件开发:原则、模式与实践Robert C. Martin · 进阶

前半部分系统讲解 SRP、OCP 等设计原则并配案例重构,是 SOLID 最好的中文来源之一

🎬视频课程 / 公开课

国内高校课程,UML 与建模流程讲解与考试风格一致

选系统课程跟画图,重点跟做用例分析与类图建模章节

🌐网站与文档

查询 UML 元模型与图元素的权威定义,做严谨建模时参考

文本画 UML 图,示例库丰富,复制示例改一改即可用

软件设计领域的权威博客,关于 UML、贫血模型、分层架构的文章极具价值

🐙GitHub 开源资料

设计模式的 Java 实现与 UML 图,是学习模式与类图结合的最佳仓库

PlantUML 源码与语法文档,写文档画图的首选工具

🧪动手实践任务

🧪

实践 1

为选课系统写一份设计文档:需求用例描述、用例图、领域类图(含属性与关系)、两个关键用例的时序图,用 PlantUML 输出并纳入仓库

🧪

实践 2

用 CRC 卡片方法对图书借阅系统的类做职责分配,记录一次类的拆分与合并过程并说明理由

🧪

实践 3

找出一个开源项目中违反 SOLID 的代码片段,画出重构前后的类图并写出重构后的代码,说明耦合度如何降低

🧾考试与面试

💼 面试会怎么考

高频:面向对象三大特性分别解决什么问题、在代码中如何体现;接口与抽象类的区别与选择标准;重载与重写的区别;如何设计一个停车场或电梯系统的类结构(现场画类图);什么是高内聚低耦合、如何判断一个类的职责是否单一;组合优于继承的原因;SOLID 五条原则各自解决什么问题,并举出你项目中的例子。这类问题在软件岗与架构相关面试中出现频率很高。

📝 期末与考研怎么过

期末常见题型:根据需求画类图、用例图与时序图并说明关系类型;解释 UML 符号的含义与多重性;简答题考设计原则与面向对象概念;案例题给一段糟糕设计让你指出问题并给出改进方案。备考要点是把关系(关联、聚合、组合、泛化、依赖)的符号与语义背清,把课堂案例完整重画一遍。目标八十五分以上,因为这门课的分与后续项目质量正相关。

⚠️ 常见坑

  • 把 UML 当成画图作业,只求符号正确不考虑设计质量,图很漂亮但类职责混乱
  • 混淆聚合与组合、关联与依赖的语义,考试丢分且沟通时误导同事
  • 滥用继承,为复用代码而建立深层次类继承关系,导致修改基类影响一大片;应优先组合
  • 建模时追求大而全的类图(几十个类一次画完),忽略迭代建模的价值,模型无法落地到代码
  • 设计与代码脱节,画完图就丢,后续开发完全按感觉写,失去了设计的意义
→ 查看 大二上学期 的完整学期安排