このセッションでは デバッガを使って
プログラミングする方法を 示します。
カウンターのアプリケーションを 再び実装しますが
前回とは違う方法で より対話的な流れでの開発になります。
まずは前回同様
新規にMyCounterパッケージを作ります。
フィルタして 表示される要素を減らします。
MyCounter では
まずはテストを定義します。 テストクラスです。
テストクラスは TestCase を継承します。
「CounterTest」と呼ぶことにしましょう。
コンパイルします。 メニューを使って、そして
コメントも同様です。
テストクラスを作りました。
このテストクラスにテストメソッドを書いていきます。
テストメソッドの名前は test で始まります。
何をしましょうか?
前回同様、ローカル変数を定義します。
ローカル変数には
Counter クラスのインスタンスを置きます。
カウンタの値を初期化します。
そしてカウンタの値が正しいかどうか 検査します。
コンパイルします。
ここでシステムが 「警告です。
Counter が何かわかりません」 と言ってきます。これは既に
イタリック体で表示されている ことからもわかります。
そこでシステムは提案してきます。 「新しいクラスを定義しましょうか？
新しいグローバル変数ですか？ それともクラス変数ですか？」
ここでは、新しいクラスです。
クラス定義を提案してきます。 そこで私は答えます。
「OK、それで正しいです。 パッケージも正しくて、
Objectを継承します。 はい、これでいいです」
それで空のクラスが作られます。
そこでこれを変形していきます。
見ての通り MyCounter クラスは空です。
テストを実行したら、レッドです。
なぜレッドなのでしょう？
エラーがあるからです。
そこで、このメッセージをどう読んだら いいのでしょうか？
2分かけてやってみましょう。
システムが言ってきます。 「count:メッセージが
Counterクラスのインスタンスに 送られています。
そしてそれに対応するメソッドが 見つかりません。」
見てみましょう。 デバッガを開きます。
デバッガは実行スタックを表示します。
それでメッセージが 理解されていないことがわかります。
そしてそのメッセージが どこで発生したかがわかります。
そこに行って見てみると
変数があります。cを見ると
それはテンポラリ変数で 値はカウンターです。
とりあえず例えばcのクラスは
「self class」として Counterクラスです。
これは明らかです。今の所 このクラスにはメソッドは何も定義されていません。
そこでシステムにメソッドを作るようにお願いします。
「Create」です。
システムはいくつかクラスを提案してきます。
Counter クラスを選択して
作ってみましょう。
「accessing」に作ります。
これでシステムは
メソッドを正しいシグネチャで 自動的にコンパイルします。
メソッドの本体については システムはどうしたらいいのかわからないので
「ShouldBeImplemented」としています。 これは何をするのでしょう？
実行すると例外を挙げます。
これで実行し直してみると
今度は新しいエラーが出ます。
メソッドの本体を実装しなければなりません。
私はcountメッセージがわかります、と。 私は何をしたらいいでしょう？
私はこの値をインスタンス変数に代入したいです。
すると赤い文字で 表示されています。
なぜなら今のところこのクラスは このインスタンス変数を持たないからです。
コンパイルします。
システムが提案してきます。 「一時変数が必要でしょうか？
それともインスタンス変数でしょうか？」
必要なのはインスタンス変数です。
そこでそうします。 Countクラスを見れば
インスタンス変数 count が作られて
値をセットするセッターメソッドも
定義されます。
これが完了したら デバッガに継続するように指示します。
「Proceed」は 実行を継続するという意味です。
あたかも何事もなかった かのように継続します。
さあ何が起こるでしょう？
まだエラーが出ます。
システムは 「Counter クラスのインスタンスが
count メッセージを受け取った そして
適切なメソッドが見つからなかった」 と言ってきます。
それはそうでしょう。 c は確かに 7 を値とするカウンタを
持っていて 7はその変数 count に保持されています。
しかし count というメソッドはありません。
作りましょう。
「Create」をします。 どのクラスに作りましょうか？
これも Counter クラスの accessing プロトコルに作ります。
アクセサーなので。
ここで このシステムの賢さがわかります。
システムは count という インスタンス変数があることに気付き
count というメソッドを作りたいことから
アクセサーを提案します。
私が欲しいのはこの通りのものです。
これで Proceed できます。
どうでしょう？
テストはグリーンです。 テストがグリーンで
私のクラスに2つのメソッドが作られました。
同じことを increment についても 行います。
実際、私は
メソッドが何をしなければならないか 仕様を示して
実際にそうなるかを検査します。
ここで 9 になるはずです。 コンパイルして実行します。
するとシステムが言ってきます。 「increment メソッドがわかりません」
はい、それが正常です。 Create をします。operation。
incrementでは count
:= count + 1 コンパイルします。
Proceed します。 テストができました。
このまま decrement を作ります.
実践してください。
ここで 5 になるはずです。 テストを定義します。
メソッドを定義します。
OK。お分かりでしょう count := count - 1
デバッガの中でコンパイルします。
Proceed をクリックすると テストはグリーンです。
これで2つの操作が定義されました。 increment と decrement です。
保存しましょう。
前にお見せしたのと同じように 保存します。
Save をクリックして
書きます。 「アクセサーと
decrement と increment テストはグリーン」
これでできました。 保存しました。
これで良しと。
このレッスンで 覚えておくべき重要なことは
デバッガーがオブジェクトの状態への アクセスを提供すること
デバッガーが呼び出しコンテキストの 正しい位置にあなたを据えて
その呼び出しコンテキストを使って 必要な情報を得ること。
コードを書くために必要な情報です。
そして、この方法が本当にとても パワフルだということです。