C++ 大神 John Carmack 的编程传说

来自:CSDN(微信号:CSDNnews),英文原文,作者:cppdepend,译者:安翔,责编:言则

你是否也曾发现那些顶级球星常常能够轻松做出各种高难度动作,而其他球员却无法做到。你是否也在疑惑这其中的原因,为什么顶级球星看起来毫不费力?

作为一名C++程序员,John Carmack 的源代码就像顶级球星的球技一样震撼着我。其代码简单而强大,我很想知道自己如何才能像他一样优秀。

让我们来探索 Doom3(游戏:毁灭战士) 的源代码,深入其中,寻找这些代码简单但强大的原因。

2011年11月23日,id Software(游戏软件公司)延续自己的传统,发布了他们之前引擎的源代码。这些源代码被众多开发者审阅,下面是其中一个针对 Doom3 的反馈信息:

Doom 3 BFG由 C ++编写,C++是一门既强大又复杂的编程语言,它可以编写出无比优秀的代码,但同时也可能让你欲哭无泪。幸运的是,id Software的 C++子集(拥有类的 C 语言)可以让你轻松运用 C++ :

  • 没有异常

  • 没有引用(使用指针)

  • 尽可能少使用模板

  • 常量无处不在

  • 拥有类

  • 多态性

  • 继承

它仅仅是 c++ 98 标准的一个子集。以下是 Doom3 的一些特性:

1、提供一个强大的基类

众多的类都从 idClass 继承而来: 

idClass 提供了下列服务:

  • 实例创建

  • 类型信息管理

  • 事件管理 

2、字符串操作非常简单

通常来说,字符串是一个项目中最常用的数据类型,许多功能都需要字符串来完成,我们需要使用函数来处理它们。

Doom3 定义了一个 idstr 类,它几乎包含了所有与字符串操作相关的方法,非常实用。这样一来,你就不必像其他框架那样需要根据不同的字符串类来定义自己的方法。

3、源代码与GUI框架(MFC)高度解耦

在很多使用 MFC 的项目中,代码与它们的类型高度耦合,并且你可以找到任何代码在 MFC 中的类型。

在 Doom3 中,代码与 MFC 高度解耦,仅有 GUI 类与之直接相关。如下面的 CQLinq 查询所示: 

这个特性大大提升了开发效率。的确,只有 GUI 开发人员必须关心 MFC 框架,而对于其他开发人员来说,则并不需要在 MFC 上浪费时间。

4、提供了一个非常强大的utility程序库(idlib)

几乎在所有项目中,utility 程序类都是最常用的,如下查询结果所示: 

从以上查询结果可以发现 utility 是用得最多的。如果 C++ 开发人员没有一个强大的 utility 程序框架支撑,那么他们将不得不花费大量的时间自己编写。

idlib 几乎提供了很多实用的类和方法,可用来处理字符串、容器和内存。这有利于提升开发人员的工作效率,让他们更加专注到游戏逻辑上。

5、容易理解

作为 C++ 开发人员应该都知道开发解析器和编译器并非易事,而 Doom3 成功实现了一个硬编码的编译器。并且 Doom3 的实现代码非常简洁也很容易理解。

下图展示了编译器使用的类之间的依赖关系: 

以下是编译器源码的代码片段: 

过去我也曾研究过很多解析器和编译器的源代码。但是,这是我第一次发现一个编译器的源代码如此易懂,除了编译器之外,整个 Doom3 的源代码也一样容易理解。这真的很神奇。当我深入研究 Doom3 的源代码时,发现这些代码真的写得太好了。

Doom3 的源代码只使用了 C++ 标准的一个子集,它非常简洁并且易于理解和维护。它遵循代码设计、命名和格式化的基本规范,并没有使用高级技术。

John Carmack 的编程秘诀是完全遵循维基百科定义的 KISS 原则:

KISS 是由美国海军在1960年提出的一项设计原则,KISS 是 “ Keep it simple, stupid ” 的缩写。KISS 原则指出,相比于复杂的系统,越简单的系统往往运行效果越好。因此简单性应当是设计过程中需要关注的关键指标,同时应当尽量避免不必要的复杂性。

KISS 原则的核心思想是:相比于复杂的系统,越简单的系统往往运行效果越好。

采用新C++标准时的注意事项

新标准引入了许多有趣的新功能。但是不要认为使用这些功能就可以让你的代码变得高效。实际上,许多新功能对开发通用库更为有用,特别是与通用编程相关的功能。

不要强迫自己使用所有的新功能,在绝真正需要或者有助于提高代码效率时使用即可。例如,这篇文章就讨论了过度使用 auto 关键字的缺点。

推荐↓↓↓
C语言与C++编程
上一篇:C语言这些是冷笑话?超级搞笑的C语言,段友出征了,寸草不生了! 下一篇:GCC 8 的可用性改进:让错误信息和提示更具帮助性