オブジェクト指向とグラフィカルユーザインタフェースの基礎

さて、皆さんは Morph の世界をいろいろいじってみたと思いますが、 これに基づいていろいろな概念や用語を説明してみます。 説明と実際の実装と異なる場合がありますが、 あえてそうしています。

オブジェクト指向の基本概念

このページでは、オブジェクト指向に関する考え方と用語を紹介します。 現時点ではよくわからなくても、 高学年次のプログラミングの授業を受けてみると理解が深まるでしょう。

オブジェクトとメッセージ

オブジェクト (object) はものという意味です。 オブジェクト指向では、実世界同様に もの が主体となります。 オブジェクトは、依頼メッセージ(message)を受け付け、 何らかの定義された計算、処理、仕事を行い、結果を返答(または反応)します。 オブジェクトはもの ですが、 よく擬人化されます。

次に、あなたがロボットの"ゴンタ君"に"進め"と命令する場合を考えてみましょう。 あなたはゴンタ君に「10歩進め。」とメッセージを送って仕事を頼みます。

するとゴンタ君は反応として10歩進みます。

実世界でも、誰かに何か仕事を頼む場合には、 何か してくださいとお願いします。 オブジェクト指向でもまったく同じです。 オブジェクト何か してくださいとお願いすればよいのです。

何か人に仕事を頼むことを考えてみてください。 必要な事項は、

  1. に頼めばいいか    オブジェクト
  2. を頼めばいいか    メッセージ (必要ならパラメータ)
  3. が返ってくるか    返答
がわかればいいはずです。 ただし、Morph の世界では返答がありません。 反応として、動作した結果が見えたり聞こえたりします。

メッセージの一般形は、

返答 メッセージ (あればパラメータ)
となります。

オブジェクトにメッセージを送るには、

オブジェクト メッセージ パラメータ
となります。 オブジェクトはメッセージを受け取ると何かしてくれます。 人に何か仕事を頼むことと、 オブジェクトに何か仕事を頼むことは同じであるというイメージは湧きましたか。

あるオブジェクトが受け付けることのできるメッセージをインタフェース (interface) といいます。 仕事を依頼する側は、オブジェクトのインタフェースがわかればそのオブジェ クトに仕事を依頼することができます。

Q. Morph にはどんなインタフェースがありましたか?

"Don't tell me how you do it; just do it." という言葉が表すように、 オブジェクトには、それをやりなさい と伝えるだけで、どのようにそ れをやったらいいか細かいことは伝えません。 そのやりかたはオブジェクトに任せてしまいます。

もしかするとゴンタ君は、 モータで動いているかもしれませんし、エンジンで動いているかもしれません。 ひよっとすると人力かもしれません。 でもそんなことは仕事を頼んだ人には関係ありません。 「10歩進め。」とゴンタ君に頼めば、 結果として10歩移動してくれるということがわかっていれば仕事を頼むことができます。 どうやるかは考えなくてもいいのです。 ここにオブジェクト指向の本質が潜んでいます。

Morphとオブジェクト指向

仕事を依頼する側からはインタフェースがわかっていれば仕事を頼むことがで きることはわかりました。 では、メッセージを受け付けるオブジェクトはどうなっているのか内部を探索 してみましょう。

みなさんが既に使っている"星"を例としてみましょう。 "星"を3つ配置して、それぞれ名前を"星1"、"星2"、"星3"としましょう。

ここで、星を簡略化して考えてみます。 星は、

  1. 星の絵 がある
  2. xざひょう、yざひょう、向き がある
  3. ならす、進める、まわす ことができる
  4. 名前をつけることができる
と定義します。

では、"星"とは何か考えてみましょう。 もし、あなたが"星"のMorphを作ってみなさいと言われたらどうしますか? 何が必要になるか、順に考えてみましょう。 星を画面に描くためには、星の絵は既にあるとして、

  1. 星のx座標
  2. 星のy座標
  3. 星の向き
が必要そうだなと考えられるでしょう。 これらは星を描くために必要なデータです。 今後はこれらのデータを星の属性と呼びます。

では、星はどんなことができるでしょう。 既に皆さんは、星を進めたり、まわしたり、ならしたりしたことがありますね。 星ができそうなことを考えてみると、

  1. 星を進める
  2. 星をまわす
  3. 星をならす
が考えられます。他にももっとできそうなことがありますが、ここではこのく らいにしておきましょう。 これらのできることを星の操作 と呼びます。 用語としては、操作はメソッド(method)といいます。 星の進める操作は、その星の x と y の値を変えます。 星のまわす操作は、その星の向きを変えます。 星のならす操作は、その星を鳴らします。 では表に星の属性、インタフェース、操作をまとめておきましょう。

属性インタフェース操作
x 進める: 数 向きと進める数に従って、x と y の値を変える
y
向きまわす: 数向きの値を変える
ならす: 音音を出す

返答する代わりに画面上の星の位置や向きに変更が反映されます。 メッセージの":"の後はパラメータを表します。 星が保持しなければならないデータと、できなければならない仕事が わかったでしょうか。

星の共通点

画面の中に3つの星があります。 今度はこれらの個々の星について考察してみましょう。

それぞれの星が持っている属性はどうなっているでしょうか。 ビューワで見てみましょう。 まず、星1には、x に 166 という値、y に 322 という値、向き(heading)に 0 という値というように、具体的な数値を持って います。 x、y、向き は変数といいます。 今のところ、変数は値の入れものだと思ってください。 残りの二つの星も同様にそれぞれの属性に具体的な値を持っています。

属性の値を表にまとめてみます。 たまたま"向き"はすべてゼロですね。

1 2 3
x 166 97 144
y 322 285 226
向き 0 0 0

では、操作についてはどうでしょうか。 まず、星1ですが、ならす、進める、まわす ができます。 他の二つの星も同様です。

しかし、ここで注意して欲しいことがあります。 星1の属性は、星1の操作を通してしか変更できないと いうことです。 たとえば、星2が星3の属性を直接変更することはできません。 しかし、星2が星3にメッセージを送れば可能です。 他の星についても同様です。 自分の中身を他人がガバッと開いて勝手にいじることはできません。 それぞれの星は、それぞれの星の操作を通してしか属性値を変更するこ とができません。 関連する属性と操作を結びつけて、カプセル化 (encapsulation) します。 このように、属性操作をカプセル化したものをオブジェクト と言います。 図に星オブジェクトについてまとめてありますので参考にして下さい。

オブジェクト内部を見ることができれば、どんな属性があって、 どのように操作を実行するのか知ることができますが、 メッセージを送る側からはこれらの情報は一切見えません。 これを情報隠蔽 (information hiding)といいます。 あくまでもメッセージの送り手側からはインタフェースしか見えないというところがオブジェクト指向の特長です。 これまでの説明では、オブジェクトの内部を探索するために、 オブジェクトにはどのような属性が必要であるか考えてきましたが、 単にオブジェクトを使う場合にはどのような属性があるか はまったく考える必要はありません。 オブジェクトを設計する場合には、属性を考える必要があります。

ここまで、星オブジェクトの中身をいろいろ観察してみましたが、 これはビューワというツールがあるおかげです。

インタフェースとメソッドの違い

ここではインタフェースとメソッドの違いについて考察してみましょう。

直前の図を思い出して下さい。 オブジェクト内部には情報を保持する属性がいくつかあります。 オブジェクト外部には受け付けることができるメッセージとしてインタフェースがいくつかあります。 オブジェクト内部には、インタフェースに対応したメソッド(〜の実装)があります。 表に示すように、インタフェースはそのオブジェクトに何ができるか(what)を、メソッドはそれをどのように行うか(how)を記述したものです。

インタフェース メソッド
what how
何ができるか どのように行うか

先ほどの図のオブジェクト内部に人の絵がありますが、 これはオブジェクトの中にいる小人さんだと思って下さい。 小人さんがオブジェクトの中にいて、 あれこれ実際の作業をしてくれると考えてください。
  1. オブジェクトがインタフェースに合ったメッセージを受け取る
  2. メッセージを受け取った"小人さん"はインタフェースに対応する操作(メソッド)にしたがって、必要な属性を参照して作業を行う
  3. 結果を返す
と考えてもよいでしょう。

この図は、実際の "まわす"メソッドを Squeak のブラウザというツールを使って見た例です。

この4行全部でメソッドです。 1行目はインタフェース(またはメソッドのシグネチャ)です。 2〜4行目が、具体的にどうするかをプログラムの形式で書いたメソッド本体です。

外部インタフェースには、メソッド名パラメータ何が返るかを指定します。 Squeak の場合は何が返るかを書きません。 また、何かをするけど、何も返らない場合もあります。 これらを合わせてメソッドのシグネチャといいます。

見えるもの 見えないもの
インタフェース (メソッドのシグネチャ) フィールドとメソッド本体の記述
パブリック (public: 公的) プライベート(private: 私的)

以上を表のようにまとめると、まず、 見えるものとしてオブジェクトは外部に対するインタフェースを用意しています。 一方、 外部からは見えないものとして内部には固有のデータを保持する変数と、 インタフェースに対応する実際の動作を定義したメソッドを持つことになります。

オブジェクトに仕事を依頼する場合には、 そのオブジェクトができることがわかればメッセージを送ることができます。 どんなデータを保持しているのか、また、 どのように仕事をするのかは、 メッセージの送り手が気にすることではありません。 やって欲しいことを依頼するだけで、 あとはオブジェクトが手順書通りに実行して結果を返してくれます。

一つのオブジェクトを見ると以上のような動作をすることがわかったでしょうか。 実際にプログラムを作成する場合には、 複数のオブジェクト間でメッセージを交換することによって計算(仕事)が進んでいきます。 実世界と同じく、オブジェクトが複数集まったオブジェクトも当然あります。 オブジェクトが別のオブジェクトを属性として持つ関係を has-aの関係といいます。 全体と部分の関係 (aggregation)ともいいます。

クラスとインスタンスの関係

先程の星オブジェクトについてもう一度考えてみましょう。 すべての星に共通することは何でしょうか、 違うことは何でしょうか。

共通点 相違点
属性 属性の具体的な値
インタフェース
操作

表に3つの星の共通点・相違点をまとめてみました。 星1、星2、星3は、同じ属性(x, y, 向き)を持っています。 しかし、属性の具体的な値はそれぞれ違っています。 また、すべての星は同じインタフェースと同じ操作を持っています。 オブジェクト指向では、共通なものはまとめようという考え方で成り立ってい ます。

個々のオブジェクトはインスタンス(instance: 具体例)といいます。 インスタンスに共通なものを抽出したものがクラス(class: 設計図)です。

クラスは設計図であり、 設計図から作られたインスタンス(オブジェクト)が実体です。 クラスはインスタンスの生成工場であるともいえます。 クラス(class)には、種類や、分類するという意味があります。 オブジェクト(object)とインスタンス(instance)という言葉は同じ意味で使われます。 ここでは、一般的にものを表す場合にはオブジェクトを、 クラスと対比させて具体的な実体を表す場合にはインスタンスを使います。

同一のクラスから生成されたインスタンスは、 同じ種類(型)の属性値を入れる入れもの(変数)を持っています。 同じクラスから生成されたインスタンスでも、 インスタンスは個々のID (identifier)を持っています。 図は、星クラスから、複数の星インスタンスが生成されていることを示しています。 Squeak ではインスタンス生成には new メッセージを使います。 このように、クラスにはインスタンスを生成する特別なメソッドとしてコンストラクタ (constructor) が用意されています。 インスタンスを生成するまでは設計図(クラス)しかありませんから、 コンストラクタのような特別なメソッドが必要になります。 コンストラクタ以外にもクラスに対する属性や操作が必要な場合があります。 このような例はいろいろなところで出てきます。 クラス変数やクラスメソッドは、 インスタンスを管理したり、 インスタンスに共通な値を保持したりするために使われます。

属性はまた、オブジェクトのインスタンス変数と呼ばれます。 同じ種類の属性を持っていますが、各インスタンスは、 インスタンス固有の具体的な値を持っています。

Morphで遊んでいる間はクラスを作りませんが、今後、 みなさんがプログラムを作るということは、 作成しようとするプログラムに必要なオブジェクトを見つけ出して、 そのクラスを定義する(設計図を作る)ということになります。 その作成した設計図に基づいて、インスタンスを生成し、 そのインスタンスにメッセージを送って動作させます。

あなたが映画監督になって映画を作ることをイメージしてください。 脚本(シナリオ)に沿ってプログラムを書きます。 個々のオブジェクト(インスタンス)は俳優(actor)です。 設計図(クラス)には俳優の性質(属性)や演技(操作)を記述してあります。 あなたは脚本にしたがって俳優を連れてきて(クラスからインスタンスを生成)、 演技をさせます(メッセージを送る)。 どうですか、オブジェクト指向のイメージがつかめてきたでしょうか。


前のページに戻る
間違いがあったら masuda@im.dendai.ac.jpまでお願いします。