[ PROMPT_NODE_26076 ]
data-over-abstractions
[ SKILL_DOCUMENTATION ]
# 面向数据设计
## 核心原则
> “与其让 10 个函数操作 10 个数据结构,不如让 100 个函数操作一个数据结构。”
对通用数据结构进行通用操作,胜过对专用结构进行专用操作。
## 为什么自定义抽象有害
每一个自定义类型、包装类或专用结构:
- 增加了一个需要理解的概念
- 需要其自身的操作
- 限制了与其他代码的组合
- 增加了维护负担
`Map` 可以被数百个现有函数处理。而 `SettingsManager` 类只能被你为它编写的方法处理。
## 信息优于对象
建模信息领域,而不是行为。
- 存在什么数据?
- 什么是本质关系?
- 你需要什么转换?
然后使用通用结构(映射、向量、集合)来表示这些信息。行为来自于操作数据的函数,而不是绑定到自定义对象的方法。
## 实际应用
在创建新类/类型之前,请问:
- 这能成为一个带有明确键的映射/字典吗?
- 这能成为一个简单的元组/记录吗?
- 我需要自定义行为,还是仅仅需要数据?
如果你只需要数据,请使用数据结构。只有当你确实需要无法通过函数实现的自定义行为时,才保留自定义类型。
**力量在于组合,而不在于自定义构造。**
## 外部参考
- [The Value of Values](https://www.infoq.com/presentations/Value-Values/) - Rich Hickey 关于数据与对象的论述
- [Data-Oriented Design](https://www.dataorienteddesign.com/dodbook/) - Richard Fabian 的 DOD 书籍
- [CppCon 2014: Mike Acton "Data-Oriented Design"](https://www.youtube.com/watch?v=rX0ItVEVjHc) - 游戏引擎中的实用 DOD