このビデオでは デバッガーがどのように動作して
それをどのように使ってバグを見つけるのか
表現式を実行したり
オブジェクトと対話する方法をお見せします。
そこで、以前皆さんといっしょに完成させた カウンターの練習問題を
もう一度やってみたいと思います。
まず Monticello を使います。
package-cache を見ると
Counter パッケージが見つかります。
せっかくなので、Monticello の
機能を 1 つ紹介します。
これが正しいパッケージかどうか確認するために ブラウズすることができます。
このパッケージで定義されている クラスを見ることができます。
ここでは、MyCounter というパッケージには
2 つのクラスがあります。 Counter と CounterTest で
Counter の全ての操作を見てみると
4 つのメソッドがあります。 以前皆さんと定義したものです。
テストについても同様です。
さあ、それでは、このパッケージを
ロードしてみましょう。
では、Coutner クラスをブラウズします。
Counter クラスはテストがグリーンです。 つまり、作業を始めることができます。
お見せしたいのは
デバッガを使って表現式の実行を
ステップごとに進めていく方法です。
そして、その詳細を見たり飛ばしたりする方法です。
まずは例として、testDecrement を使います。
Debug test します。
Debug test はここにあります。 復習ですが
デバッガーは何を表示するのでしょうか？
デバッガーは実行スタックを表示します。
Pharo では全てはメッセージです。
スタックの深いところを見ていくと まず最初に
run メソッドや undo やそんな類のものを 実行していることがわかります。
とりあえず今のところは、それはシステムの仕事なので 特に気にする必要はありません。
ここでは、スタック上で実行されているコードや
システムの状態を見ることができます。
ここを見てください。ローカル変数 c があります。
今はまだ値が代入されていないので、nilです。
そして self が CounterTest だとわかります。
つまりメソッドは
method CounterTest>>#testDecrement です。
over をクリックすると
最初に実行する表現式に辿り着きます。
ここで注目することは
この表現式はすぐに実行可能だということです。
表現式は完成されています。
Counter クラスが定義されていて
それに new メッセージを送ることができます。
c は、まあこんなものです。
なので、ここで Over します。
Over というのは
表現式を、その内部にまで行かずに、実行することです。
現在、2つ目の表現式のところにきています。
代入式です。もう一度 Over をクリックすると
突然、変数 c がカウンターを指します。
ここで見られる通りです。 今の所、カウンターの値は nil です。
もし count: がどう実装されているかを 知りたければ
Over ではなく
Into を使います。
Into はメソッドの内部に 入っていくということです。
このように。 ここで、メソッドの定義がわかります。
さらに、引数と対話することができます。
anInteger がここにありますが print すると
7 と表示されます。
anInteger はいいとして countのほうは
インスタンス変数ですが 今のところ nil です。
それもここに表示されます。
続けていきます。 Over をクリックして
その表現式を飛び越えていって
表現式の実行を継続します。
そしてこうなります。
ここで decrement の内部に行きたいとすると
同じようにしていきます。 Into をクリックして
decrement に入ります。 decrement のコードが得られます。
これで原則がわかったでしょう。 こうやって
表現式をステップ実行します。
Proceed は
ここから、何事もなかったかのように
そのまま実行を継続していきます。 実際、Proceed すると
テストがグリーンになります。 そしてこのコード片を
独立して実行することもできます。
つまり
こんな風にしてPlayground に貼り付けて
Debug it すると 同じことができます。
この場合には ちょっと違うようにコンパイルされますが
全く同じ機能が実行されて
カウンターの値は 7 になります。
counter をクリックすると ここで 7 だとわかります。
そして例えば Into すると
decrement の中に入って行きます。 Over、Over
と、Over もさきほどと同じです。
ここではカスケードされて
カウンター c を返します。