2009-07-30 64 views
1

我正在改写这个问题,因为它太无趣或太不可理解。 :)调试Ruby/Python/Groovy

最初的问题出现了,因为我正在从Java转换到Groovy,但是当转换到任何更高级别的语言(Ruby,Python,Groovy)时,该示例可以同样适用。

Java很容易调试,因为代码行之间存在明确的关系,并且具有相当细致的行为,例如,使用for循环操作数组:

for (int i=0; i < array1.size(); i++) 
{ 
    if (meetsSomeCriterion(array1.elementAt(i)) 
    { 
     array2.add(array1.elementAt(i)); 
    } 
} 

因此您可以在循环中设置测试断点并查看接下来会发生什么。 (我知道有更好的方法来写这个,这只是为了说明这一点)。

在像Ruby这样的语言中,惯用风格似乎有利于更高级的单行编码,从http://rubyquiz.com/quiz113.html

quiz.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse 

我想知道如果你能提出任何有效的技术来调试这一点,例如,如果你改变了正则表达式...你会仍然使用传统的调试器,步入/在链接方法?或者,还有更好的方法?

谢谢!

回答

3

如果我要调试的例子,我会做的第一件事就是把它分解成多个步骤。我不在乎它是“pythonic”还是“ruby way”或“tclish”或其他,这样的代码很难调试。

这并不是说我不写这样的代码。一旦调试好了,有时候可以把它全部加入到一行中,但我发现自己更倾向于可读性和可维护性,而不是更倾向于编写简洁的代码。如果单线程的方法真的更具可读性,我会随它去做,但如果不是,我不会。

+0

谢谢Bryan,RHSeeger和Geo帮我清理这些。因为你们都同意我让Bryan's成为公认的答案,因为这首先出现(按时间顺序?)。 – 2009-09-15 10:38:58

0

如果我必须调试您发布的这样一行,我发现没有什么比把它分解为独立语句更有帮助。通过这种方式,您可以查看每个方法接收的参数以及返回的内容。

这样的语句使代码难以维护。

2

当您仍然可以查看相关线路,并知道它将按照您希望的方式进行操作时,将多个操作合并到一条线中就非常好。一旦你到了无法看代码的地步,就会发现“是的,好的,它确实有xyz,没有办法做不到”,那就是你应该考虑将它分解成单独的部分。

我给人们长特效/方法同样的建议。如果你无法看到代码,并确切知道它在所有情况下的作用,那就分解它。你可以将每一个“非显而易见”的代码分解成它自己的方法,并单独编写测试。然后,您可以在原始方法中使用该方法,并知道它将起作用......现在,您的原始方法现在更易于理解。沿着相同的路线,您可以将您的“扫描(/(?:\ d *。)?\ d {1,3} - ?/)”代码分解为另一种方法并自行测试。然后原始代码可以使用该方法,并且应该更容易理解并知道它正在工作。