📄 一句话概括
入门最省事的办法:拿一张业务单据,把名词圈出来变成类;但圈出来的那一刻就已经走样了——顾客要有 id,订单要有状态。
📝 本节和前面几节的关系
第一章讲完了为什么难,这一章开始拆【比喻】这件事:先看它怎么用,再看它什么时候失效。
一、从一张单据开始
【顾客下单】这件事,单据上就几个名词:顾客、订单、订单上的一行、收货地址。 圈名词=找类,这是入门最见效的一招,一学就会。 四个名词,四个类:Customer、Order、OrderItem、Address。
二、圈出来就已经走样了
顾客——现实里靠脸认人,软件里必须有 id。
订单——现实里就是一张纸,软件里必须有状态(待付/已付/已发)。
订单上的一行——现实里没人管一行字叫【东西】,软件里必须给它一个类。
地址——现实里只有一个,软件里往往要两个(收货地址、账单地址)。
圈的是名词,落下来的是数据。这两件事从来不完全一样。
三、这个方法能用多久
做业务系统时能一直用——因为业务系统本来就在记录现实里的事。 做框架、工具、中间件时就不灵了——那里面的类,现实里一个都找不到。 所以这一招是入场券,不是全程车票。第 7 章会讲它的边界:面向对象怎么变成【通用的归纳整理法】。
四、第一次见到【似是而非】
OrderItem 这一条最典型:它不是商品,也不是订单。
它是【订单和商品之间的那一条关系】,而且这条关系要存数据(数量、单价)。
这就是本章标题的意思:像,但不是——这正是 2.6 的正题。
五、动手 Demo:对照现实世界介绍面向对象
把四个名词变成四个类,用 vars() 数一数字段。
看圈名词这个办法落在代码上是什么样。
class Customer:
def __init__(self, cid, name, phone):
self.cid, self.name, self.phone = cid, name, phone
class Order:
def __init__(self, oid, customer, items, status):
self.oid, self.customer = oid, customer
self.items, self.status = items, status
class OrderItem:
def __init__(self, product, qty, price):
self.product, self.qty, self.price = product, qty, price
class Address:
def __init__(self, province, city, street, zipcode):
self.province, self.city = province, city
self.street, self.zipcode = street, zipcode
c = Customer(1, "小林", "139")
o = Order(9, c, [], "待付")
it = OrderItem("键盘", 2, 199)
ad = Address("湖北", "宜昌", "某路 1 号", "443000")
for x in (c, o, it, ad):
print(type(x).__name__, len(vars(x)))
实跑输出:
--------------------------------------------------------------------
对照现实世界介绍面向对象
--------------------------------------------------------------------
最省事的入门方法:**拿一张业务单据,把上面的名词圈出来,一个一个变成类。**
现实里的说法与软件里的类:
现实里的说法 软件里的类 差在哪
---------------------------------------------------------------
顾客 Customer 还得有 id,现实里靠脸认人
订单 Order 还得有状态(待付/已付/已发)
订单上的一行 OrderItem 现实里没人管一行叫【东西】
收货地址 Address 可复用:账单地址也用它
真跑一遍——把这四个类写出来,`vars()` 数一数字段:
Customer 3 个字段
Order 4 个字段
OrderItem 3 个字段
Address 4 个字段
实测合计:**4 个类、14 个字段。**
**注意第三行**:`OrderItem` 在现实里就是【订单上的一行字】。
它不是商品,也不是订单,**可软件必须给它一个类**——因为数量、单价要存。
**这就是后面 2.6 要说的【似是而非】。**
实测:4 个类、14 个字段(3+4+3+4)。
注意 OrderItem——现实里只是【订单上的一行字】,软件里必须是一个类,因为数量、单价要存。
30 秒实验
- 拿一张你熟悉的业务单据,把名词圈出来,看能圈出几个类。
- 再把圈出来的类跟现实里的东西比一比,看哪些已经走样了。
常见误区
- 以为圈名词能一路用到底。做框架、工具时它就不灵了。
- 以为类必须一一对应现实里的物。
OrderItem就不是。
自测三问(点开对答案)
1. 圈名词这个办法怎么用? —— 拿一张业务单据,把上面的名词圈出来,一个名词变成一个类。 2. 为什么说圈出来就已经走样了? —— 顾客要有 id、订单要有状态、地址往往要两个——圈的是名词,落下来的是数据。 3. 这个办法什么时候不灵? —— 做框架、工具、中间件时,那里面的类在现实里一个都找不到。- ☐ 下一节(2.2 类指类型,实例指具体的物)
相关笔记
- 面向对象和现实世界是似是而非的 — 本章正题
- 原因之二:滥用比喻引起混乱 — 上一章埋的伏笔
- ⌨️ 编程原理 · 索引 — 编程全貌课
- 🧩 面向对象是怎样工作的 · 索引