编程语言的“面向过程”和“面向对象”

咱们把自然语言跟编程语言放在一张桌上比划比划,就会发现它们之间隔着一层像翻译官那样的东西。好比咱在书里看到“面向过程”或者“面向对象”,心里总觉得好像懂了,其实还是一知半解。究其原因,根本是计算机这玩意儿只会听二进制的“0”和“1”,我们写的Python、C++还有Java,对它来说都不过是它能暂时听懂的“新方言”。编译器或者解释器就像那个翻译官,负责把我们写的语法规则翻译成二进制指令。一句话解释就是,只要计算机听不懂人话,“翻译官”这种角色就少不了。 不管是动态类型语言还是静态类型语言,最大的不同在于“什么时候查错”。像Python、Ruby还有VBScript这种动态类型的变量,你不用提前说它是什么类型,第一次给它赋值的时候系统就偷偷记住了。这样写起来确实灵活,但坏处是问题可能藏在运行的时候才冒头。而C、C++、C#和Java这类静态类型的语言就比较严格,所有变量写代码的时候就得声明好类型。编译器提前帮你检查好,能让你立马发现错误,运行也快;但这么写起来可读性因人而异,有人觉得是自文档化,有人觉得是自加密。 到底是把问题拆成步骤做,还是当成角色来做?这两种解决问题的思路看似写法不同,其实背后反映了我们对世界的理解方式不一样。像解数学题那样写代码叫面向过程,“先做什么、再做什么”一串函数写下来就行。比如求长方形面积:设长为x宽为y,写个计算面积的函数area(x,y),把x和y传进去拿结果就行了。面向过程像流水线一样清晰高效,流程一变乱起来就像拼图一样难维护。 另外一种方式是把“事物”搬到代码里去做面向对象。先定义个“长方形”对象,再给它绑定面积和周长这些属性跟方法。还是那个求面积的例子:先定义个规则图形类Shape,里面有个area()方法。Shape的子类Rectangle继承面积方法并加上长宽属性。最后创建Rectangle实例调用area()。面向对象把职责装进对象里复用方便、系统耦合低;坏处是第一次写的时候得多想一层对象模型运行速度也略慢些。 说起来没有哪种语言绝对好或坏,主要看你用在什么场景上。写个小脚本用面向过程更直接省事;做个大系统用面向对象维护更轻松。动态语言写原型快、静态语言跑生产稳;现在很多大项目拆成微服务后也会混着用这两种范式。关键是先搞清楚你的问题有多大、维护多久、团队怎么习惯再来决定用哪一把语言锤子。