1 00:00:01,220 --> 00:00:02,580 このセッションでは デバッガを使って 2 00:00:02,747 --> 00:00:05,220 プログラミングする方法を 示します。 3 00:00:05,760 --> 00:00:09,330 カウンターのアプリケーションを 再び実装しますが 4 00:00:09,497 --> 00:00:14,190 前回とは違う方法で より対話的な流れでの開発になります。 5 00:00:16,940 --> 00:00:18,290 まずは前回同様 6 00:00:18,457 --> 00:00:20,840 新規にMyCounterパッケージを作ります。 7 00:00:26,050 --> 00:00:28,810 フィルタして 表示される要素を減らします。 8 00:00:29,270 --> 00:00:33,240 MyCounter では 9 00:00:34,960 --> 00:00:37,100 まずはテストを定義します。 テストクラスです。 10 00:00:37,267 --> 00:00:39,090 テストクラスは TestCase を継承します。 11 00:00:40,260 --> 00:00:41,650 「CounterTest」と呼ぶことにしましょう。 12 00:00:42,790 --> 00:00:44,870 コンパイルします。 メニューを使って、そして 13 00:00:45,037 --> 00:00:46,340 コメントも同様です。 14 00:00:46,507 --> 00:00:47,830 テストクラスを作りました。 15 00:00:48,260 --> 00:00:51,610 このテストクラスにテストメソッドを書いていきます。 16 00:00:53,260 --> 00:00:56,150 テストメソッドの名前は test で始まります。 17 00:01:02,260 --> 00:01:04,160 何をしましょうか? 18 00:01:04,520 --> 00:01:07,820 前回同様、ローカル変数を定義します。 19 00:01:08,000 --> 00:01:12,570 ローカル変数には 20 00:01:12,737 --> 00:01:15,150 Counter クラスのインスタンスを置きます。 21 00:01:16,770 --> 00:01:21,130 カウンタの値を初期化します。 22 00:01:21,297 --> 00:01:25,500 そしてカウンタの値が正しいかどうか 検査します。 23 00:01:31,450 --> 00:01:32,083 コンパイルします。 24 00:01:33,320 --> 00:01:36,070 ここでシステムが 「警告です。 25 00:01:36,237 --> 00:01:38,250 Counter が何かわかりません」 と言ってきます。これは既に 26 00:01:38,417 --> 00:01:39,670 イタリック体で表示されている ことからもわかります。 27 00:01:40,030 --> 00:01:42,460 そこでシステムは提案してきます。 「新しいクラスを定義しましょうか? 28 00:01:42,627 --> 00:01:44,040 新しいグローバル変数ですか? それともクラス変数ですか?」 29 00:01:44,207 --> 00:01:45,000 ここでは、新しいクラスです。 30 00:01:45,137 --> 00:01:48,260 クラス定義を提案してきます。 そこで私は答えます。 31 00:01:48,427 --> 00:01:50,790 「OK、それで正しいです。 パッケージも正しくて、 32 00:01:50,957 --> 00:01:51,590 Objectを継承します。 はい、これでいいです」 33 00:01:51,757 --> 00:01:55,160 それで空のクラスが作られます。 34 00:01:56,050 --> 00:01:58,520 そこでこれを変形していきます。 35 00:02:00,520 --> 00:02:04,260 見ての通り MyCounter クラスは空です。 36 00:02:04,610 --> 00:02:07,130 テストを実行したら、レッドです。 37 00:02:07,297 --> 00:02:08,820 なぜレッドなのでしょう? 38 00:02:09,000 --> 00:02:09,860 エラーがあるからです。 39 00:02:10,290 --> 00:02:11,760 そこで、このメッセージをどう読んだら いいのでしょうか? 40 00:02:11,927 --> 00:02:13,470 2分かけてやってみましょう。 41 00:02:14,630 --> 00:02:19,590 システムが言ってきます。 「count:メッセージが 42 00:02:19,757 --> 00:02:23,440 Counterクラスのインスタンスに 送られています。 43 00:02:23,607 --> 00:02:28,240 そしてそれに対応するメソッドが 見つかりません。」 44 00:02:31,590 --> 00:02:32,360 見てみましょう。 デバッガを開きます。 45 00:02:32,760 --> 00:02:36,050 デバッガは実行スタックを表示します。 46 00:02:36,217 --> 00:02:39,760 それでメッセージが 理解されていないことがわかります。 47 00:02:39,927 --> 00:02:42,960 そしてそのメッセージが どこで発生したかがわかります。 48 00:02:43,760 --> 00:02:46,020 そこに行って見てみると 49 00:02:46,187 --> 00:02:50,770 変数があります。cを見ると 50 00:02:50,937 --> 00:02:55,010 それはテンポラリ変数で 値はカウンターです。 51 00:02:55,177 --> 00:02:56,920 とりあえず例えばcのクラスは 52 00:02:57,830 --> 00:03:00,730 「self class」として Counterクラスです。 53 00:03:03,790 --> 00:03:08,230 これは明らかです。今の所 このクラスにはメソッドは何も定義されていません。 54 00:03:08,397 --> 00:03:12,620 そこでシステムにメソッドを作るようにお願いします。 55 00:03:12,787 --> 00:03:13,590 「Create」です。 56 00:03:14,290 --> 00:03:15,630 システムはいくつかクラスを提案してきます。 57 00:03:15,797 --> 00:03:17,370 Counter クラスを選択して 58 00:03:17,537 --> 00:03:18,670 作ってみましょう。 59 00:03:18,837 --> 00:03:20,330 「accessing」に作ります。 60 00:03:21,780 --> 00:03:23,620 これでシステムは 61 00:03:25,930 --> 00:03:29,200 メソッドを正しいシグネチャで 自動的にコンパイルします。 62 00:03:30,310 --> 00:03:31,850 メソッドの本体については システムはどうしたらいいのかわからないので 63 00:03:32,017 --> 00:03:36,010 「ShouldBeImplemented」としています。 これは何をするのでしょう? 64 00:03:36,177 --> 00:03:40,360 実行すると例外を挙げます。 65 00:03:40,527 --> 00:03:41,630 これで実行し直してみると 66 00:03:41,797 --> 00:03:44,140 今度は新しいエラーが出ます。 67 00:03:44,570 --> 00:03:46,680 メソッドの本体を実装しなければなりません。 68 00:03:48,090 --> 00:03:49,950 私はcountメッセージがわかります、と。 私は何をしたらいいでしょう? 69 00:03:50,117 --> 00:03:53,020 私はこの値をインスタンス変数に代入したいです。 70 00:03:53,187 --> 00:03:55,450 すると赤い文字で 表示されています。 71 00:03:58,180 --> 00:04:02,600 なぜなら今のところこのクラスは このインスタンス変数を持たないからです。 72 00:04:02,860 --> 00:04:04,170 コンパイルします。 73 00:04:05,130 --> 00:04:07,360 システムが提案してきます。 「一時変数が必要でしょうか? 74 00:04:07,527 --> 00:04:09,140 それともインスタンス変数でしょうか?」 75 00:04:09,307 --> 00:04:11,350 必要なのはインスタンス変数です。 76 00:04:14,330 --> 00:04:19,040 そこでそうします。 Countクラスを見れば 77 00:04:19,207 --> 00:04:21,640 インスタンス変数 count が作られて 78 00:04:21,807 --> 00:04:26,650 値をセットするセッターメソッドも 79 00:04:26,817 --> 00:04:27,450 定義されます。 80 00:04:29,790 --> 00:04:31,390 これが完了したら デバッガに継続するように指示します。 81 00:04:31,557 --> 00:04:34,550 「Proceed」は 実行を継続するという意味です。 82 00:04:34,717 --> 00:04:37,610 あたかも何事もなかった かのように継続します。 83 00:04:38,470 --> 00:04:39,103 さあ何が起こるでしょう? 84 00:04:39,270 --> 00:04:40,020 まだエラーが出ます。 85 00:04:41,310 --> 00:04:44,600 システムは 「Counter クラスのインスタンスが 86 00:04:44,767 --> 00:04:47,000 count メッセージを受け取った そして 87 00:04:47,167 --> 00:04:50,360 適切なメソッドが見つからなかった」 と言ってきます。 88 00:04:50,527 --> 00:04:54,250 それはそうでしょう。 c は確かに 7 を値とするカウンタを 89 00:04:55,680 --> 00:05:00,420 持っていて 7はその変数 count に保持されています。 90 00:05:00,587 --> 00:05:01,850 しかし count というメソッドはありません。 91 00:05:02,250 --> 00:05:03,080 作りましょう。 92 00:05:03,247 --> 00:05:05,360 「Create」をします。 どのクラスに作りましょうか? 93 00:05:05,527 --> 00:05:09,000 これも Counter クラスの accessing プロトコルに作ります。 94 00:05:09,460 --> 00:05:14,310 アクセサーなので。 95 00:05:14,477 --> 00:05:18,260 ここで このシステムの賢さがわかります。 96 00:05:18,427 --> 00:05:21,680 システムは count という インスタンス変数があることに気付き 97 00:05:21,847 --> 00:05:26,000 count というメソッドを作りたいことから 98 00:05:27,120 --> 00:05:29,240 アクセサーを提案します。 99 00:05:29,410 --> 00:05:30,140 私が欲しいのはこの通りのものです。 100 00:05:30,307 --> 00:05:31,050 これで Proceed できます。 101 00:05:32,440 --> 00:05:33,350 どうでしょう? 102 00:05:33,517 --> 00:05:37,750 テストはグリーンです。 テストがグリーンで 103 00:05:37,917 --> 00:05:42,050 私のクラスに2つのメソッドが作られました。 104 00:05:44,240 --> 00:05:45,470 同じことを increment についても 行います。 105 00:05:49,640 --> 00:05:51,100 実際、私は 106 00:05:51,267 --> 00:05:54,490 メソッドが何をしなければならないか 仕様を示して 107 00:05:54,657 --> 00:05:56,240 実際にそうなるかを検査します。 108 00:05:58,360 --> 00:06:03,090 ここで 9 になるはずです。 コンパイルして実行します。 109 00:06:03,300 --> 00:06:07,730 するとシステムが言ってきます。 「increment メソッドがわかりません」 110 00:06:07,897 --> 00:06:12,490 はい、それが正常です。 Create をします。operation。 111 00:06:15,960 --> 00:06:19,950 incrementでは count 112 00:06:20,750 --> 00:06:25,230 := count + 1 コンパイルします。 113 00:06:27,080 --> 00:06:29,570 Proceed します。 テストができました。 114 00:06:30,370 --> 00:06:31,760 このまま decrement を作ります. 115 00:06:31,927 --> 00:06:36,050 実践してください。 116 00:06:39,520 --> 00:06:43,120 ここで 5 になるはずです。 テストを定義します。 117 00:06:45,460 --> 00:06:46,750 メソッドを定義します。 118 00:06:51,480 --> 00:06:55,000 OK。お分かりでしょう count := count - 1 119 00:07:00,330 --> 00:07:01,660 デバッガの中でコンパイルします。 120 00:07:01,827 --> 00:07:05,640 Proceed をクリックすると テストはグリーンです。 121 00:07:05,807 --> 00:07:10,060 これで2つの操作が定義されました。 increment と decrement です。 122 00:07:10,420 --> 00:07:11,770 保存しましょう。 123 00:07:12,010 --> 00:07:14,500 前にお見せしたのと同じように 保存します。 124 00:07:15,280 --> 00:07:19,180 Save をクリックして 125 00:07:20,040 --> 00:07:20,760 書きます。 「アクセサーと 126 00:07:25,740 --> 00:07:29,430 decrement と increment テストはグリーン」 127 00:07:29,597 --> 00:07:34,000 これでできました。 保存しました。 128 00:07:47,250 --> 00:07:47,883 これで良しと。 129 00:07:49,100 --> 00:07:52,860 このレッスンで 覚えておくべき重要なことは 130 00:07:53,390 --> 00:07:58,250 デバッガーがオブジェクトの状態への アクセスを提供すること 131 00:07:58,417 --> 00:08:02,340 デバッガーが呼び出しコンテキストの 正しい位置にあなたを据えて 132 00:08:02,507 --> 00:08:04,460 その呼び出しコンテキストを使って 必要な情報を得ること。 133 00:08:04,627 --> 00:08:07,390 コードを書くために必要な情報です。 134 00:08:07,557 --> 00:08:08,690 そして、この方法が本当にとても パワフルだということです。