2.4 KiB
2.4 KiB
消息与对象:理解执行模型
原书依据:第 1–2 章,印刷页 1–8,PDF 页 12–19。
Smalltalk 的基本动作是:向一个接收者发送消息,由接收者的类决定执行哪个方法。数字、字符串、集合、类和块都能成为接收者。程序由相互发送消息的对象组成。
把表达式拆成三个部分
8 + 5
'hello' size
#(10 20 30) at: 2
| 表达式 | 接收者 | 选择子 | 参数 | 推演结果 |
|---|---|---|---|---|
8 + 5 |
整数 8 | + |
5 | 13 |
'hello' size |
字符串 | size |
无 | 5 |
#(10 20 30) at: 2 |
数组 | at: |
2 | 20 |
消息是请求;方法是为响应请求而执行的实现。选择子标识这次请求的名称。不同类可以实现同一个选择子,因此同一条消息能够触发不同的行为。
变量保存引用
| first second |
first := OrderedCollection new.
second := first.
first add: 8.
second size
预期最后得到 1:两个变量指向同一个集合。赋值没有自动复制集合。理解引用关系,是之后理解浅复制、模型共享和对象检查器的基础。
对象的状态与它支持的消息要分开看。调用方通过协议与对象协作;读取某个内部槽位的调试能力,不等于应用程序应依赖那个槽位。
表达式可以继续发送消息
(8 + 5) printString
先得到 13,再向结果发送 printString。与之不同,collection add: item 的结果不一定是集合;链式发送前必须确认方法返回值。语法篇解释如何用级联表达“始终向原接收者发送”。
镜像为什么重要
原书描述的 virtual image 是包含对象和类的系统世界。开发时可以浏览类、编译方法、检查运行对象并继续执行。语言工具和应用共享对象体系,使重用既有类库成为日常开发方式。
这是历史系统的组织方式;不能据此推断任意镜像的持久化、发布或隔离策略。研究时要同时记录类的定义和当前镜像状态,避免把一次手工修改当成可复现的工程成果。
自检
为何两个对象都能接收 size,却不需要有相同的数据布局?因为调用方依赖消息协议,各自的类提供方法。下一篇从词法和优先级说明如何读出真正发送的消息。