调试像ruby这样的脚本语言

我基本上来自C语言编程世界,现在深入研究Ruby和Python等脚本语言世界。

我想知道如何进行调试。 目前我遵循的步骤是,

  • 我完成了一个大脚本,
  • 评论除我要检查的部分之外的所有内容
  • 执行脚本

虽然它有效,但我无法像在VC ++环境中那样进行调试。

我的问题是,有没有更好的调试方法?

注意:我想这可能是一个重复的问题,如果有的话,请指出我的答案。

你的序列似乎完全倒退了。 我是这样做的:

  1. 我为我想要的function编写了一个测试。
  2. 我开始编写脚本,执行位并validation测试结果。
  3. 我回顾一下我为记录和发布所做的工作。

具体来说,我完成之前执行。 到那时为时已晚。

当然还有调试器,但是通过良好的测试和良好的设计,我几乎从不需要一个。

这是使用ruby-debug进行ruby调试的截屏video 。

看起来这里的问题是您的环境(Visual Studio)不支持这些语言,而不是这些语言通常不支持调试器。

Perl,Python和Ruby都有function齐全的调试器; 您也可以找到其他可以帮助您的IDE。 对于Ruby,有RubyMine ; 对于Perl来说,有Komodo 。 而这只是我的头脑。

这里有一个很好的温和的Python调试器介绍

如果您正在使用Python,那么您可以在这里找到一个调试工具列表,我只想在其中添加带有Pydev扩展的 Eclipse ,这使得使用断点等也非常简单。

我的问题是,有没有更好的调试方法?“

是。

你的方法,“1。我完成一个大的脚本,2。评论除了我要检查的部分之外的所有内容,3。执行脚本”并不是用任何语言编写任何软件的最好方法(对不起,但那是真的。)

不要写任何大的东西。 永远。

做这个。

  1. 将您的问题分解为对象类。

  2. 对于每个类,请按类编写

    2A。 概述类,重点关注外部接口,而不是实现细节。

    2B。 编写测试以certificate界面有效。

    2C。 运行测试。 他们会失败,因为你只是概述了课程。

    2D。 修复类直到它通过测试。

    2E。 在某些方面,你会发现你的class级设计不是最优的。 重构您的设计,确保您的测试仍然通过。

  3. 现在,写下你的最终脚本。 它应该很短。 所有课程都已经过测试。

    3A。 概述脚本。 实际上,您通常可以编写脚本。

    3B。 编写一些certificate脚本有效的测试用例。

    3C。 试过测试。 他们可能会过去。 你完成了。

    3D。 如果测试没有通过,请修复它们。

写很多小东西。 从长远来看,它可以更好地编写大量内容并对其中的部分内容进行评论。

与其他语言相比,脚本语言没有区别,因为您仍然需要将问题分解为可管理的部分 – 即函数。 因此,在完成整个脚本之后,我更愿意在集成之前测试这些小函数,而不是测试整个脚本。 TDD总是有帮助的。

这里有很多好建议,我建议你做一些最佳实践:

http://github.com/edgecase/ruby_koans

http://blog.rubybestpractices.com/

http://on-ruby.blogspot.com/2009/01/ruby-best-practices-mini-interview-2.html

(并阅读格雷格布朗的书,它很棒)


你谈论大脚本。 我的很多工作流程都是在irb或python shell中编写逻辑,然后将它们捕获到一系列小型,单任务聚焦的方法中,并进行适当的测试(不是100%覆盖,更侧重于边缘和角落情况)。

http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html

这里有一个关于Ruby IDE的问题 – 搜索“ruby IDE”提供了更多。

我完成了一个大脚本

这就是引起我注意的东西:“完整”,对我而言,意味着“完成”,“完成”,“释放”。 无论你是否在编写通过它们的函数之前编写测试,或者你是否编写测试(我建议你这样做),你都不应该编写无法运行的代码(这本身就是一个测试) )直到它变大。 Ruby和Python提供了多种编写小型,可单独测试(或可执行)代码片段的方法,因此您无需等待(?)天就能运行该东西。

我正在构建一个(Ruby)数据库转换/转换脚本 – 它大约有1000行,但仍然没有完成。 我没有跑步它很少超过5分钟,或者至少运行我正在工作的部分。 当它破裂时(我不完美,它会破坏很多;-p)我知道问题必须在哪里 – 在我最近5分钟写的代码中。 进展非常快。

我并不认为IDE /调试器没有位置:在发布大量代码之前,有些问题不会出现:有时候将整个事情放到调试环境中以找出结果是非常有用的上。 当涉及第三方库和框架时,调试它们的代码来定位问题(通常 – 但不总是 – 与错误理解库函数有关)是非常有用的。

您可以使用附带的pdb模块调试Python脚本。 如果你想要一个可视化调试器,你可以下载winpdb – 不要被那个“win”前缀推迟,winpdb是跨平台的。

你所描述的调试方法非常适合像C ++这样的静态语言,但鉴于语言是如此不同,编码方法也同样不同。 动态语言(如Python或Ruby)中最重要的一点是交互式顶层(通过键入获得的内容,比如命令行中的python )。 这意味着运行程序的一部分非常容易。

即使你在测试之前编写了一个大程序(这是一个坏主意),但希望将它分成许多函数。 因此,打开你的交互式顶层,做一个import thing (无论发生什么thing )然后你可以轻松地开始逐个测试你的function,只需在顶层调用它们。

当然,对于一个更成熟的项目,你可能想要写出一个实际的测试套件,并且大多数语言都有一个方法来做到这一点(在Python中,这是doctestnose ,不了解其他语言)。 但是,首先,当你写一些不是特别正式的东西时,只需记住一些调试动态语言的简单规则:

  • 从小处开始。 不要编写大型程序并测试它们。 在编写时测试每个函数,至少是光滑的。
  • 使用顶层。 使用像Python这样的语言运行一小段代码非常轻量级:启动顶层并运行它。 比较编写一个完整的程序并在C ++中编译运行它。 使用您可以快速更改任何function的正确性的事实。
  • 调试器很方便。 但通常情况下, print声明也是如此。 如果您只运行单个函数,则使用print语句进行调试并不是那么不方便,并且还可以使您无需在IDE中拖动。