知识卡片
好抽象要在简化与灵活性间取舍
内容
提高编程抽象层次的基本困境是:如何设计出真正简单、又不丢失太多灵活性的模型?如果开发人员想在硬盘上直接建立快速索引,文件流抽象反而会成为阻碍。最好的抽象要能解决和封装问题中最难的部分,同时仍为使用者保留足够灵活性:封装太多或者封装错了,抽象就会变得毫无用处;封装太少,又达不到简化编程的目的——正如Alan Kay所说,”简单的事情应该简单,但依旧保有完成复杂事情的可能”。MapReduce是个好例子:它抽象并封装了分布式数据处理中最难的部分(大量工作者实例的调度、失败节点的处理、数据的聚合),同时仍为程序员留有足够的灵活性来解决各种各样的问题。
结构图:
flowchart LR
A["封装太多/封错<br/>→抽象毫无用处"]
B["理想抽象<br/>封装最难的部分+保留灵活性"]
C["封装太少<br/>→达不到简化目的"]
A -.-> B
C -.-> B
B --> M["例:MapReduce封装调度/容错/聚合,仍留灵活性"]
参考来源
- 位置:《架构师应该知道的37件事》第2章《架构》之"2.4 别有代码恐惧症"·"2.4.4 简单化与灵活性"(源文件:_epub-src/OEBPS/Text/chapter002.html)
- 结论依据:原文说明"最好的抽象能够解决和封装问题中最难的部分,同时仍能为使用者保留足够的灵活性。如果抽象封装了太多的事情或者封装错了,它就会变得毫无用处;如果抽象封装得太少,也无法达到简化编程的目的……MapReduce就是个很好的例子",直接支撑本卡结构图。
- 原始内容:简单的事情应该简单,但依旧保有完成复杂事情的可能。