📄 一句话概括
类与现实根本不对齐:一个现实物可能拆成几个类,将近一半的类在现实里找不到对应物。
📝 本节和前面几节的关系
2.7 给了定义,这一节讲它和现实的关系——这是本章最后要拆掉的误解。
一、四种不对齐
一个现实物 → 多个类:顾客在系统里可能拆成 Customer、VIP、Blacklist。
一个类 → 零个现实物:Session、Transaction,纯软件概念。
现实里的关系 → 一个类:Enrollment、OrderItem,关系本身要存数据。
现实里没有的分层:Base、Mixin,纯为复用而生。
二、实测比例
拿一个普通业务系统的九个类名数一数:五个有现实对应物,四个是纯软件概念。 占比 44% 的类,在现实里找不到对应物。 这个比例在业务系统里算低的——工具、框架、中间件里,这个比例会高得多。
三、纯软件概念的类
Repository——负责存取,现实里没有这个工种。
Gateway——负责和外部系统说话,现实里也没有。
Mixin——纯粹为了把几行代码塞给多个类。
它们是【软件的器官】,不是【世界的模型】。
四、别拿现实当标准
常见误区:这个类在现实里找不到对应物,是不是设计错了? 不是。判断标准只有 2.7 那条:它有没有状态和行为需要维护。 反过来也危险:现实里明明有,但系统里不需要——那就不要建类。 类是【为了这个系统的需要】而存在的,不是世界的复印件。
五、动手 Demo:软件并不会直接表示现实世界
先列四种不对齐的关系,再拿九个类名实际数一数比例。 看纯软件概念的类到底占多少。
names = ["Customer", "Order", "OrderItem", "Product", "Payment",
"Session", "Repository", "Gateway", "Mixin"]
real = ["Customer", "Order", "OrderItem", "Product", "Payment"]
pure = [n for n in names if n not in real]
print("总数", len(names))
print("有现实原型", len(real))
print("纯软件概念", len(pure), pure)
print("占比", "%.0f%%" % (len(pure) * 100.0 / len(names)))
实跑输出:
--------------------------------------------------------------------
软件并不会直接表示现实世界
--------------------------------------------------------------------
入门时容易有一个误解:**软件里的类,应该和现实里的东西一一对应。**
**实测下来,两边根本不对齐。**
两边的关系 例子 说明
-----------------------------------------------------------------
一个现实物 → 多个类 Customer+VIP+黑名单 按用途拆开
一个类 → 零个现实物 Session/Transaction 纯软件概念
现实里的关系 → 成类 Enrollment/OrderItem 关系也要存数据
现实里没有的分层 Base/Mixin 纯为复用而生
实测一个普通业务系统的九个类名:
有现实对应物 5 个:Customer、Order、OrderItem、Product、Payment
纯软件概念 4 个:Session、Repository、Gateway、Mixin
占比 4/9 = 44% 无现实原型
**将近一半的类,在现实里找不到对应物。**
它们是**为了软件本身的需要**才存在的:存数据、调外部、做复用。
**所以别拿【能不能在现实里找到】当判断标准。**
实测:9 个类里 5 个有现实原型、4 个是纯软件概念,占 44%。 将近一半的类在现实里找不到对应物——所以别拿现实当判断标准。
30 秒实验
- 数一数你项目里的类,看纯软件概念占多少。
- 找一个【现实里有但系统里没建类】的东西,想想为什么没建。
常见误区
- 以为类必须和现实一一对应。四种不对齐都是正常的。
- 以为现实里有的都该建类。系统不需要就不建。
自测三问(点开对答案)
1. 类与现实有哪四种不对齐? —— 一个现实物拆成多个类、一个类没有现实原型、现实里的关系单独成类、现实里没有的复用分层。 2. 那个 44% 说明什么? —— 一个普通业务系统里将近一半的类是纯软件概念,现实里找不到对应物。 3. 判断该不该建类的标准是什么? —— 它在系统里有没有状态和行为需要维护——而不是现实里有没有这个东西。- ☐ 下一节(2.9 与现实世界的相似增大了可能性)
相关笔记
- 明确定义为编程结构 — 三要素定义
- 与现实世界的相似增大了可能性 — 不对齐为什么还要像
- ⌨️ 编程原理 · 索引 — 抽象与建模
- 🧩 面向对象是怎样工作的 · 索引