1 00:00:02,560 --> 00:00:04,600 このビデオでは デバッガーがどのように動作して 2 00:00:04,767 --> 00:00:07,080 それをどのように使ってバグを見つけるのか 3 00:00:07,247 --> 00:00:10,780 表現式を実行したり 4 00:00:10,947 --> 00:00:12,710 オブジェクトと対話する方法をお見せします。 5 00:00:14,080 --> 00:00:16,030 そこで、以前皆さんといっしょに完成させた カウンターの練習問題を 6 00:00:16,197 --> 00:00:18,820 もう一度やってみたいと思います。 7 00:00:19,000 --> 00:00:21,220 まず Monticello を使います。 8 00:00:21,387 --> 00:00:25,240 package-cache を見ると 9 00:00:25,407 --> 00:00:26,320 Counter パッケージが見つかります。 10 00:00:27,050 --> 00:00:29,010 せっかくなので、Monticello の 11 00:00:29,177 --> 00:00:31,560 機能を 1 つ紹介します。 12 00:00:31,727 --> 00:00:35,300 これが正しいパッケージかどうか確認するために ブラウズすることができます。 13 00:00:35,560 --> 00:00:37,650 このパッケージで定義されている クラスを見ることができます。 14 00:00:38,240 --> 00:00:39,830 ここでは、MyCounter というパッケージには 15 00:00:40,000 --> 00:00:42,500 2 つのクラスがあります。 Counter と CounterTest で 16 00:00:42,667 --> 00:00:44,830 Counter の全ての操作を見てみると 17 00:00:45,000 --> 00:00:48,130 4 つのメソッドがあります。 以前皆さんと定義したものです。 18 00:00:48,297 --> 00:00:51,240 テストについても同様です。 19 00:00:51,407 --> 00:00:53,180 さあ、それでは、このパッケージを 20 00:00:53,347 --> 00:00:54,490 ロードしてみましょう。 21 00:00:58,300 --> 00:01:02,160 では、Coutner クラスをブラウズします。 22 00:01:08,200 --> 00:01:11,710 Counter クラスはテストがグリーンです。 つまり、作業を始めることができます。 23 00:01:15,000 --> 00:01:16,680 お見せしたいのは 24 00:01:16,847 --> 00:01:19,470 デバッガを使って表現式の実行を 25 00:01:19,637 --> 00:01:22,260 ステップごとに進めていく方法です。 26 00:01:22,427 --> 00:01:23,720 そして、その詳細を見たり飛ばしたりする方法です。 27 00:01:24,530 --> 00:01:26,800 まずは例として、testDecrement を使います。 28 00:01:27,000 --> 00:01:30,300 Debug test します。 29 00:01:30,467 --> 00:01:35,420 Debug test はここにあります。 復習ですが 30 00:01:35,587 --> 00:01:36,700 デバッガーは何を表示するのでしょうか? 31 00:01:36,867 --> 00:01:38,880 デバッガーは実行スタックを表示します。 32 00:01:39,047 --> 00:01:41,830 Pharo では全てはメッセージです。 33 00:01:42,000 --> 00:01:46,860 スタックの深いところを見ていくと まず最初に 34 00:01:47,027 --> 00:01:50,160 run メソッドや undo やそんな類のものを 実行していることがわかります。 35 00:01:50,327 --> 00:01:53,240 とりあえず今のところは、それはシステムの仕事なので 特に気にする必要はありません。 36 00:01:54,530 --> 00:01:59,300 ここでは、スタック上で実行されているコードや 37 00:01:59,730 --> 00:02:00,930 システムの状態を見ることができます。 38 00:02:01,097 --> 00:02:03,060 ここを見てください。ローカル変数 c があります。 39 00:02:03,227 --> 00:02:05,480 今はまだ値が代入されていないので、nilです。 40 00:02:06,150 --> 00:02:08,800 そして self が CounterTest だとわかります。 41 00:02:09,380 --> 00:02:13,770 つまりメソッドは 42 00:02:14,880 --> 00:02:15,580 method CounterTest>>#testDecrement です。 43 00:02:16,690 --> 00:02:21,420 over をクリックすると 44 00:02:21,587 --> 00:02:24,370 最初に実行する表現式に辿り着きます。 45 00:02:24,537 --> 00:02:26,540 ここで注目することは 46 00:02:26,707 --> 00:02:28,720 この表現式はすぐに実行可能だということです。 47 00:02:28,887 --> 00:02:32,340 表現式は完成されています。 48 00:02:32,507 --> 00:02:34,190 Counter クラスが定義されていて 49 00:02:34,357 --> 00:02:35,380 それに new メッセージを送ることができます。 50 00:02:36,120 --> 00:02:38,790 c は、まあこんなものです。 51 00:02:38,957 --> 00:02:40,650 なので、ここで Over します。 52 00:02:40,817 --> 00:02:41,910 Over というのは 53 00:02:42,077 --> 00:02:45,840 表現式を、その内部にまで行かずに、実行することです。 54 00:02:47,430 --> 00:02:52,150 現在、2つ目の表現式のところにきています。 55 00:02:52,317 --> 00:02:55,400 代入式です。もう一度 Over をクリックすると 56 00:02:55,567 --> 00:02:59,940 突然、変数 c がカウンターを指します。 57 00:03:00,340 --> 00:03:04,300 ここで見られる通りです。 今の所、カウンターの値は nil です。 58 00:03:04,467 --> 00:03:07,960 もし count: がどう実装されているかを 知りたければ 59 00:03:08,127 --> 00:03:11,600 Over ではなく 60 00:03:11,767 --> 00:03:12,520 Into を使います。 61 00:03:12,687 --> 00:03:16,140 Into はメソッドの内部に 入っていくということです。 62 00:03:17,510 --> 00:03:20,050 このように。 ここで、メソッドの定義がわかります。 63 00:03:20,217 --> 00:03:22,160 さらに、引数と対話することができます。 64 00:03:22,580 --> 00:03:26,350 anInteger がここにありますが print すると 65 00:03:26,517 --> 00:03:28,230 7 と表示されます。 66 00:03:28,397 --> 00:03:32,930 anInteger はいいとして countのほうは 67 00:03:33,097 --> 00:03:35,460 インスタンス変数ですが 今のところ nil です。 68 00:03:35,627 --> 00:03:37,210 それもここに表示されます。 69 00:03:38,750 --> 00:03:41,530 続けていきます。 Over をクリックして 70 00:03:41,697 --> 00:03:44,450 その表現式を飛び越えていって 71 00:03:44,617 --> 00:03:46,360 表現式の実行を継続します。 72 00:03:49,740 --> 00:03:50,373 そしてこうなります。 73 00:03:51,860 --> 00:03:53,370 ここで decrement の内部に行きたいとすると 74 00:03:53,537 --> 00:03:55,690 同じようにしていきます。 Into をクリックして 75 00:03:56,190 --> 00:04:00,670 decrement に入ります。 decrement のコードが得られます。 76 00:04:01,310 --> 00:04:04,890 これで原則がわかったでしょう。 こうやって 77 00:04:05,057 --> 00:04:07,190 表現式をステップ実行します。 78 00:04:11,230 --> 00:04:13,280 Proceed は 79 00:04:13,447 --> 00:04:15,950 ここから、何事もなかったかのように 80 00:04:16,117 --> 00:04:18,310 そのまま実行を継続していきます。 実際、Proceed すると 81 00:04:18,750 --> 00:04:22,750 テストがグリーンになります。 そしてこのコード片を 82 00:04:22,917 --> 00:04:27,760 独立して実行することもできます。 83 00:04:27,927 --> 00:04:29,810 つまり 84 00:04:30,000 --> 00:04:32,850 こんな風にしてPlayground に貼り付けて 85 00:04:33,017 --> 00:04:37,920 Debug it すると 同じことができます。 86 00:04:38,960 --> 00:04:40,630 この場合には ちょっと違うようにコンパイルされますが 87 00:04:40,797 --> 00:04:43,930 全く同じ機能が実行されて 88 00:04:44,097 --> 00:04:47,710 カウンターの値は 7 になります。 89 00:04:49,550 --> 00:04:52,080 counter をクリックすると ここで 7 だとわかります。 90 00:04:52,350 --> 00:04:57,020 そして例えば Into すると 91 00:04:57,960 --> 00:04:59,850 decrement の中に入って行きます。 Over、Over 92 00:05:03,030 --> 00:05:05,320 と、Over もさきほどと同じです。 93 00:05:08,810 --> 00:05:12,430 ここではカスケードされて 94 00:05:12,597 --> 00:05:13,440 カウンター c を返します。