1

この質問は、あまりにも面白くなかったか、あまりにもわかりにくかったので、言い直します。:)

元の質問は、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 のような言語では、慣用的なスタイルは高レベルのワンライナー コーディングを好むようです

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

たとえば、正規表現を変更した場合など、これをデバッグするための効果的な手法を提案できるかどうか疑問に思っています...従来のデバッガーを引き続き使用し、チェーンされたメソッドにステップイン/オーバーしますか? それとももっと良い方法がありますか?

ありがとう!

4

3 に答える 3

3

あなたの例をデバッグする場合、最初に行うことは、複数のステップに分割することです。それが "pythonic" か "the ruby​​ way" か "tclish" かなどどうでもいいのですが、そのようなコードはデバッグが難しい場合があります。

私がそのようなコードを書かないと言っているわけではありません。デバッグが完了したら、すべてを 1 行に結合しても問題ない場合がありますが、簡潔なコードを書くことよりも、読みやすさと保守性に傾倒していることに気づきました。ワンライナー アプローチの方が本当に読みやすい場合はそれを採用しますが、そうでない場合は使用しません。

于 2009-09-14T16:48:35.487 に答える
2

複数のアクションを1つの行に結合することは、問題の行をまだ見て、それがあなたがしたいことを正確に実行することを知っているときに、すべてうまくいきます。コードを見ることができず、「ええ、わかりました。xyzを実行します。できなかった方法はありません」に到達した瞬間に、コードを個別に分割することを検討する必要があります。

私は長いprocs/methodsを持つ人々に同じアドバイスをします。コードを見て、すべての状況でコードが何をしているのかを正確に知ることができない場合は、コードを分割してください。コードの「非自明」ビットのそれぞれを独自のメソッドに分割し、その部分のテストを単独で作成できます。次に、そのメソッドを元のメソッドで使用して、それが機能することを確認できます...さらに、元のメソッドが理解しやすくなります。

同じ行に沿って、「scan(/(?:\ d *。)?\ d {1,3}-?/)」コードを別のメソッドに分割し、それを単独でテストできます。元のコードはそのメソッドを使用でき、それが機能していることを理解し、知ることがはるかに簡単になるはずです。

于 2009-09-14T16:52:51.973 に答える
0

あなたが投稿したような行をデバッグする必要がある場合、スタンドアロンのステートメントに分割することほど役立つものはないことがわかります。このようにして、各メソッドがパラメーターとして受け取るものと、それが返すものを確認できます。

このようなステートメントは、コードの保守を困難にします。

于 2009-09-14T16:51:33.613 に答える