目次 >> 第4章 もう少し踏み込んだ操作 |
この章では、この開発環境を使ってできることについて、もう少し触れたいと思います。必要不可欠というわけではありませんが、とても一般的に使用することができる機能です。
オブジェクトのメソッドを実行したとき、ユーザーが定義したメソッドだけでなく、
という操作を利用できることに気づいたことでしょう(図5)。この操作で、オブジェクトのインスタンス変数(「フィールド」)の状態をチェックすることができます。いくつかユーザー定義された値を持つオブジェクトを生成してみてください(例えば、パラメータを取るコンストラクタを持つStaffオブジェクト)。そしてそのオブジェクトのメニューから を選んでください。オブジェクトのフィールド、そのデータ型、そして値を表示するダイアログが現われます(図9)。
図9:フィールド検査ダイアログ
Inspectは、オブジェクトの状態を変更する操作が正しく実行されたかどうかを迅速にチェックするために有益です。したがってInspectは簡単なデバッグツールです。
Staffオブジェクトの例では、すべてのフィールドが単純な型(非オブジェクト型もしくはString型)です。これらの型の値は、直接示されます。あなたはすぐに、コンストラクタが値を正しく割り当てたかどうかを見ることができるのです。
もっと複雑なケースでは、フィールドの値が、ユーザー定義されたオブジェクトの参照であるかもしれません。そのような例を見るために、別のプロジェクトを使います。標準のBlueJ配布ファイルに含まれているpeople2プロジェクトをオープンしてください。 people2の画面は図10で示されている通りです。ご覧のように、この二番目のサンプルプロジェクトは、今まで見ていたクラスだけでなくAddressクラスを持っています。Personクラスが持つフィールドのひとつが、ユーザー定義型であるAddress型です。
図10:people2プロジェクトの画面
わたしたちが試したい次のもの――オブジェクトのフィールド検査――は、Staffオブジェクトを作成し、このオブジェクトのメソッドであるsetAddressを呼び出します(これはPersonからの継承を示すサブメニューで見ることができます)。
住所を入力してください。Staffクラスのコードは、その内部でAddressクラスのオブジェクトを生成し、addressフィールドに参照を格納します。
今度はStaffオブジェクトをInspectしてください。その結果、図11で示されるとおりにダイアログが表示されます。Staffオブジェクトのフィールドは現在、addressを含んでいます。その値は<object reference>(他のオブジェクトへの参照)として見ることができます。これは構造体であり、ユーザー定義されたオブジェクトであるため、値をこの一覧上で直接見ることはできません。さらにaddressを調べるために、一覧でaddressフィールドを選択し、ダイアログにある ボタンをクリックしてください(addressフィールドをダブルクリックしても同様にできます)。別のInspectウインドウが順次開かれ、Addressオブジェクトの詳細が示されます(図12)。
図11:オブジェクト参照の検査
図12:内部オブジェクトの検査
選択したのがpublicなフィールドだったときは、
ボタンをクリックする代わりに、addressも選んで ボタンをクリックすることができます。この操作により、選択したオブジェクトがオブジェクトベンチに置かれます。そこでオブジェクトのメソッドを呼び出すことで、さらにテストすることができます。要約:オブジェクトのInspect操作は、オブジェクトの内部的な状態を見ることで、いくつかの簡単なデバッグをすることができます。
コンポジションは、パラメータとして、オブジェクトを他のオブジェクトに渡す能力についての用語です。サンプルを試してみましょう。Databaseクラスのオブジェクトを生成してください。(Databaseクラスには、どんなパラメータも取らないコンストラクタひとつしかないことに気づくでしょう。従って、オブジェクトの構成はシンプルです)。Databaseオブジェクトは、Personオブジェクトの一覧を保持することができます。Personオブジェクトの追加および、現在保持しているすべてのPersonオブジェクトを表示する手段を持っています(それをデータベースと呼ぶのは、実際は少々誇張しています)。
既にStaffオブジェクトもしくはStudentオブジェクトを、オブジェクトベンチに置いていないのであれば、それらのひとつを生成してください。次に書かれていることを試すには、オブジェクトベンチに同時に、Databaseオブジェクトと、StaffオブジェクトまたはStudentオブジェクトがあることが必要です。
今度はDatabaseオブジェクトのaddPersonメソッドを呼んでください。シグネチャは、Person型のパラメータが予期されると言っています(覚えておいてください。Personが抽象クラスなので、Person型を直接生成したオブジェクトはありません。しかしその派生クラスであるStudentやStaffで代用できます。したがってPerson型が期待される箇所に、Student型やStaff型を置くのは正しいやりかたです)。
オブジェクトベンチにあるオブジェクトそのものを、メソッド呼び出しにおけるパラメータとして渡すには、パラメータ入力域にオブジェクト名を入力するか、近道としてそのオブジェクトアイコンをクリックします。これはオブジェクト名をメソッド呼び出しダイアログに入れます。 をクリックしてください。メソッドが実行されます。
このメソッドはどんな戻り値もないため、すぐには結果を見ることができません。操作が本当に実行されたかどうかをチェックするために、DatabaseオブジェクトのlistAllメソッドを呼び出すことができます。listAllメソッドは、Personに関する情報を標準出力に書き出します。テキストを表示するために、自動的にターミナル画面が開くのに気づくでしょう。
複数のPersonが「データベース」に入れられている状態で、再び試してみてください。
要約:オブジェクトは、そのオブジェクトのアイコンをクリックすることで、メソッドのパラメータとして渡すことができます。