面向对象编程中 35 年的错误:软件架构与历史背景的深度剖析

Better Software Conference

总结:

本视频深入探讨了面向对象编程(OOP)中一个重要的“35 年的错误”,该错误源于普遍采用的编译时层次结构,而该层次结构又严格地反映了领域模型。

  • 从 Looking Glass 在 1998 年用于《神偷》等游戏的实体组件系统(ECS)开始,它按系统而非对象层次结构组织数据,证明了其效率。
    实体组件系统 (ECS) 架构
    实体组件系统 (ECS) 架构 [ 00:04:20 ]
  • 这个被定义为“匹配领域模型的封装的编译时层次结构”的“错误”,偏离了早期更灵活的模式。
    定义的“35 年的错误”
    定义的“35 年的错误” [ 00:11:10 ]
  • 演讲者追溯了这种方法,从 C++(Stroustrup)和 Simula(Nygaard 和 Dahl)开始,他们主要关注代码重用和类型安全,但没有完全意识到对复杂系统的架构影响。
  • C.A.R. Hoare 提出了具有类型安全区分联合体的互斥子类,这是一个关键的分歧,但这个概念在主流 OOP 中基本丢失。
    C.A.R. Hoare 的区分联合体切换
    C.A.R. Hoare 的区分联合体切换 [ 00:46:48 ]
  • 真正的起源揭示了更早、更强大的面向数据的设计:Douglas Ross 在 20 世纪 50 年代的“plex”系统(类似于现代带有函数指针的结构体),以及 Ivan Sutherland 在 1963 年的 Sketchpad,它使用“全知”系统来直接操作统一数据存储中的组件。
    Sketchpad 的数据模型,展示了约束、变量和拓扑
    Sketchpad 的数据模型,展示了约束、变量和拓扑 [ 01:39:15 ]
  • 演讲者分享了 1997 年的个人轶事,当时他为一个关卡编辑器复杂的 OOP 层次结构而苦苦挣扎,无意中试图实现一个类似 ECS 的系统。
    Negaman 中复杂的 C++ OOP 代码示例
    Negaman 中复杂的 C++ OOP 代码示例 [ 01:25:36 ]
  • 这种疏忽导致了灵活性较差且通常更复杂的代码,这种模式仍在现代 OOP 教程中教授,突出了对架构洞察力的一个失落时期。核心问题是,看似有效的隐喻可能会抑制更强大的潜在洞察力。

“错误”介绍 [00:00:00]

演讲者介绍了软件架构中一个重要的“35 年的错误”,特别是在面向对象编程(OOP)中。

“错误”的起源:C++ 和 Simula [00:16:32]

探讨了这个有问题的 OOP 范例的历史根源,从 C++ 及其前身 Simula 开始。

追溯到 Simula 及其起源 [00:31:47]

为了理解核心思想,将血统进一步追溯到 Simula 的发展。

更深层次的根源:C.A.R. Hoare 和区分联合体 [00:41:59]

“子类”思想的起源归功于 C.A.R. Hoare,揭示了一个关键的分歧。

真正的起源:Douglas Ross 和 Ivan Sutherland [00:50:50]

影响链被进一步追溯,揭示了这些基本思想的最终起源。

演讲者个人遇到的“错误” [01:19:47]

Casey Muratori 分享了他在 1997 年遇到的“错误”的个人经历。

持久的影响和前进的道路 [01:46:58]

问答:更多见解 [01:50:11]

演讲者回答问题,提供更多背景信息和个人反思。