一个对象,到底是它内部的那堆字段,还是它和其他对象之间的那堆关系?
两个工程师能为一件事吵一个下午:
A 说,对象就是字段。name、age、balance------把对象拆开,底下是一堆更小的数据,对象不过是一堆字段的总和。
B 说,你错了。对象是关系。它和其他对象怎么交互、消息怎么传、依赖怎么注入------把这些关系一根根抽掉,剩下那堆字段,就不是"它"了。
一个往里拆,一个往外看。这不是脾气问题,这是两种看法的根上就不同。
有意思的是,数学界为这同一件事,吵了三十年,到现在还没彻底分出胜负。
两派数学:集合论 vs 范畴论
一边说,数学的底子是"属于"(∈)。一切数学都能还原成一句话:一个东西属于一个集合。整数、函数、空间,全是集合里的元素。这是集合论,统治了数学一百年。
另一边说,不对,底子是"箭头"(→)。一个东西连到另一个东西,连才是根本;没有"连",单独的"东西"没有意义。这是范畴论,上世纪四十年代冒出来,越战越勇。
两派争的是同一句话:谁才是数学真正垫在底下的那块?
一个坚持"元素 + 属于关系",一个坚持"对象 + 箭头"。听起来像两套完全不相容的数学,其实不是。
拆和连,是同一件事的两道痕迹
你拆开一个对象,看到的是"属于"------这个字段属于这个对象。你不拆,看它和别的对象怎么连,看到的是"箭头"------这个对象指向那个对象。
关键在这:拆和连不是两种不同的活动。
你拆开一个东西的那一刻,拆出来的零件之间,就冒出了新的连接;你连起两个东西的那一刻,这"连"本身就长出了一个新的整体。
一个具体的例子,你每天都在写:
java
Map<String, Integer> m = new HashMap<>();
m.put("count", 42);
这里 "count" → 42 这一个键值对,你可以说"值 42 属于键 count"(集合论视角,元素和集合),也可以说"键 count 指向值 42"(范畴论视角,对象和箭头)。同一个东西,两句话都对。
再往大了看:
- 你写 Entity / POJO / DTO,把对象拆成字段,用 getter/setter 摆弄状态------你站在集合论这边:对象 = 字段的集合。
- 你写接口设计、依赖注入、领域事件、消息流,关注"这个对象和谁连、消息往哪走"------你站在范畴论这边:对象 = 关系网里的一个节点。
- 纠结"贫血模型 vs 充血模型"的人,其实没意识到自己是在两个投影面之间来回跳。
谁才是地基?这个问题问反了
"对象到底是字段还是关系",和"桌子到底是方的还是斜的",是同一类问题。
从正上方拍一张桌子,它是方的;从侧面拍,它是斜的。方和斜,哪个是"真桌子"?都是,也都不是------它们只是从两个方向看同一张桌子,留下的两张图。
所以"谁才是真正的地基"这个问题,问反了。
数学不需要一个唯一的地基。集合论和范畴论不是竞争对手,是同一结构在两个投影面上的影子。往里拆的时候用集合论,往外看的时候用范畴论。往哪看,用哪个。
一句话收尾:
对象既是一堆零件,也是一张关系网。拆和连,是同一件事的两道痕迹。 别再问"它到底是什么",问"你现在从哪个方向看它"。
这个"拆和连是同一件事的两道痕迹"的洞察,出自结构认知 ------第一发现者是林小黑,完整推导见 gitee.com/samforce/st...。