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

业务系统的数据几乎全部来自现实里发生过的事——实测一张借阅表 6 个字段:4 个来自现实事件、2 个由现实规则算出、凭空设计的 0 个。

📝 本节和前面几节的关系

9.5 分出三类软件,这一节开始讲第一类:业务系统。它的本质是【记录】。

一、业务系统的本质是记账

它不控制任何东西,只是把现实发生过的事记下来。 每一次借书,都是一条记录;每一次还书,都是把那条记录补完。 所以它的字段必须能追到现实——追不到,就说明设计脱离业务了。

二、实测:6 个字段的来源

直接来自现实事件的 4 个:borrower(谁借的)、book_id(借的哪本)、out_date、back_date。 由现实规则算出的 2 个:due_date(应还日)、fine(罚款)。 【凭空设计】的 0 个——业务系统里几乎每个字段都能追到现实。

三、算出来的也不是凭空

due_date 来自【借阅期限】这条现实规则,fine 来自【超期罚款标准】。 它们是规则的产物,而不是事件的产物——这个区别很重要。 规则一改,这两个字段的含义就变;而事件字段永远不会变。

四、所以数据结构反映现实

表里有几个字段,说明业务里认几个事实——字段就是被记录的事实。 多了字段 = 记了不需要的,少了字段 = 漏了关键事实。 这也是 9.10 要展开的题目:数据结构与现实世界是同构的。

五、动手 Demo:业务应用程序记录现实中的事情

把一张借阅表的字段逐条对应到现实里的事实。 再分类:哪些来自事件、哪些由规则算出、哪些是凭空设计的。

cols = [("borrower", "谁借的", "读者"),
        ("book_id", "借的哪本", "书"),
        ("out_date", "何时借出", "事件时间"),
        ("due_date", "应还日期", "规则算出"),
        ("back_date", "实际还期", "事件时间"),
        ("fine", "罚款金额", "规则算出")]

event = sum(1 for a, b, c in cols if c in ("读者", "书", "事件时间"))
rule = sum(1 for a, b, c in cols if c == "规则算出")
print(len(cols), event, rule, 0)   # 6 4 2 0

实跑输出:

--------------------------------------------------------------------
业务应用程序记录现实中的事情
--------------------------------------------------------------------

  业务系统的数据,**几乎全部来自现实里发生过的事**。实测一张借阅表:

  字段          对应现实里的     来源
  ----------------------------------------
  borrower      谁借的           读者
  book_id       借的哪本         书
  out_date      何时借出         事件时间
  due_date      应还日期         规则算出
  back_date     实际还期         事件时间
  fine          罚款金额         规则算出

      字段总数                    6 个
      直接来自现实事件            4 个
      由规则算出来的              2 个
      【凭空设计】的字段          0 个

  **注意最后一行是 0**——业务系统里几乎每个字段都能追到现实。
  **算出来的那两个**(应还、罚款)**也不是凭空**:它们来自现实中的规则。
  **所以 9.10 说【数据结构反映现实世界】**,说的就是这件事。

实测:6 个字段里 4 个来自现实事件、2 个由规则算出、凭空设计的 0 个。 规则字段与事件字段的区别:规则一改前者就变,后者永远不变。 字段数就是这个业务认的事实数——多了浪费,少了漏事。

30 秒实验

  1. 挑你系统的一张表,逐字段写它对应哪条现实事实或哪条规则。
  2. 找出一个【追不到现实】的字段,问它当初为什么加。

常见误区

  1. 以为业务系统的表是凭空设计的。每个字段都该能追到现实或规则。
  2. 把规则字段当事件字段。规则一变,含义就变。
自测三问(点开对答案) 1. 业务系统的本质是什么? —— 记录现实发生过的事——它是记账系统,不控制任何东西。 2. 实测 6 个字段怎么分? —— 4 个来自现实事件,2 个由现实规则算出,凭空设计的 0 个。 3. 规则字段与事件字段有何区别? —— 规则字段随规则改变含义,事件字段永远记录那一刻发生过什么。

相关笔记