了解大型代码

时间:2013-03-28 13:41:00

标签: c++

理解大型代码的问题以前已得到很好的解答。但是我觉得我应该再问这个问题来问我一直面临的问题。

我刚开始做学生工作。我是一名初学程序员,两个月前刚刚学习了课程。虽然在工作中,我已经交了一个代码,它是大软件的一部分。我理解该代码应该做什么(读取文件)。但是在花了几周时间试图理解代码并对其进行修改以达到我们想要的结果之后,我得出结论,我需要理解该代码的每一行。代码大约是1300行。

现在,当我开始阅读代码时,我发现,例如,变量定义为:

VarType VarName

现在VarType不是类似intfloat的类型。它是一个用户定义的类型,所以我必须去上课看看这个类型是什么。

在下一行中,我看到一个被调用的函数,如points.interpolate(x); 现在我必须进入另一个类,看看插值函数的作用。

这种情况发生了很多,这意味着即使我尝试理解代码的一小部分,我也必须去3或4个不同的类,同时记住它们而不会失去主要目标,这很难

我可能不是一个熟练的程序员,但我希望能够做到这一点。我可以提出一些建议吗?

另外(当我问这个时,我的声音真的很愚蠢)什么是调试器?我希望这可以让你了解我的立场(以及再次提出这个问题的必要性)。 :(

6 个答案:

答案 0 :(得分:6)

运气好的话,这些功能和类应该至少有一些文档来描述它们的作用。 您无需了解 他们如何理解他们所做的当您看到使用interpolate时,请不要不要开始考虑它是如何工作的,否则你最终会深入搜索代码库。相反,请阅读其文档,这应该告诉您需要了解的一切,以了解使用它的代码。

如果没有文件,我觉得你。我可以建议两个提示:

  1. 做一般假设关于函数或类将从其名称,返回类型和参数以及使用它的周围代码做什么,直到发生与这些假设相矛盾的事情。我可以很好地猜测interpolate在没有阅读其工作原理的情况下做了什么。这仅在函数或类的名称足够自我记录时才有效。

  2. 如果您需要深入了解某些代码的工作方式,从底部开始并向上工作。这样做意味着当您搜索代码库时,您最终不必记住您在某些高级代码中的位置。在尝试理解这些类型的高级应用程序之前,请先了解低级基础类。

    这也意味着您将在一般意义上理解函数和类,而不是在导致它们的代码的上下文中。当您找到points.interpolate(x)时,不要想知道interpolate使用此特定points参数对这些特定x做了什么,而不是想知道它的作用。稍后,您将能够将新发现的知识应用于使用相同功能的任何代码。

  3. 尽管如此,我不会担心1300行代码。这基本上是一个小项目。它只是比例子和大学作业更大。如果您考虑这些提示,那么应该可以轻松管理这些代码。


    debugger是一个帮助您调试代码的程序。调试器的常见功能允许您逐行浏览代码并观察变量值的变化。您还可以在代码中设置感兴趣的断点,调试器会在发现它们时通知您。有些调试器甚至允许您在执行时更改代码。有许多不同的调试器都具有不同的功能集。

答案 1 :(得分:5)

尝试根据代码标题对代码执行的操作进行假设。例如,假设interpolate函数正确地插入您的点;如果输出看起来很可疑,那就去挖掘那段代码。

答案 2 :(得分:1)

首先,考虑获得具有以下功能的编辑器/ IDE

  • parens / bracket / braces matching
  • 在花括号之间折叠/解除代码块
  • 类型突出显示(在工具提示中)
  • 宏扩展(在工具提示或单独的窗口/面板中)
  • 功能原型扩展(在工具提示或单独的窗口/面板中)
  • 快速导航到类型,功能和类并返回
  • 在不同位置的多个窗口/面板中打开相同的文件
  • 搜索特定类型,变量,函数或类的所有提及/使用以及将其作为列表呈现
  • 调用树/图形构建/导航
  • 正则表达式搜索除了简单搜索
  • 书签?

Source Insight就是其中一种工具。必须有其他人。

其次,在您通过时考虑注释代码。执行此操作时,请注意(记下)以下内容:

  • 不变量(什么是真的或必须始终为真)
  • 假设(可能不是真的,例如缺少检查/验证或无根据的期望),请考虑“如果”,
  • 一段代码的目标(
  • 特殊性/实施细节(如何;例如是否抛出异常以及返回哪些错误代码以及何时返回)
  • 一个简化的调用树/图表,用于查看代码流
  • 数据流
  • 执行相同操作

绘制图表(以ASCII或纸/纸板);我有时拍摄我的论文或董事会。具体来说,绘制方框图状态机

使用不同抽象/细节级别的代码。放大以查看详细信息,缩小以查看结构。折叠/取消折叠调用树/图的代码和分支块。

此外,还有核对清单,了解您要做什么。检查您已完成的项目。根据需要添加更多。如果合适,为工作项分配优先级。


调试器是一个程序,可让您逐步执行程序并检查其状态(变量)。它还允许您修改状态,有时也可能有用。

如果您对代码不熟悉或使用编程语言,则可以使用调试器来理解代码。

可能派上用场的另一件事是编写测试或为您的程序输入数据测试集。它们可能揭示逻辑和性能方面的问题和限制。


另外,不要忽视文档!如果某事或某人能够为您提供有关项目/代码的更多信息,请使用该内容或某人。询问建议


我知道这听起来很多,但无论如何你最终会在某些方面做到这一点。等待一个足够大的项目。 :)

答案 3 :(得分:0)

您可能基本上需要了解最初调用的函数的功能是什么,然后了解该函数的输入和输出是什么,例如,如果您确实需要了解interpolate是如何完成的,然后你可以去了解细节。通常,函数的名称是可自我解释的,如果代码写得很好,您可以从函数名称中了解函数的作用。

您可能想要尝试的另一件事是运行一些玩具示例来完成代码,您可以使用一些可以帮助您浏览代码的调试器或IDE。理解大规模代码需要时间和经验,只需要耐心。

答案 4 :(得分:0)

“尝试调试器方法”

[更新:调试器是一个特殊的程序,它允许你暂停正在运行的程序来检查程序的状态(变量值/哪个函数正在运行/谁是父函数等),]

我这样做的方法是逐步调试代码,用于我想要理解的用例。

如果您使用的是Advanced / Mordern IDE,那么在入口点(如main()或感兴趣点)设置断点相当容易。从那里进入你要检查或超越功能的功能。

为您提供一步一步的方法

  1. 在main()方法(入口点)中设置起点表达式的断点。
  2. 使用调试活动
  3. 运行程序
  4. 程序将在断点处中断。
  5. 现在,如果你走过一个看起来很有趣的函数/表达式。 (比如,你的points.interpolate(x);)函数
  6. 进入函数,并在live中检查程序状态,如变量和函数堆栈。
  7. 避免使用复杂的系统库。只是跨过/走出去。 (示例:避免使用MathLib.boringComputaion()
  8. 之类的内容
  9. 重复直到程序退出。
  10. 我发现这种学习方式非常迅速,可让您快速了解任何复杂/大型软件。

    使用Eclipse,或者如果你不能尝试GDB(如果它的C / C ++)。每种流行的编程语言都有一个不错的调试器。

    了解基本的调试操作,比如将是一个好处:

    1. 设置断点。
    2. 在断点处停止。
    3. 检查/观察变量。
    4. 检查函数堆栈(函数调用的层次结构)
    5. 单步 - 踏入代码中的下一行。
    6. Step-Into a function。
    7. 逐步退出功能。
    8. 转发功能。
    9. 跳转到下一个断点(兴趣点)。
    10. 希望,这有帮助!

答案 5 :(得分:0)

已经给出了许多好的答案。我想加入我作为前学生的理解(不久前)以及我学到的知识来帮助我理解代码。这特别有助于我,因为我开始了一个项目,将我多年前用Java编写的数据库转换为c ++。

1. **Code Reading** - Do not underestimate this important task.  The ability to write code  
   does not always translate into the ability to read it -- and reading it can be more 
   frustrating than writing it.

花点时间仔细发现每行代码的作用。这肯定会帮助您避免做出假设,除非您遇到熟悉的代码并且可以掩饰它。

2. Don't hesitate to follow references, locate declarations, and uncover definitions of 
   code elements you are reading. What you learn about how a particular variable, 
   method call, or class are defined all contribute to learning and ultimately to you 
   being able to perform your task. 

这一点尤其重要,因为侦探和有效的侦探工作是理解代码的一小部分的必要部分,以便您将来能够以较少的难度掌握较大的部分。

其他人已经发布了有关调试器的信息,你会发现它是追踪代码错误的宝贵资产,我认为,它有助于代码阅读,知识获取和理解,因此您可以成为一名成功的程序员。

这是使用Visual Studio的调试器教程的link,可能会让您对至少手头的过程有深刻的理解。