私は基本的にC言語プログラミングの世界から来ており、現在はRubyやPythonなどのスクリプト言語の世界を掘り下げています。
デバッグの仕方が気になります。現在、私が従う手順は次のとおりです。
- 大きなスクリプトを完成させます。
- チェックしたい部分以外はコメント
- スクリプトを実行する
それは機能しますが、たとえばVC++環境などで行うようにデバッグすることはできません。
私の質問は、デバッグのより良い方法はありますか?
注:繰り返しの質問かもしれませんが、そうであれば、答えを教えてください。
私は基本的にC言語プログラミングの世界から来ており、現在はRubyやPythonなどのスクリプト言語の世界を掘り下げています。
デバッグの仕方が気になります。現在、私が従う手順は次のとおりです。
それは機能しますが、たとえばVC++環境などで行うようにデバッグすることはできません。
私の質問は、デバッグのより良い方法はありますか?
注:繰り返しの質問かもしれませんが、そうであれば、答えを教えてください。
あなたのシーケンスは私には完全に逆に見えます。これが私がそれをする方法です:
具体的には、完了する前に実行します。それまでには遅すぎます。
もちろんデバッガーはありますが、優れたテストと優れた設計により、ほとんど必要ありませんでした。
これは、ruby-debugを使用したrubyデバッグのスクリーンキャストです。
ここにPythonデバッガーの穏やかな紹介があります
Pythonを使用している場合は、ここにデバッグツールのリストがあります。これにPydev拡張機能を使用してEclipseを追加すると、ブレークポイントなどの操作も非常に簡単になります。
スクリプト言語は、問題を管理可能な部分、つまり関数に分割する必要があるという意味で、他の言語と違いはありません。したがって、スクリプト全体を終了した後にスクリプト全体をテストするのではなく、それらを統合する前にこれらの小さな関数をテストすることを好みます。TDDは常に役立ちます。
私の質問は、デバッグのより良い方法はありますか?」
はい。
あなたのアプローチ、「1。大きなスクリプトを完成させる、2。チェックしたい部分以外のすべてにコメントする、3。スクリプトを実行する」は、どの言語でもソフトウェアを書くための最良の方法ではありません(申し訳ありませんが、それは真実です) 。)
大きなものは書かないでください。これまで。
これを行う。
問題をオブジェクトのクラスに分解します。
クラスごとに、次のようにクラスを記述します。
2a。クラスの概要を説明し、実装の詳細ではなく、外部インターフェイスに注目します。
2b。インターフェイスが機能することを証明するテストを作成します。
2c。テストを実行します。クラスの概要を説明しただけなので、失敗します。
2d。テストに合格するまでクラスを修正します。
2e。ある時点で、クラスの設計が最適ではないことに気付くでしょう。テストに合格することを保証しながら、設計をリファクタリングします。
次に、最終的なスクリプトを作成します。短くする必要があります。すべてのクラスはすでにテストされています。
3a。スクリプトの概要を説明します。実際、通常はスクリプトを作成できます。
3b。スクリプトが機能することを証明するテストケースをいくつか作成します。
3c。テストを実行します。彼らは合格するかもしれません。完了です。
3d。テストに合格しない場合は、合格するまで修正します。
多くの小さなことを書いてください。長い目で見れば、大きなものを書き、その一部をコメントアウトする方がはるかにうまくいきます。
ここにRubyIDEに関するSOの質問があります。「rubyIDE」を検索すると、さらに多くのことが提供されます。
大きなスクリプトを完成させます
それが私の目を引いたものです。私にとって「完了」とは、「完了」、「終了」、「解放」を意味します。テストに合格する関数を作成する前にテストを作成するかどうか、またはテストを作成するかどうか(およびテストを作成することをお勧めします)にかかわらず、実行できないコード(それ自体がテスト)を作成するべきではありません。 )大きくなるまで。RubyとPythonには、個別にテスト可能な(または実行可能な)小さなコードを記述するためのさまざまな方法が用意されているため、実行する前に(?)日待つ必要はありません。
現在、(Ruby)データベースの変換/変換スクリプトを作成しています。最大で約1000行ですが、まだ完了していません。私はそれを実行せずに、または少なくとも私が作業している部分を実行せずに5分以上行くことはめったにありません。それが壊れたとき(私は完璧ではありません、それはたくさん壊れます; -p)私は問題がどこにあるべきかを知っています-私が最後の5分間に書いたコードで。進歩はかなり速いです。
IDE /デバッガーに場所がないと断言しているわけではありません。大量のコードがリリースされるまで問題が表面化しない場合があります。場合によっては、すべてをデバッグ環境にドロップして、何が起こっているのかを調べることができます。の上。サードパーティのライブラリとフレームワークが関係している場合、それらのコードをデバッグして問題を見つけることが非常に役立つ場合があります(これは通常、ライブラリ機能の誤った理解に関連していますが、常にではありません)。
付属のpdbモジュールを使用してPythonスクリプトをデバッグできます。ビジュアルデバッガーが必要な場合は、winpdbをダウンロードできます。その「win」プレフィックスに惑わされないでください。winpdbはクロスプラットフォームです。
あなたが説明したデバッグ方法はC++のような静的言語に最適ですが、言語が非常に異なることを考えると、コーディング方法も同様に異なります。PythonやRubyなどの動的言語で非常に重要なことの1つは、インタラクティブなトップレベル(pythonコマンドラインなどで入力することで得られるもの)です。これは、プログラムの一部を実行するのが非常に簡単であることを意味します。
テストの前に大きなプログラムを作成したとしても(これは悪い考えです)、うまくいけば、それは多くの機能に分離されます。したがって、インタラクティブなトップレベルを開き、import thing(何thingが起こっても)実行すると、トップレベルで関数を呼び出すだけで、関数を1つずつ簡単にテストを開始できます。
もちろん、より成熟したプロジェクトの場合は、実際のテストスイートを書き出す必要があります。ほとんどの言語には、それを行うためのメソッドがあります(Pythonでは、これはdoctest他noseの言語についてはわかりません)。ただし、最初は、特に正式ではないものを作成する場合は、動的言語のデバッグに関するいくつかの簡単なルールを覚えておいてください。
printステートメントもそうです。単一の関数のみを実行している場合、printステートメントを使用したデバッグはそれほど不便ではなく、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シェルでロジックを作成し、それらを適切なテスト(100%のカバレッジではなく、エッジとコーナーのケースに焦点を当てる)を使用して、小さな単一タスクに焦点を当てたメソッドのカスケードにキャプチャします。
http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html