为面向对象编程辩护
摘要
本文通过解释面向对象编程在为数据和行为创建强大抽象方面的益处,为其辩护,同时警示其误用,并论证其在软件开发中的持续相关性。
<p><a href="https://lobste.rs/s/krtqbk/defense_object_orientated_programming">评论</a></p>
查看缓存全文
缓存时间: 2026/09/04 14:17
# 代码与蛋糕——为面向对象编程辩护
来源:https://codeandcake.dev/posts/2025-05-28-a-defense-of-oop
面向对象编程已经不再流行。一些新兴编程语言(如Go和Rust)完全不支持它。即使在支持它的语言中,一些开发者也选择假装它不存在。趋势很明显:开发者认为面向对象编程是个失误。
但我认为这门技艺正朝着错误的方向发展。面向对象编程仍然是编写优秀代码的强大工具。
## 什么是面向对象编程?
面向对象编程是将数据与行为组合成称为"对象"的单元,并将所有内容隐藏在"消息传递"之后的编程风格。一些语言将消息传递映射为函数调用(如Java或C#),而另一些则更字面地理解消息传递(如Ruby或Objective-C)。
我认为这是一种极佳的编程风格,因为它允许你对数据与行为之间及其与外部世界之间的关系做出强大的抽象。
## 数据、行为与外部世界
无论你是否愿意,你的数据都具有行为。
例如,如果你在为一个视频流媒体平台编写代码,视频通常只能由特定国家的用户播放。如果你只是传递没有任何行为的视频结构体,那么使用该结构体的人就必须理解这种关系。这增加了使用你代码的人的心智负担。
在面向对象风格中,数据与行为可以隐藏在消息传递之后。你可以让外部世界不需要知道视频存在地区限制。它只需要知道视频会响应`play`消息。通过这种方式,你创建了一个非常强大的抽象。
创建隐藏某些细节(如地区限制规则)并强调其他内容(如视频可以播放)的抽象,正是面向对象编程的精髓。
对象不是你代码库中唯一的抽象单元,但当你拥有与行为相关联的数据时,它非常有用。
## 问题出在哪里
如果这是如此优秀的解决方案,为什么有些人正在远离它?人们对面向对象编程持保留态度,因为它是一把双刃剑——强大,但容易误用。
合适的抽象可以让代码工作起来令人愉悦。而不合适的抽象则可能成为噩梦:想想Java臭名昭著的`AbstractBeanFactory`或深层的继承陷阱。面向对象编程让好的和坏的抽象都变得更强大。
但人们不应该停止使用刀具。他们应该被教会如何使用而不割伤手指。
相似文章
一封给面向对象的情书
一篇论证面向对象编程的真正本质是消息传递而非类,并介绍了Abject项目和Ask协议,作为对这一思想在AI领域的复兴的文章。
艾伦·凯谈"面向对象编程"的含义 (2003年)
2003年艾伦·凯的电子邮件阐明了"面向对象编程"的原始含义——以消息传递、数据隐藏和生物学/细胞隐喻为中心,最初有意省略了继承。
面向切面编程的回归
一篇重新审视面向切面编程的博客文章,讨论了程序员必须管理的众多横切关注点,如正确性、日志记录和安全性。
面向数据设计简介 [pdf]
本PDF介绍了数据导向设计的概念,这是一种专注于高效数据布局和处理的软件设计方法,尤其在游戏开发中应用。
迈向可理解的软件
本文批判了当前的编程实践和对大语言模型的依赖,反而主张通过更好的抽象、文档和软件栈来使代码更易于理解和维护。