如果您在网上搜索最佳的C ++源代码,则会多次提及Doom3源代码,并附带诸如此类的推荐。

我花了一些时间浏览Doom3源代码。 它可能是我见过的最干净,最漂亮的代码。

《毁灭战士3》是由id Software开发并由Activision发行的视频游戏。该游戏是id Software的商业成功; 售出了超过350万本游戏。

2011年11月23日,id Software保持了这一传统,并发布了其先前引擎的源代码 。 许多开发人员都审查了此源代码,以下是fabien( 原始源代码 )的反馈示例:

Doom 3 BFG用C ++编写,这种语言是如此广泛,以至于它可以用来生成出色的代码,但也可以使人流血。 幸运的是,id软件选择了一个接近“带有类的C”的C ++子集,该子集几乎没有阻力地流向大脑:

  • 没有例外。
  • 没有引用(使用指针)。
  • 模板使用最少。
  • 到处都是const。
  • 类。
  • 多态性。
  • 遗产。

许多C ++专家不再建议使用“带有类的C”方法。 但是,Doom3是在2000年至2004年之间开发的,这可以解释为什么没有使用现代C ++机制。

让我们使用CppDepend深入其源代码,并发现它的特殊之处。

Doom3使用很少的项目进行了模块化,这是其项目列表以及有关其类型的一些统计信息:

这是依赖关系图,显示了它们之间的关系:

Doom3定义了许多全局功能。 但是,大多数处理都是在课堂上实施的。

数据模型是使用结构定义的。 为了在源代码中使用结构有一个具体的想法,上面的度量视图将它们显示为蓝色矩形。

在“度量标准视图”中,代码​​库通过树形图表示。 Treemapping是一种使用嵌套矩形显示树状结构数据的方法。 使用的树结构是通常的代码层次结构:

  • 项目包含名称空间。
  • 命名空间包含类型。
  • 类型包含方法和字段。

正如我们所看到的,定义了许多结构,例如40%以上的DoomDLL类型是结构。 它们被系统地用来定义数据模型。 许多项目都采用了这种做法,在多线程应用程序的情况下,这种方法有很大的缺点。 实际上,具有公共领域的结构并不是一成不变的。

有一个重要的观点支持使用不可变对象:它极大地简化了并发编程。 考虑一下,为什么编写适当的多线程编程是一项艰巨的任务? 因为很难同步线程对资源(对象或其他OS资源)的访问。 为什么很难同步这些访问? 因为很难保证在多个对象上的多个线程进行的多个写入访问和读取访问之间不会存在竞争条件。 如果没有更多的写访问权限怎么办? 换句话说,如果线程访问的对象的状态不变,该怎么办? 不再需要同步!

让我们搜索至少具有一个基类的类:

几乎40%的结构和类都有基类。 通常,在OOP中继承的好处之一就是多态性,下面是在源代码中定义的虚拟方法:

超过30%的方法是虚拟的。 它们很少是虚拟的,这是定义的所有抽象类的列表:

仅定义了52个抽象类,其中35个定义为纯接口,即它们的所有虚拟方法都是纯的。

让我们使用RTTI搜索方法

只有极少数的方法使用RTTI。

为了仅恢复使用OOP的基本概念,不使用高级设计模式,不过度使用接口和抽象类,将RTTI和数据的有限使用定义为结构。

到目前为止,没有什么特别的方法将此代码与其他使用“带有类的C”的代码区分开,并遭到许多C ++开发人员的批评。

以下是开发人员的一些有趣选择,以帮助我们了解其秘密:

1 —为公共基类提供有用的服务。

许多类都从idClass继承:

idClass提供以下服务:

  1. 实例创建。
  2. 键入信息管理。
  3. 事件管理。

2-简化字符串操作

通常,字符串是项目中最常用的类型,使用它们进行了许多处理,我们需要函数来对其进行操作。

Doom3定义了idstr类,该类包含几乎所有用于处理字符串的有用方法,而无需像其他框架提供的许多字符串类那样定义自己的方法。

3-源代码与GUI框架(MFC)高度分离

在许多使用MFC的项目中,代码与类型紧密相关,您可以在代码中的任何位置从MFC中找到类型。

在Doom3中,代码与MFC高度分离,只有GUI类才具有直接依赖性。 如以下CQLinq查询所示:

这种选择对生产率有很大影响。 确实,只有Gui开发人员才必须关心MFC框架,对于其他开发人员来说,并不是必须浪费时间使用MFC。

4-它提供了一个非常好的实用程序库(idlib)

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

正如我们可以看到的,最常用的是实用程序。 如果C ++开发人员没有为实用程序使用良好的框架,则他们会花费大部分开发时间来与技术层抗衡。

idlib提供有用的类以及所有需要的方法来处理字符串,容器和内存。 这促进了开发人员的工作,并使他们更加专注于游戏逻辑。

5-实施非常容易理解

Doom3实现了一个硬编码的编译器,正如C ++开发人员所知道的那样,开发解析器和编译器并非易事。 但是,Doom3的实现非常容易理解,其代码也很干净。

这是编译器使用的类的依赖关系图:

这是编译器源代码的代码片段:

我们已经研究了许多解析器和编译器的代码源。 但是,这是我们第一次发现具有易于理解的源代码的编译器,对于整个Doom3源代码都是相同的。 这是魔法。 当我们探索Doom3源代码时,我们不能说:哇,真漂亮!

摘要

即使Doom3的设计选择是非常基本的,但其设计人员还是做出了许多决定,让开发人员将更多精力放在游戏逻辑上,并促进所有技术层的工作。 从而大大提高了生产率。

但是,在使用“带类的C”时,您必须确切地知道自己在做什么。 您必须像Doom3开发人员一样是专家。 不建议初学者冒险并忽略Modern C ++建议。

From: https://hackernoon.com/doom3-is-the-proof-that-keep-it-simple-works-3884d2484084

Doom3证明了“保持简单”有效。相关推荐

  1. 费马小定理简单证明和一些简单应用

    打字不变就在纸上证明好了1 这种证法是一种很巧妙的方法,避免了一些复杂概念的引入,很简单的证明了费马小定理 那么费马小定理具体有什么地方可以应用呢 1.我们可以用它判断一些大数是否为质数也就是Mill ...

  2. 等面积圆柱投影的简单证明

    在上一篇文章<等面积圆柱投影的证明>中,我们成功证明了[正轴等面积切圆柱投影]确实能够等面积地投影地球,但证明过程中用到了微积分,这可是对许多人来说很头疼的高等数学,所以我们换一种简单的证 ...

  3. BCH测试网上出现第一个UTXO证明

    我们都知道我们看到的比特币现金的余额其实都来自于UTXO,即未花费的交易输出.正是因为采用了UTXO才让我们的交易全部都记录在区块链上,保证了去中心化. 基于此,一个名为Tomas 的人提出了UTXO ...

  4. 【计算理论】可判定性 ( 对角线方法 | 证明自然数集 N 与实数集 R 不存在一一对应关系 )

    文章目录 一.对角线方法 二.证明自然数集 N 与实数集 R 不存在一一对应关系 三.对角线方法意义 一.对角线方法 数学上使用 对角线方法 证明了一个很重要的数学命题 , 自然数集 与 实数集 不是 ...

  5. xargs的简单解析

    根据<Linux与unix shell编程指南>第2章 对xargs解析如下: xargs的作用是用来回避对命令行长度的限制,它通过使用一个参数多次调用一个命令实现这一功能,而不是一次使用 ...

  6. asp从后台调出的公式怎么参与运算_吴望一《流体力学》第一章中微分运算公式的初等证明...

    本文中,矢量场均用箭头指示,例如 为矢量场, 为标量场. 本文只涉及吴望一<流体力学>第一章中所列的17条微分运算公式,不含积分运算公式. 先把所有公式一并列出,以便查找: 1. 2. 3 ...

  7. 均值定理最大值最小值公式_如何理解中值定理?三大微分中值定理的几何意义及其证明介绍。...

    本文是为了下篇文章<三大微分中值定理的应用-经典例题>作基础准备 本文参考谢惠民<数学分析习题课讲义>和裴礼文<数学分析中的典型问题与方法>中的内容.已看过的同学可 ...

  8. 小证明题 编译原理--题目原型:

    编译原理-->题目原型:   1,证明:即时通讯 用下面文法生成的所有二进制串的值都能被3整除(提示:对语法分析树的节点使用数学归纳法).   num -> 11 | 1001 | num ...

  9. 区块链交易隐私如何保证?华为零知识证明技术实战解析

    摘要:本文通过介绍华为如何在同态加密及零知识证明框架的集成介绍来介绍了一些对金融领域交易隐私保护的思路,通过代码结和应用场景描述了zksnark如何集成到现有联盟链体系保护交易隐私. 本文分享自华为云 ...

  10. 群同态基本定理证明_自由群的定义及相关

    本篇文章谈谈抽象代数中的自由群这个概念,主要是为代数拓扑中的应用而服务的.相关参考主要来自丘维声老师的<抽象代数>[1]. 一.预备知识 1.1 生成元集的定义和相关命题 定义1 设 是群 ...

最新文章

  1. 基于Huffman算法和LZ77算法的文件压缩的改进方向
  2. python学习笔记(一)基本数据类型
  3. php统计网站 / html页面 浏览访问次数程序
  4. -source 1.6 中不支持 lambda 表达式 [ERROR] (请使用 -source 8 或更高版本以启用 lambda 表达式)
  5. 交友盲盒小程序/全开源版云开发交友盲盒小程序源码
  6. MATLAB车道识别与交通标志识别
  7. 从零开始写触摸屏驱动(Linux4.3.2 JZ2440V3 480*272)
  8. lisp角度转换弪度_角度与弧度之间的换算(rad与度的换算)
  9. B站三季度财报解读丨从0到2.67亿月活,B站生态亮眼的密钥何在?
  10. python新闻爬虫_基于Python的网络新闻爬虫与检索
  11. tt服务器系统,TT服务器使用手册.doc
  12. 边旅游边工作是一种什么样的感受
  13. 清理Win10系统C盘的脚本方法
  14. nginx配置https访问 生成ssl自签名证书,浏览器直接访问
  15. 【平头哥RVB2601开发板试用体验】I/O扩展
  16. 3dsmax游戏角色头部建模教程
  17. 20221217英语学习
  18. 站在2023的起点,目前自动驾驶技术发展到了什么水平?
  19. python实验猜数游戏
  20. 基于android校园订餐APP,简单实现登录注册功能(SharedPreferences)

热门文章

  1. 城堡争霸显示服务器忙,城堡争霸 - 阵营守护神显示应用未安装怎么办
  2. 21届校招中获得12家公司offer的一些经验(包括6家银行信息科技岗offer)
  3. android 软件 打开方式有哪些,apk是什么文件 apk文件打开方法详解
  4. 乌班图nginx访问php 变成下载
  5. python数据分析之pandas
  6. Windows 自带计算器的使用
  7. 怎么样通过API函数获取tooltip的内容(请高手帮忙)
  8. 额。。万恶之源就是c
  9. php html转ubb,PHP HTML转UBB函数
  10. C++:初始值设定项