工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)

简介: 工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)

什么又称为面向对象语言、面向过程语言

面向对象语言其实就是有现成的语法机制来支持类、对象的语言,比如 Java。

当然还要有支持继承、多态的语法机制。

面向过程语言就反着理解,没有现成的语法机制来支持类、对象等基本单元来组织代码。

当然不是你用了面向对象语言写出来的代码就面向对象了。

你要通篇就一个 class,一堆杂乱无章都往里面塞,不归类、没有封装的意识,一条直到,这可不叫面向对象编程。

当然也不是用面向过程语言就写不出面向对象的代码,只是由于语法层面的不支持,写起来没那么方便,需要用一些手段,具体就不展开了。

所以语言只是为了更好的支持编程范式,重要的还是思想上的转变。

面向对象编程真的就这么好吗?

结论先上:软件设计没有银弹,没有最好的,只有合适的。

前面也提到了面向对象更符合人类的思考方式,这其实就是优势,能 hold 住复杂的需求。

复杂的需求关系都是错综复杂的,我们分类、抽象、封装就能得到一个个规范化的模块(类)。

大型项目都需要很多人协同合作,因为划分的清晰,每个人只要实现自己负责的模块。

然后根据模块之间关系再组装起来即可。

脉络清晰也使得我们开发的时候思路也异常的清晰,提升开发的效率。

并且由于封装的特性,类的内部是高度内聚的,会利用访问控制权限暴露出有限的访问,这使得类内部的数据不会被随意更改,提高代码的维护性。

还有前面提到的继承,提高代码的复用性,由继承实现的多态也符合开闭原则。

我还看过一个很形象的解释(很久之前看过,忘了出处),说面向过程是蛋炒饭、面向对象是盖浇饭。

蛋炒饭混合在一起,盖浇饭是分层的,如果不要葱,盖浇饭把上面的菜拨了直接换个没葱的菜,蛋炒饭就难搞了,得重新炒一份。

其实这个比喻体现的思想就是面向对象可维护性比较高,而且可以重用,更加灵活。

而面向过程就不易维护,不易扩展。

这个比喻没错,上面的说法也没错,但是我觉得需要加个前提:在合适的场景。

虽说我上面列了很多面向对象编程的优点,但是软件设计没有银弹,没有最好的,只有合适的。

当你做一个很简单的玩意,比如简易计算器,你抽象来抽象去其实意义不大,直接按照面向过程的设计一条道走到底才是最合适的。

就像我们平日里面写代码,是否遇到个情况:为了一个功能需要新建一个类,然后类里面就一个方法。

因为按照面向对象的思维,这个是需要抽象的。

然后为了复用还做了继承、预留了一些接口等等,就想着以后扩展。

可能过了很多年到这个项目扑街了,都没扩展上。

在项目里很多地方都做了这样的钩子,都白费,没鱼儿上钩。

还不如当时就直来直往的写,绕来绕去的新同事进来看的都一脸懵逼。

有些人说代码就是得这样写,就是要为了之后的扩展,设计模式上!

扪心自问一下,有多少之后用上了?

所以有很多大牛在那里骂:

“面向对象编程是一个极其糟糕的主意,只有硅谷里的人能干出这种事情。” — Edsger Dijkstra(图灵奖获得者)

“有时,优雅的实现只需要一个函数。不是一个方法。不是一个类,不是一个框架。只是一个方法。” — John Carmack(id Software的创始人、第一人称射击游戏之父)

“面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)

还有挺多,我就不列出来了。

确实有时候写代码的时候能明显感觉到有时候需要的只是一个函数。

所以对于那些:别问,问就是面向对象,还有一些大肆鼓吹设计模式的:别问,问就是设计模式 的人而言,我是不认可的。

还是那句:

软件设计没有银弹,没有最好的,只有合适的。

复杂的业务用面向对象编程就合适了吗?

一般的说法是面向对象适合复杂的场景,这句话其实也不全对。

当时我在打 LOL 的时候就在感叹,这技能的释放,然后又因为加了 buf 可能有什么特别的计算,每一次版本变更好像改的东西挺多啊。

就像亚索出来的时候,这狂风绝息斩对石头人的大没用,被蝎子拉了也没用,这不是得做很多判断啊。

每新出一个英雄,new 一个对象,其他英雄对象都得改啊,因为新英雄针对不同英雄可能有不一样的伤害效果。

总之我觉得很复杂,每一次改动会涉及很多很多,所以脑子里面就有疑问这是怎么做的,面向对象的话得改好多呀。

前几天我看到了知乎 invalid s 的回答,给我解了惑。

原来复杂的业务用面向对象编程还真不一定合适。

他举的是 WOW 的例子,虽说我不知道 LOL 是不是这样做的,但是这不重要。

他让我知道在这个场景里面如果是以面向对象来设计,那面对如此繁多的职业、种族和技能,在频繁地版本迭代下是招架不住的。

我截个图,链接我放文末。


image.png


这种情况可以利用法术/技能数据库化即表格化来解决。


image.png


所以从中可以看到不是面对复杂的场景就直接上面向对象的,还是得具体情况具体分析,面向对象不是万能的。


最后


其实我还看到有人说面向对象的本质是对真实世界的映射,这还真不一定。

我们平日写代码能很明显地感受到有时候就是为了抽象和复用搞了一个类。

而且很多情况抽象出来的类和现实对应不上,反正就是为了需求而造的一个类。

网上也看到很多言论,说啥 OOP 就是错的、或者说 OOP 就是对的。

我觉得都很极端,还是那句软件设计没有银弹,没有最好的,只有合适的。

关于面向对象还想提一下。

在去年我写 Fork/Join 的时候提到了分而治之。

面向对象其实也有这味道。

拿古代举例,皇帝其实不知道具体治理细节,也不用管理具体细节,一个国家这么大的庞然大物抽象了很多事务,分成了很多类官员。

然后将每类官员需要做的事情封装好,让每类官员各司其职。

皇帝只需要统筹全局,根据每类官员的职责颁发不同的任务即可,不需要关心他具体是如何实施的。

皇帝只要说,让各县都推行啥啥啥,即可。

其实等于只要招呼县令这个类去做事情,管你哪个县,皇帝不需要关心。

然后每个县令得到相同的命令,但是会有各自的治理方法,这其实就是多态。

这其实就是面向对象的思想。

好了,说了这么多不知道能不能讲清什么叫面向对象,如果不清晰的话还望见谅,毕竟能力有限。

我再稍微的总结一下面向对象编程:

OOP 其实就是一种编程范式或者说风格,是一种以类或对象为单元来组织代码的编码方式,让代码高内聚,低耦合。

OO 符合人类面对复杂事物时思考方式,抽象、建模、分类、归类。

微信搜索【yes的练级攻略】,关注 yes,回复【123】一份20W字的算法刷题笔记等你来领,从一点点到亿点点,我们下篇见。 个人文章汇总:github.com/yessimida/y… 欢迎 star !


巨人的肩膀


www.cnblogs.com/hdu-2010/p/…

www.zhihu.com/question/20…


相关文章
|
安全 Java
【面试题精讲】为什么 Java 不引入引用传递呢?
【面试题精讲】为什么 Java 不引入引用传递呢?
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
412 2
|
Java Go 开发者
|
25天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
34355 136
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
7天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
3235 17
|
20天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7500 21
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
19天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
5210 12