面向对象分析与设计(UML)
Object-Oriented Analysis and Design (UML)
📖这门课到底讲什么
面向对象分析与设计讲授如何把需求转化为可实现的软件结构:以 UML 为表达语言,学习用例图、类图、时序图、活动图、状态图、组件与部署图;以对象职责分配为核心思想,掌握封装、继承、多态、抽象、接口隔离等原则,并引入 SOLID 原则与经典的架构模式。课程强调从问题域建模到设计模型的完整链路,而非画图技巧。学完你应能读懂并绘制规范 UML 图、把一段需求文字转化成类图与交互图、判断设计中耦合与内聚的优劣、用 SOLID 原则重构一个糟糕的对象结构,并与团队用统一的图形语言沟通设计。
🎯为什么必须学好
它是软件工程系列课程的方法论基石,需求、测试、体系结构、设计模式都建立在建模能力之上;校招技术面试会问你如何设计一个类、如何抽象、面向对象的三大特性如何在代码中体现,甚至要求现场设计类图。真正的价值在于提升代码结构能力:很多人能写业务代码但结构混乱,根源是分析与设计训练不足。它也是读研做软件工程方向与进入大厂中台团队的能力基础。
📌核心知识清单
- 面向对象基本概念:对象与类、属性与方法、封装、继承、多态、抽象类与接口的语义差别
- UML 结构图:类图(类、属性、方法、可见性与关系符号)、对象图、组件图、部署图、包图
- UML 行为图:用例图(参与者、用例、包含与扩展关系)、时序图(消息类型、生命线与激活)、协作图、活动图、状态图
- 需求到设计的转化:用例描述与场景分析、名词短语法寻找类、CRC 卡片进行职责分配
- 设计原则:单一职责、开闭、里氏替换、接口隔离、依赖倒置(SOLID),以及高内聚低耦合、迪米特法则
- UML 与代码的映射:类图到 Java/C++ 代码的转换、关联与聚合与组合在代码中的实现差异、多重性与导航性
- 常用设计技巧:继承与组合的取舍、接口与抽象类的选择、贫血模型与充血模型之争、领域模型初步
- 建模工具与流程:PlantUML 或 StarUML 的使用、模型的迭代与评审、模型驱动开发与学生项目中的裁剪
✍️怎么学(可执行步骤)
- 教材用《UML和模式应用》(Larman)为主线,重点第1至4部分关于用例、领域模型与交互图的内容,边读边把书中案例自己画一遍
- 用 PlantUML 以文本方式画所有图(类图、时序图、用例图),纳入 Git 管理,这样图与代码一起演进,比拖拽工具效率高得多
- 给自己出题:选一个真实场景(图书馆、外卖、选课、二手交易),写需求明细、画用例图与领域模型、画关键用例的时序图,再写出对应的类骨架代码
- 把课程项目的代码拿来做设计评审:找出违反 SOLID 的地方,画出重构前后的类图并写出重构理由,形成设计文档
📚推荐教材与书籍
以案例驱动讲 UP 迭代开发与 UML 建模,第2至4部分是核心,最适合本科教学
薄书速查,讲清 UML 常用符号的准确用法与常见误用,适合作为画图时的参考手册
经典四人组著作,先读第1章导论理解面向对象设计原则,再读具体模式
前半部分系统讲解 SRP、OCP 等设计原则并配案例重构,是 SOLID 最好的中文来源之一
🎬视频课程 / 公开课
国内高校课程,UML 与建模流程讲解与考试风格一致
选系统课程跟画图,重点跟做用例分析与类图建模章节
🌐网站与文档
查询 UML 元模型与图元素的权威定义,做严谨建模时参考
文本画 UML 图,示例库丰富,复制示例改一改即可用
软件设计领域的权威博客,关于 UML、贫血模型、分层架构的文章极具价值
🐙GitHub 开源资料
设计模式的 Java 实现与 UML 图,是学习模式与类图结合的最佳仓库
PlantUML 源码与语法文档,写文档画图的首选工具
🧪动手实践任务
实践 1
为选课系统写一份设计文档:需求用例描述、用例图、领域类图(含属性与关系)、两个关键用例的时序图,用 PlantUML 输出并纳入仓库
实践 2
用 CRC 卡片方法对图书借阅系统的类做职责分配,记录一次类的拆分与合并过程并说明理由
实践 3
找出一个开源项目中违反 SOLID 的代码片段,画出重构前后的类图并写出重构后的代码,说明耦合度如何降低
🧾考试与面试
💼 面试会怎么考
高频:面向对象三大特性分别解决什么问题、在代码中如何体现;接口与抽象类的区别与选择标准;重载与重写的区别;如何设计一个停车场或电梯系统的类结构(现场画类图);什么是高内聚低耦合、如何判断一个类的职责是否单一;组合优于继承的原因;SOLID 五条原则各自解决什么问题,并举出你项目中的例子。这类问题在软件岗与架构相关面试中出现频率很高。
📝 期末与考研怎么过
期末常见题型:根据需求画类图、用例图与时序图并说明关系类型;解释 UML 符号的含义与多重性;简答题考设计原则与面向对象概念;案例题给一段糟糕设计让你指出问题并给出改进方案。备考要点是把关系(关联、聚合、组合、泛化、依赖)的符号与语义背清,把课堂案例完整重画一遍。目标八十五分以上,因为这门课的分与后续项目质量正相关。
⚠️ 常见坑
- 把 UML 当成画图作业,只求符号正确不考虑设计质量,图很漂亮但类职责混乱
- 混淆聚合与组合、关联与依赖的语义,考试丢分且沟通时误导同事
- 滥用继承,为复用代码而建立深层次类继承关系,导致修改基类影响一大片;应优先组合
- 建模时追求大而全的类图(几十个类一次画完),忽略迭代建模的价值,模型无法落地到代码
- 设计与代码脱节,画完图就丢,后续开发完全按感觉写,失去了设计的意义