如何用C ++处理大型项目?

时间:2013-12-30 17:15:02

标签: c++ visual-studio file-io coding-style

现在我已经了解了C ++的一些基础知识,但我必须承认,我仍然觉得很难处理其他人用C ++编写的代码。这本质上可能是这样,因为C ++允许复杂的对象层次结构,如果只提供C ++项目而没有任何进一步的评论或指令,那么对于我来说,或者至少对我来说很难掌握。

所以我的问题对于你们中经验丰富的C ++程序员来说更是一个问题:如何理解其他人编写的大型C ++项目?

如果我试图了解如何编写10,000行代码的大型项目,那么我很容易迷失方向并且可能会丢失数周。类的函数是指向不同类的函数的指针,这些函数可能会或可能不会被重载,并且可能会或可能不会被其他类继承,等等,而不会结束。

是否有任何实用技巧可以加快我阅读和理解大型C ++项目的能力?是否有这样的提示教程?请详细说明! :)

3 个答案:

答案 0 :(得分:7)

我一直在专业编程已经有一段时间了,因此我在我面前反复传递其他人编写的代码库。理解绝非易事,特别是当代码不一致时。

首先要意识到的是,在新的代码库中学习你的方法与重新发现一段时间没有触及的代码库并没有太大的不同。因此,无论是由他人的旧自己写的都无关紧要;既然你可能已经设法应对重新发现之前曾经使用过的代码库,那么你也应该能够发现新的代码库。不要失去希望。

要意识到的第二件事是理解是一个模糊的术语,并且肯定有不同程度。很多时候,没有人要求你完全理解这些来龙去脉;更有可能你会被要求理解代码库的一部分,其中有一个bug或者应该开发一些新的功能。因此,随着时间的推移,您将逐渐了解各个部分,并且您将不可避免地对您最常工作的部分有更深入的了解,而其他部分可能相对抽象甚至完全模糊。没关系,自从人类停止尝试学习所有要学习的东西以来,已经有很长一段时间了。

话虽如此,您可以尝试多种理解轴:

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

还有其他轴可能有助于对应用程序编写的有所了解。对域的理解很有用,因为它为您提供了关于应该发生什么的关键洞察力,它还可以帮助您解读注释/函数名称。

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

答案 1 :(得分:0)

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

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

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

从那里;手动跟踪一个动作或子功能的代码;跳过深层内部库(暂时将它们视为黑盒子)并了解它是如何工作的。

一旦你知道了这段代码,就可以深入挖掘从上层代码调用的库API。

慢慢来。 不要试图一次理解一切。 绘制依赖关系的原理图(笔和纸)(保持高级别,开头没有类依赖关系)。

祝你好运。

答案 2 :(得分:0)

你提到的问题没有明确而简单的答案。不过这里有一些提示:

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

    1. 您肯定需要一个源代码浏览器。花时间学习如何使用它。好的例子是http://sourceinsight.com/。这不是我的网站!我有我自己的网站。我不会在这里提到它。
    2. 如果你看到一个被调用500次的函数,那么与一个只调用一次的函数相比,这个函数的知识可能会有500倍的可能性。
    3. 最好是掌握项目的架构。试图这样做有必要记住项目可能根本没有架构。

      学习代码你应该记住你的任务。典型情况 - 您需要修改某些内容或修复错误。如果是这样,请查找代码的正确部分,并将精力集中在它上面。