我基本上来自 C 语言编程世界,现在钻研 Ruby 和 Python 等脚本语言的世界。
我想知道如何进行调试。目前我遵循的步骤是,
- 我完成了一个大剧本,
- 评论除我要检查的部分之外的所有内容
- 执行脚本
虽然它有效,但我无法像在 VC++ 环境或类似环境中那样进行调试。
我的问题是,有没有更好的调试方法?
注意:我想这可能是一个重复的问题,如果是这样,请指出答案。
我基本上来自 C 语言编程世界,现在钻研 Ruby 和 Python 等脚本语言的世界。
我想知道如何进行调试。目前我遵循的步骤是,
虽然它有效,但我无法像在 VC++ 环境或类似环境中那样进行调试。
我的问题是,有没有更好的调试方法?
注意:我想这可能是一个重复的问题,如果是这样,请指出答案。
你的顺序在我看来完全倒退了。这是我的做法:
具体来说,我在完成之前执行。到那时已经太晚了。
当然也有调试器,但有了好的测试和好的设计,我几乎从不需要调试器。
这是使用 ruby-debug进行 ruby 调试的截屏视频。
这里有一个很好的 Python 调试器介绍
脚本语言与其他语言相比没有区别,因为您仍然必须将问题分解为可管理的部分——即函数。因此,与其在完成整个脚本后测试整个脚本,我更愿意在集成之前测试那些小功能。TDD 总是有帮助的。
我的问题是,有没有更好的调试方法?”
是的。
你的方法,“1.我完成了一个大脚本,2.评论除了我想要检查的部分之外的所有内容,3.执行脚本”并不是用任何语言编写任何软件的最佳方式(对不起,但这是事实.)
不要写大的东西。曾经。
做这个。
将您的问题分解为对象类。
对于每个类,将类写为
2a. 概述类,关注外部接口,而不是实现细节。
2b。编写测试以证明接口有效。
2c。运行测试。他们会失败,因为您只概述了课程。
2d。修复类,直到它通过测试。
2e。在某些时候,你会意识到你的类设计不是最优的。重构您的设计,确保您的测试仍然通过。
现在,编写您的最终脚本。它应该很短。所有的类都已经过测试。
3a。概述脚本。实际上,您通常可以编写脚本。
3b。编写一些测试用例来证明脚本有效。
3c。运行测试。他们可能会通过。你完成了。
3d。如果测试没有通过,请修复问题,直到它们通过。
写很多小事。从长远来看,写一个大的东西并评论它的一部分会更好。
您描述的调试方法非常适合像 C++ 这样的静态语言,但鉴于语言如此不同,编码方法也同样不同。在 Python 或 Ruby 等动态语言中,最重要的事情之一就是交互式顶层(你可以通过键入来获得,比如python
在命令行上)。这意味着运行程序的一部分非常容易。
即使您在测试之前编写了一个大型程序(这是一个坏主意),也希望它被分成许多功能。所以,打开你的交互式顶层,做一个import thing
(不管thing
发生什么),然后你就可以轻松地开始一个一个地测试你的函数,只需在顶层调用它们。
当然,对于一个比较成熟的项目,你可能想要写出一个实际的测试套件,而大多数语言都有方法可以做到这一点(在 Python 中,这是doctest
and nose
,不知道其他语言)。不过,起初,当你写一些不是特别正式的东西时,只要记住一些调试动态语言的简单规则:
print
陈述也是如此。如果您只运行一个函数,那么使用print
语句进行调试并不是那么不方便,而且还可以让您免于在 IDE 中拖拖拉拉。这里有一个关于 Ruby IDE 的问题-搜索“ruby IDE”可以提供更多信息。
我完成了一个大脚本
这就是引起我注意的地方:对我来说,“完成”意味着“完成”、“完成”、“发布”。无论您是否在编写通过测试的函数之前编写测试,或者您是否完全编写测试(我建议您这样做),您都不应该编写无法运行的代码(这本身就是一个测试) 直到它变大。Ruby 和 Python 提供了多种方法来编写小的、可单独测试(或可执行)的代码片段,这样您就不必等待(?)天才能运行它。
我现在正在构建一个(Ruby)数据库翻译/转换脚本——它最多有 1000 行,但还没有完成。我很少运行超过 5 分钟而不运行它,或者至少运行我正在处理的部分。当它坏了(我并不完美,它坏了很多;-p)我知道问题出在哪里 - 在我在最后 5 分钟编写的代码中。进展相当快。
我并不是说 IDE/调试器没有位置:在发布大量代码之前,一些问题不会浮出水面:有时将整个东西放到调试环境中以找出发生了什么真的很有用上。当涉及第三方库和框架时,调试他们的代码以定位问题(通常 - 但不总是 - 与对库函数的错误理解有关)非常有用。
这里有很多很好的建议,我建议您通过一些最佳实践:
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
您可以使用包含的 pdb 模块调试您的 Python 脚本。如果你想要一个可视化调试器,你可以下载winpdb——不要被那个“win”前缀吓到,winpdb 是跨平台的。