过程编程之后,向抽象生长

开始阅读

随便写写。

想起之前我们c语言的老师讲,写代码要按照层次来写。

其实我一直习惯于一种更“自然”的方式:从上往下,想到哪里写到哪里(doge)

我觉得在真正敲下代码之前,脑子里应该已经有一套相对完备的伪代码,只有在把逻辑骨架转化为具体实现的过程中,才去深入细节。

后来我才真正理解了老师所说的“层次化”究竟意味着什么。我们过去所推崇的,其实是一种线性、分叉式的代码风格:优先做判断,再处理遍历;尽可能减少嵌套层级,以降低大O复杂度,提升执行效率(依稀记得当年高中信息课上“优化成风”)。这种方式在小型逻辑或算法实现中非常高效,也符合直觉。

但随着程序规模的增长,这种“顺写”的方式逐渐显露出局限。程序语言不是自然语言,将逻辑按职责拆解为清晰的模块或层级不仅让注释更易组织,也让代码具备更高的可读性与可维护性。这本质上是一种双线交互:程序既要正确地与机器沟通,也要清晰地向人他人表达意图——双线交互(而非双向)。

更进一步地,从这种结构化需求中,我们发现了出了类与函数的设计原型。当程序不再只是“执行一系列步骤”,而是要“操作具有状态和行为的实体”时,面向对象编程(OOP)便成为一种近乎必然的选择:

不管是扁平容器还是序列,本质上都是对象操作,——既包含数据,也封装行为。只有当这些对象被合理分层、严格封装,系统才可能走向规范化、标准化。

这也正是 OOP 三大支柱所应对的核心问题:

封装:隐藏内部实现,暴露稳定接口;

继承:提取共性,支持抽象(如 Abstract Base Class);

多态:让不同对象对同一消息作出差异化响应(例如 .forward() 在 CNN 与 RNN 中行为不同,却共享统一调用方式)。

C++ 从 C 中演化而来,恰恰同样是对这一趋势的直接回应。

Bjarne Stroustrup 在贝尔实验室开发大型仿真系统时,曾尝试使用早期面向对象语言 Simula。他欣赏其类、继承与封装的思想,却不满于其运行效率低下,难以胜任系统级编程。于是,在 1980 年代初,他做了一件关键的事:将 Simula 的面向对象理念,“嫁接”到 C 语言高效、贴近硬件的骨架之上。最初这个语言被称为 “C with Classes”,后来演变为 C++。

有趣的是,C++ 从不强制你使用面向对象。你可以用纯 C 风格编写 C++ 程序,也可以在需要抽象时启用类、模板,甚至引入函数式特性。它所信奉的,是 “零成本抽象” 原则:你不用的特性,绝不带来额外开销。这种克制与包容,正是它能在系统编程与大型应用中长久立足的关键。

所以在本质上,它还是一种编程风格的选择。

用了多年python,刚刚开始用c语言是不太习惯的。疯狂的格式错误、编译错误是常态:怎么print后面还要加f的?你又不是f-string…怎么又忘记加分号了(悲

理论再美,也挡不住在密密麻麻中寻找一个丢失的;(虽然debugger可以很快找出来)

抽象对象也是需要编译器来实现的嘛。

全文完

回到文章开头 ↑

从写作、创作和记录中寻找。