🧩 第九章 建模:填补现实世界和软件之间的沟壑
📄 一句话概括

建模第一步永远是把话摊成名词和动作——实测 8 个名词只有 4 个成概念类,6 个动作另归用例图。

📝 本节和前面几节的关系

9.6 讲了业务系统的本质,这一节拿图书馆借阅业务从头走一遍,这是本章的主案例。

一、第一步:摊名词

把业务描述里所有名词抄下来:读者、书、借阅记录、罚款、书架、馆员、图书馆、借书证——8 个。 逐个判断:它是【要处理的信息】吗? 结果:4 个成概念类(读者、书、借阅记录、罚款)。

二、丢掉的四种理由

书架:物理位置,软件不管。 馆员:在软件里只是一组权限。 图书馆:软件本身就是它。 借书证:它不是独立的类,是读者身上的一个属性。

三、第二步:分动作

动作 6 个:借书、还书、续借、算逾期、算罚款、催缴。 名词进概念模型,动作进用例图——两者不能混在一张图上。 每个动作都必须有归属(9.8 的用例图会逐个分配)。

四、这一步做错的代价

类分错了,后面全错:用例图要重画,表结构要重设计。 典型的错法是把【借书证】也做成一个类,结果多一张表、多一个外键、多一堆冗余字段。 所以这一步宁可慢:摊名词只要几分钟,改表结构要几天。

五、动手 Demo:对图书馆的借阅业务进行建模

把业务描述里的名词逐个判定:成概念类、丢掉、还是并入属性。 再把动作单列出来。

nouns = {"读者": "概念类", "书": "概念类", "借阅记录": "概念类",
         "罚款": "概念类", "书架": "丢掉", "馆员": "丢掉(只作权限)",
         "图书馆": "丢掉(软件本身)", "借书证": "并入读者属性"}
verbs = ["借书", "还书", "续借", "算逾期", "算罚款", "催缴"]

kept = [k for k, v in nouns.items() if v == "概念类"]
print(len(nouns), len(kept), len(verbs))   # 8 4 6

实跑输出:

--------------------------------------------------------------------
对图书馆的借阅业务进行建模
--------------------------------------------------------------------

  建模第一步永远是**把话摊成名词和动作**。实测:

  名词         怎么处理
  ------------------------------
  读者         概念类
  书           概念类
  借阅记录     概念类
  罚款         概念类
  书架         丢掉
  馆员         丢掉(只作权限)
  图书馆       丢掉(软件本身)
  借书证       并入读者属性

      名词                        8 个
      成为概念类                  4 个(读者/书/借阅记录/罚款)
      动作                        6 个
      每个动作都要有归属          见 9.8 的用例图

  **名词和动作是两种东西**:名词进概念模型,**动作进用例图。**
  **【借书证】这种要小心**——它不是独立的类,是读者身上的一个属性。
  **这一步做错,后面全错**:类分错了,用例图和表结构都得重画。

实测:8 个名词,4 个成概念类(读者/书/借阅记录/罚款),6 个动作另算。 【借书证】是最容易做错的一个——它是读者身上的属性,不是独立的类。 名词进概念模型、动作进用例图,混在一起画就乱了。

30 秒实验

  1. 拿一段你自己的业务描述,把名词全部抄下来逐个判定。
  2. 检查有没有把【某个属性】误当成一个类。

常见误区

  1. 以为名词越多模型越全。能丢的要丢,留下的才值钱。
  2. 把【借书证】做成独立的类。多一张表、多一个外键、多一堆冗余。
自测三问(点开对答案) 1. 建模第一步做什么? —— 把业务描述摊成名词和动作两类。 2. 实测 8 个名词留下几个? —— 4 个成概念类:读者、书、借阅记录、罚款。 3. 借书证为什么不是类? —— 它是读者身上的一个属性,独立成类会多出表、外键与冗余字段。

相关笔记