オブジェクト指向の考え方

 ここからオブジェクト指向の考え方を紹介していきます.とはいえ,あまり突飛なものでもありません.普通に聞いたら当たり前に聞こえる程度のものです.

● モデリング

 オブジェクト指向においては,モデリングという概念がかなり大きな位置を占めます.モデリングというのはモデルを作り上げることですが,ではモデルとは何でしょう? モデルとは,実物そのままではなく,扱うのに支障がない程度に簡略化して関心があるところだけを抜き出した代物です.

 たとえば,プラモデルを考えてみましょう.(これは作ることが楽しいというのはさておいて)実物そのままではありません.大きさ,材質,機能などはさて置き,扱うのに支障がない程度に簡略化して,観賞するという点から形や色を抜き出したものです.

〔イラスト2
プラモデル

 別にモデリングというのはオブジェクト指向特有の作業ではなく,多くの場合はすでにモデリング作業を行っているはずです.

 たとえば,ソフトウェア構成を考えるときもそうです.システムをそのままではなく,考えるのに支障がない程度に簡略化して,構成という部分だけを抜き出して考えているのではないでしょうか.

 オブジェクト指向とは,このモデルを考えて,モデルのままコーディングまで突っ走るやり方といえるかもしれません.オブジェクト指向のモデルは,作ろうとしているソフトウェアが扱う分野です.「これは何か」を問い詰めて,そのソフトウェアが扱う分野をモデリングします.モデルですから,その分野そのままではありません.関心がある部分だけを抜き出します.

 とある分野をモデリングしようと思ったら,その分野の知識がかなり必要になります.その分野に関してあいまいなままではモデリングできません.ということは,その分野の各部分について「これは何か」と問い詰めなければなりません.それがどういうもので,それは全体の中でどのようにほかと関わりあっているのか,それを普通の言語で表現しようとしても,なかなか複雑で表現しきれません.

 そこで,モデリングを表現するための記法が考えられました.これまで,いろいろな記法が提案されましたが,現在はUML(Unified Modeling Language)にほぼ統一されました.

 UMLの話はまた別の機会にするとして,モデリングの話を続けます.関係ない部分はモデルに表しません.ということは,モデルはその作ろうとしている分野でのものということになります.

 たとえば,同じ医療分野でも心臓ペースメーカーの場合の「患者」は「心臓」をもっていますが,断層撮影機の「患者」は「心臓」はもっていないけれど「断層画像」を多数もっているという感じです.

 分野ごとに「これは何か」を追求したもの――それがモデルになります.ちなみに,この「分野」のことをドメインといいます.

● ブラックボックス

 複雑なことをやるときに,細かいことまでみているとやっていられません.(何度も繰り返しになるが)人間の頭はそんなに良くないのです.

 ということで,モデリングをするときには「どうやって?」ということは考えません.モデリングで「どうやって?」ということを考え,それに頼ったモデリングを行うと,複雑すぎて考えていられず,一つ一つのモデルを考えるときにも修正が困難になります.

 というか,「どうやって?」ということそのものがインターフェースになってしまうのです.変数の使い方,状態,果ては処理の順番までがインターフェースになってしまっては,モデル同士が緊密に結びついてしまい,分割している意味がなくなります.

 モデリングでは,あくまでシステム(オブジェクト指向の場合はドメイン=対象とする分野)の分割と互いのインターフェースの概略を考えるだけです.

 モデルのその外から見える部分は,すべてインターフェースです.オブジェクト指向でいうところの隠蔽や多態は,ここから出てきます.

・隠蔽とは,とくに変数の使い方についての「どうやって?」を隠すこと
・多態は,同じインターフェースなんだから同じ動きをするだろうという「どうやって?」を隠すこと
といえます.

 この「どうやって?」はわからないがインターフェースはわかるという構造は,ブラックボックスと呼ばれています.複数の部品とそのつながりについて考えるときは,部品をブラックボックスとして考えます.これは重要なことです.

 このブラックボックスという考え方は,部品がある場合にはいつでも使うべきです.

 たとえば,システムの目的と外界とのインターフェースを考えているとき(要求分析の取りかかりフェーズ)は,外界の中での一部品としてそのシステムを考えているわけなので,システムをブラックボックスとして考えます.どうやってそれを実現するのかは考えません.

● 抽象化

 モデリングを行うときには,抽象化するという作業が欠かせません.「一般化する」と言い換えてよいかもしれません.抽象化の逆が具体化です.具体化したものは,本当にそれにしか使えません.それが具体化ということです.

 人間の頭というのはさほど良くありません.具体的なものそのままでは,莫大に数がありすぎて理解できないのです.したがって,人間は抽象化することで考えることを減らしています.

 幼児にとある犬を見せて「わんわん」だと教えたとしましょう.おそらく,別の犬を見せても「わんわん」だと答えるでしょう.すなわち,具体的な特定の犬を「わんわん」だと思っているのではなくて,一般的にあのようなものを「わんわん」だと思っているわけです.だから,別の犬を見せても「わんわん」というわけです.おそらく,過剰に一般化してしまい,きつねを見せようがたぬきを見せようが「わんわん」になってしまうかもしれませんが.

 抽象化で難しいのは,正確に抽象化することです.さもないと,先ほどの幼児の例のように,きつねもたぬきも「わんわん」になってしまいます(じつは,きつねもたぬきも犬科なので,「わんわん」で正しいのかもしれない).逆に抽象化が足りないと,足し算一つできません.抽象的な「整数」なら足し算のやり方も覚えていられますが,具体的な整数「385」とか「412」とかの足し算の結果をことごとく覚えておけといわれると,そうはいきません.モデルを表現するのに,必要で十分なだけ抽象化しなくてはなりません.

● シミュレーション

 オブジェクト指向で何かやってみようというときのコツは,シミュレーションです.「どう処理しようか」ではなくて,「どうなっていればそうなるか」という感じです.

 そのシステムのようにふるまうには,どのような配役が必要で,どのようなやり取りをすればよいか.それは,本物でなくてよいのです.ある意味では劇だと考えてもよいでしょう(そのため,ここでは「役」といういい方をする).それぞれの役はブラックボックスです.中身など考えません.ただ,それぞれの役も魔法が使えるわけではないので,それを行うのに必要なことは,別の役の人に教えてもらわなければなりません.

 一つの役が複雑なら,さらにその役を一つのシステムだと考え,またその役のようにふるまうための配役や,それらがどのようにやり取りすればよいのかを考えます.

 こうして,簡単な役ばかりになったら,その役がオブジェクトです.オブジェクトが集まり,一つの役を果たしているなら,その役をサブシステムといいます.

 モデリングのところで,「オブジェクト指向がモデリングするのはその分野(ドメイン)だ」と話しました.つまり,その分野のモデルを演じれば,そのシステムはできあがりというわけです.

 たとえば,エレベータの制御プログラムをとりあげてみます.駕篭,上昇ボタン,下降ボタン,ケーブル張力センサなどの配役があるでしょう.複数の駕篭の制御を行うためには,制御センタがあるでしょう.また,効率的に駕篭を動かすには移動スケジュールがあるでしょう.プログラムの中にこれらの役を並べてエレベータを演じるのです.

 図1が,このような配役とやり取りです.そして,駕篭のプログラムはこの役を演じられるように各種センサやボタン,ケーブル巻き取りモータ,ドアなどとやり取りをします.

〔図1〕エレベータのシーケンス図

 この駕篭のプログラムがどこにあるかというと,本当の駕篭の中ではなく,二つのエレベータを管理している一つの制御コンピュータの中にあります.実行するのも制御コンピュータです.つまり,演じているだけで駕篭そのものというわけではないのです.

 シミュレーションとか演じるというのは,オブジェクト指向のモデリングがその分野にあるということです.「何ができるのか?」という機能に注目するのではないのです.

オブジェクト指向の用語

 オブジェクト指向には特有の言葉がたくさんあります.ここでは,その言葉を紹介していきます.しかし,言葉そのものより考え方を理解してください.もともとが英語なので翻訳は混乱しているところがあり,別の本を読むと違ったことが書いてあるかもしれません.それでも,考え方そのものはそれほど違わないはずです.

以降の内容は本誌を参照ください

インデックス

オブジェクト指向の前の話
 人間の頭ってそんなに良くない!?
 gotoは悪.でもなぜ?...

オブジェクト指向の考え方


今月号特集トップページへ戻る


Copyright 2002 石原 亘