调试像ruby这样的脚本语言
我基本上来自C语言编程世界,现在深入研究Ruby和Python等脚本语言世界。
我想知道如何进行调试。 目前我遵循的步骤是,
- 我完成了一个大脚本,
- 评论除我要检查的部分之外的所有内容
- 执行脚本
虽然它有效,但我无法像在VC ++环境中那样进行调试。
我的问题是,有没有更好的调试方法?
注意:我想这可能是一个重复的问题,如果有的话,请指出我的答案。
你的序列似乎完全倒退了。 我是这样做的:
- 我为我想要的function编写了一个测试。
- 我开始编写脚本,执行位并validation测试结果。
- 我回顾一下我为记录和发布所做的工作。
具体来说,我在完成之前执行。 到那时为时已晚。
当然还有调试器,但是通过良好的测试和良好的设计,我几乎从不需要一个。
这是使用ruby-debug进行ruby调试的截屏video 。
看起来这里的问题是您的环境(Visual Studio)不支持这些语言,而不是这些语言通常不支持调试器。
Perl,Python和Ruby都有function齐全的调试器; 您也可以找到其他可以帮助您的IDE。 对于Ruby,有RubyMine ; 对于Perl来说,有Komodo 。 而这只是我的头脑。
这里有一个很好的温和的Python调试器介绍
如果您正在使用Python,那么您可以在这里找到一个调试工具列表,我只想在其中添加带有Pydev扩展的 Eclipse ,这使得使用断点等也非常简单。
我的问题是,有没有更好的调试方法?“
是。
你的方法,“1。我完成一个大的脚本,2。评论除了我要检查的部分之外的所有内容,3。执行脚本”并不是用任何语言编写任何软件的最好方法(对不起,但那是真的。)
不要写任何大的东西。 永远。
做这个。
-
将您的问题分解为对象类。
-
对于每个类,请按类编写
2A。 概述类,重点关注外部接口,而不是实现细节。
2B。 编写测试以certificate界面有效。
2C。 运行测试。 他们会失败,因为你只是概述了课程。
2D。 修复类直到它通过测试。
2E。 在某些方面,你会发现你的class级设计不是最优的。 重构您的设计,确保您的测试仍然通过。
-
现在,写下你的最终脚本。 它应该很短。 所有课程都已经过测试。
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中,这是doctest
和nose
,不了解其他语言)。 但是,首先,当你写一些不是特别正式的东西时,只需记住一些调试动态语言的简单规则:
- 从小处开始。 不要编写大型程序并测试它们。 在编写时测试每个函数,至少是光滑的。
- 使用顶层。 使用像Python这样的语言运行一小段代码非常轻量级:启动顶层并运行它。 比较编写一个完整的程序并在C ++中编译运行它。 使用您可以快速更改任何function的正确性的事实。
- 调试器很方便。 但通常情况下,
print
声明也是如此。 如果您只运行单个函数,则使用print
语句进行调试并不是那么不方便,并且还可以使您无需在IDE中拖动。