2009-07-30 60 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} - ?/)」代碼分解爲另一種方法並自行測試。然後原始代碼可以使用該方法,並且應該更容易理解並知道它正在工作。