在软件工程的演化史上,我们似乎经历了一个巨大的钟摆运动。
从 C 语言的自由狂放,到 Java/C++ 面向对象(OOP)的森严壁垒,再到如今 Rust 和 Go 的崛起。很多人认为这是一种“倒退”,因为它丢弃了继承,丢弃了复杂的类。
但实际上,这是一种螺旋上升的综合(Synthesis)。
现代编程范式并非简单的“去 OOP 化”,而是站在 C 与 OOP 的中间,利用强大的类型系统作为粘合剂,达成了一种更高级的哲学境界:该聚合的聚合,该分离的分离。
第一阶段:C 语言的“完全分离” (The Thesis)
哲学: 数据就是数据,代码就是代码。
在 C 语言的时代,世界是平铺直叙的。
- 分离:
struct定义内存布局,函数定义逻辑。两者在语法上没有必然联系。 - 自由:你可以写一个函数去操作任何符合内存布局的数据。
- 代价:这种分离过于彻底,导致了“内聚性”的缺失。数据缺乏保护,逻辑散落四处,全靠程序员的自律来维持秩序。
第二阶段:OOP 的“强行聚合” (The Antithesis)
哲学:世界是由对象组成的,数据必须和行为绑定。
为了解决 C 的混乱,OOP 走向了另一个极端。
- 聚合:OOP 认为数据(属性)和行为(方法)必须死锁在一个
Class容器里。 - 约束:通过继承(Inheritance)来复用代码,通过
private来保护数据。 - 代价:这种聚合过于僵硬。为了复用一个简单的功能,你不得不继承庞大的父类(“香蕉与大猩猩问题”)。业务逻辑被层层叠叠的类结构锁死,修改变得极其困难。