如何在C++中处理大型项目

How to deal with large projects in C++?

本文关键字:处理 大型项目 C++      更新时间:2023-10-16

现在我已经了解了C++的一些基础知识,我必须承认,我仍然发现很难处理其他人用C++编写的代码。这可能本质上是这样的,因为C++允许复杂的对象层次结构,如果只是在没有任何进一步注释或说明的情况下提供C++项目,那么这些层次结构,或者至少对我来说,是非常难以理解的。

因此,我的问题更多的是向你们中更有经验的C++程序员提出的问题:如何理解别人编写的大型C++项目

如果我试图理解一个大型项目(例如,10000行代码)是如何编写的,我很容易迷失方向,可能会迷失数周。类的函数是指向不同类的函数的指针,这些函数可以重载也可以不重载,也可以不被其他类继承,等等,而不结束。

有什么实用的技巧可以提高我阅读和理解大型C++项目的能力吗?有没有这样的技巧教程?请详细说明!:)

我已经进行了一段时间的专业编程,因此我已经多次收到之前其他人编写的代码库。理解从来都不是一件容易的事,尤其是当代码不一致时。

然而,首先要意识到的是,在新的代码库中学习方法与重新发现一个你很久没有接触过的代码库没有太大区别。因此,是否由他人的旧自我书写并不重要;由于您可能设法重新发现以前使用过的代码库,因此您也应该能够发现新的代码库。不要失去希望。

第二件需要认识到的是,理解是一个模糊的术语,肯定有不同的程度。很多时候,没有人要求你完全理解来龙去脉;更有可能的情况是,您将被要求了解代码库的部分,其中要么存在错误,要么应该开发一些新功能。因此,随着时间的推移,你会逐渐了解各个部分,你不可避免地会对你工作最多的部分有更深的了解,而其他部分可能相对抽象,甚至完全模糊。没关系,人类已经很久没有尝试学习任何东西了。

话虽如此,你可以尝试几个理解轴:

  • 您应该寻找架构:一件好事是跟踪库依赖关系(Makefile/Project应该在这里有所帮助),这将为您提供构建应用程序的粗略技术块。可执行文件通常是依赖树的叶子
  • 您应该查找数据流:应用程序的触发器是什么(直接调用或作为回调调用)?这些数据遵循的步骤是什么(粗略地说,只是一个草图)。不要犹豫,专注于特定的用例,并使用调试器来跟踪事情,一开始不要试图挖掘得太深;只是对事物有个感觉

还有其他轴可能有助于了解应用程序所针对的。对域的理解是有用的,因为它可以让您深入了解应该发生什么,还可以帮助您破译注释/函数名。

  • 用户文档:这是用来做什么的?如果你能安排一个演示,它通常是非常有帮助的,否则也许你可以尝试自己玩它(在测试环境中)
  • 测试:测试什么?什么是暴露给用户的
  • 持久数据:什么是序列化的?数据库中保存了什么?持久性数据在某个时刻被访问,因此如果您了解它的读/写时间,它会有所帮助

如果它是一个正在运行的产品(正在运行),并且您可以"调试"它,那么首先只看一个特定的功能。

从用户的角度(UI、行为、输入、输出…)了解它是如何工作的

一旦您从外部了解了该功能,只需查找该功能的代码(仅查找该功能);起点可能是菜单的处理程序,或者来自对话框或鼠标/指针事件。

从那里;手动跟踪一个动作或子特征的代码;跳过深层内部库(目前将其视为黑盒),了解其工作原理。

一旦您了解了代码的这一部分,就可以更深入地挖掘从上层代码调用的库API。

慢慢来。不要试图一下子理解所有的东西。绘制依赖关系的示意图(笔和纸)(保持高水平,一开始没有类依赖关系)。

祝你好运。

您提到的问题没有明确而简单的答案。尽管如此,这里还是有一些提示:

  1. 一开始试着随机记住所有的事情。目录的名称,类,模板的参数,等等尽可能多。这听起来毫无意义,但仍然有道理
  2. 在处理代码时,总是想着"我以前看过这个函数/param/etc吗?"如果答案是肯定的,那就多花点时间处理这段代码。如果没有,只需基本掌握并继续
  3. 随着时间的推移,你会发现越来越多的声音清晰易懂
  4. 由于项目的规模和复杂性差异很大,因此不可能给出任何确切的值。不要期望简单而直接的结果

其他要点:

  1. 您肯定需要一个源代码浏览器。花时间学习如何使用它。好的例子是http://sourceinsight.com/.这不是我的网站!!!我确实有自己的网站。我不会在这里提及它
  2. 如果你看到一个函数被调用了500次,那么与只调用一次的函数相比,关于这个函数的知识有用的可能性要高出500倍

最好的办法是掌握项目的体系结构。为了做到这一点,有必要记住这个项目可能根本没有架构。

学习代码时,你应该记住你的任务。典型的情况-你需要修改一些东西或修复一个错误。如果是这样的话,请寻找代码的正确部分,并将精力集中在它上