🔷 第九章 面向对象编程基础
📄 一句话概括

UML 是一套"标准化的图形记号",专门用来在写代码之前描述系统。 它的来历是"三套画法合流"(Booch + OMT + OOSE),1997 年被 OMG 采纳为国际标准;它的定位是表达工具(不是编程语言、不是开发方法);它的日常用途是沟通、设计、留档三件事。记住一句就够:UML 让"想法"变成"大家都能看懂的图"。

📝 本节和前面几节的关系

9.3 导言讲了"为什么需要画图"(想法在脑子里,别人看不见)。本节把 UML 这个工具摸清底细:它从哪来、是干什么用的、边界在哪。它和 9.2.3 的关系很近——UML 里最核心的类图,画的正是"封装/继承"这些结构:- 私有、+ 公开就是封装;一根空三角箭头就是继承。本节先把 UML 当作一个整体来认识,具体怎么读类图留给 9.3.2。

一、来历:三套画法合流

UML 不是凭空造出来的,它是"合并同类项"的产物。

时间线:

时间 发生了什么
1980s~1990s 初 面向对象兴起,各路专家各画各的图:Booch 方法、Rumbaugh 的 OMT、Jacobson 的 OOSE 等
1994~1995 Booch 与 Rumbaugh 在 Rational 公司合并各自的方法;随后 Jacobson 加入
1996 三位联合发布初版;同年向业界公开征求意见(一大批公司参与)
1997 UML 1.0 提交给 OMG(对象管理组织),被采纳为国际标准
2005 前后 UML 2.0 发布,图形种类更丰富(目前主流版本)

为什么必须合流:三套画法各自都能用,但互不相通——换个项目、换个公司,同一张图要重新学一遍符号。这就是"方言太多"的困境。

三位的头衔也顺便记住:Booch、Rumbaugh、Jacobson 被业界合称"三友"(Three Amigos),UML 之父这一称号通常一起给他们三位。

关于 OMG:Object Management Group(对象管理组织),一个制定标准的国际联盟。UML 归它管,所以它是一个"标准",不是一个"软件产品"。

二、定位:它是"记号系统",不是"开发方法"

这是本节最需要掰清的一件事。UML 和"怎么开发软件"是两个层面的事:

UML 开发方法 / 过程
回答什么问题 "用什么符号画图" "按什么步骤、什么规矩做项目"
例子 类图用方框、继承用空三角箭头 瀑布模型、敏捷开发、RUP
能单独换吗 能。UML 可以配合各种开发方法使用 能。用瀑布还是敏捷,都可以用 UML 画图

打个比方:UML 像是"工程制图的符号标准"(粗实线表示可见轮廓、虚线表示隐藏轮廓……),而"开发方法"像是"施工的组织流程"(先勘测、再设计、再施工)。两者各管一摊,能自由组合。

三、它能帮你做三件事

用途 说明 场景
沟通 让程序员、需求方、测试看着同一张图说话 评审会上,指着类图讨论"这个属性该放哪个类"
设计 在写代码前把结构想清楚,试错成本低 改图上一条线,比改代码里几十行便宜得多
留档 把设计保存下来,将来接手的人能快速看懂 半年后回来看这个系统,图还在,不用重新啃代码

注意第三件事的价值:代码能说明"怎么做",但很难说明"为什么这么分"。结构性的意图,图能记住。

四、它的边界:做不到什么

UML 做不到 说明
不能替代代码 画得再好,还是要人写实现
不能保证设计正确 它只说"你画的是什么",不说"你画得好不好"
不能替代文字说明 具体算法、边界条件、异常规则,图里塞不进去,仍要文字
不是越全越好 十几类图不必都画,多数项目只用得上两三张

用得好的关键:只画有必要的图。 一个班的学生作业,画一张类图就够了;一个几十人的项目,才需要类图 + 用例图 + 时序图配着来。

五、UML 2.x 的图家族(先认脸,9.3.2 细讲)

结构图(回答"有哪些东西"):

图 画什么
类图 类、属性、方法、类之间的关系——最常用
对象图 某一时刻有哪些具体的对象(类的实例快照)
包图 把类分组打包(相当于文件夹)
组件图 系统由哪些可替换的模块组成
部署图 软件装在哪台机器上(物理部署)

行为图(回答"它们怎么动"):

图 画什么
用例图 谁能用系统做什么(需求阶段主力)
时序图 对象之间按时间顺序怎么来回发消息
活动图 流程/步骤(像流程图,能表达并行与分支)
状态图 一个对象在哪些状态之间切换(订单:待付款→已付款→已发货)
协作图 强调对象之间的连接关系下的消息往来

零基础的第一优先级:类图(结构)+ 用例图(需求)+ 时序图(配合)。其余认识名字就行。

六、动手 Demo:给"自动售货机"写设计草稿

不写代码,只做 UML 的第一步:找角色 + 列职责。需求一句话描述:

"顾客投币,售货机检查金额够不够,够了就出货并找零。"

第一步:把"名词"圈出来(9.2.2 教的方法)

顾客、售货机、钱币、商品

第二步:给每个角色列"有什么 / 会什么"(先不管对错,列出来再说)

候选类 属性(有什么) 方法(会什么)
顾客 手里的钱 投币、取货、拿走找零
售货机 库存、售价 收币、判断金额、出货、找零
商品 名称、价格、剩余数量 出货(数量 -1)
钱币 面额 ——(先留空)

看到什么算成功:你能对着这张表说出"主要就是售货机在干活,顾客只是发起者"——这句话就已经是设计判断了。

30 秒实验:问自己两个问题——

  1. "找零"该写在"顾客"还是"售货机"身上? → 售货机。因为找零改的是售货机自己的钱箱(9.2.2 的判据:"这件事主要改谁的数据,就写在谁身上")。
  2. "钱币"这个类有必要吗? → 先看需求。如果只关心"金额够不够",一个 double insertMoney 就够了,不需要单独的类;如果还要记录"哪张钞票、有没有假币",才值得建类。 "这个类有必要吗"——这是建模时最该反复问的一句话。

七、常见误区

  1. "UML 是一种编程语言 / 一种开发方法"——都不是。它是图形记号标准(描述工具),既不写代码,也不规定你的项目流程。
  2. "学 UML 就是背十几张图"——没必要。先精两张(类图、用例图),其余用到再学。背完不会用,等于没学。
  3. "图画得越全越专业"——恰恰相反。画无用的图是浪费(而且很快会过时)。必要、够用、能沟通才是标准。
  4. "UML 是 Rational / 某公司的私有工具"——不是。它是 OMG 这个国际组织维护的公开标准,很多工具都支持。
  5. "不画 UML 就没法做面向对象设计"——可以。UML 是表达手段;表达手段可以换(白板草图、Excel 表格列职责,都能起到类似作用)。但"先把结构想清楚再写代码"这个习惯,才是真正不能省的那一步。
自测三问(点开对答案) 1. UML 这个标准的来历是什么?由哪个组织维护?——由 Booch、Rumbaugh、Jacobson 三位的画法**合流**而来,**1997 年被 OMG(对象管理组织)采纳为国际标准**(后来演进到 UML 2.x)。 2. UML 和"开发方法"是什么关系?——**两个层面的事**:UML 是**画图的记号标准**(表达工具),开发方法是**做项目的流程**(瀑布/敏捷等)。**两者可以自由组合,互不替代。** 3. UML 最有价值的三件事是什么?它的边界在哪?——**沟通、设计、留档**;边界是**不能替代代码、不能保证设计正确、不能替代文字细节**,而且**不是越全越好**。

相关笔记