📄 一句话概括
业务系统的数据几乎全部来自现实里发生过的事——实测一张借阅表 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. 实测 6 个字段怎么分? —— 4 个来自现实事件,2 个由现实规则算出,凭空设计的 0 个。 3. 规则字段与事件字段有何区别? —— 规则字段随规则改变含义,事件字段永远记录那一刻发生过什么。- ☐ 9.7 对图书馆的借阅业务进行建模
相关笔记
- 应用程序不同,建模的内容也不一样 — 业务系统的定位
- 对图书馆的借阅业务进行建模 — 拿同一个业务从头做一遍
- 在业务应用程序中,数据结构反映现实世界 — 这一节的延伸
- 🧩 面向对象是怎样工作的 · 索引