ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

抽象化とは何か

導入

抽象化にはいろいろな種類がありますが、オブジェクト指向でもっとも特徴的な抽象化は「汎化」です。

用語
このトピックでは次の用語を覚えます:
  • 抽象化 (abstraction)
解説
すでにあなたもやっているはず、の「抽象化」

「変数」は抽象化されたものの一種です。変数の正体は、本当はメモリ上にある特定のサイズの記憶領域にすぎません。これを変数を使わずに操作するには、値がメモリ上のどこに格納されているのかとか、何バイト分の値なのかとか、各バイトがどういうレイアウトになっているのかを気にしなければなりません。そういう面倒くさいことを変数という仕組みが勝手に処理してくれます。変数によって、細かく煩わしいことから解放され、もっと抽象的で有意義な作業に没頭できるし、時間も節約できるわけです。

さらに、「変数に名前をつける」ということも、抽象化の一種です。変数に無意味な名前、たとえば V001, V002, ... というふうに、その内容が全く類推できない名前をつけるより、きちんと意味が通じる名前をつけたほうがわかりやすいですね。わかりやすい変数名をつけることによって、細かく煩わしいことから解放され、もっと抽象的で有意義な作業に没頭できるし、時間も節約できるわけです。

さらに、「関数」という仕組みや「関数に名前をつける」ということも、抽象化の一種です。関数の正体は、本当はメモリ上に展開されたプログラムにすぎません。関数という仕組みによって、特定のアドレスがエントリーポイントとみなされ、スタック中の値が引数とみなされ、特定のレジスタの値が戻り値とみなされたりします(自動的にそうなります)。また、関数に無意味な名前をつけるより、きちんと意味が通じる名前をつけたほうがわかりやすいですね。私たちは関数によって、細かく煩わしいことから解放され、もっと抽象的で有意義な作業に没頭できるし、時間も節約できるわけです(しつこいですが)。

さらに、「型に名前をつける」ということも・・・、しつこいので、このへんでやめておきます。ともかく私が言いたかったのは、プログラミング言語というのは抽象化のかたまりだということです。そして、抽象化を自由に操れる技能に長けた人ほど高度なソフトウェアを生産できるということです。

さて、ここまではオブジェクト指向以前のはなしです。オブジェクト指向にはもっと大事な抽象化があります。

オブジェクト指向の「抽象化」

そもそもオブジェクト指向は、より人間に近い考え方、すなわち抽象化をソフトウェア開発に適用しようという方法論です。システムをオブジェクトの集まりとみなすことも、あらゆるオブジェクトがクラスに属することも、クラス毎に振る舞い(メソッド)を持つことも、オブジェクト同士がメッセージで通信することも、クラスが階層構造を形成することも、どれをとっても抽象的ですね。

「抽象化」という言葉はそれ自体とても抽象的で、いろいろなことを連想させます。が、実は、オブジェクト指向で「抽象化」と言ったらだいたい「汎化」のことです。

余談ですが、このサイトの内容があまりに抽象的で、「具体的なプログラミングの方法が全然説明されていないじゃないか!」といらついている読者が多いのではないかと、私は少し心配しています。もう少し具体的な方法についてもあとで解説する予定ですが、どんな本にでも載っていることをここで説明しようとは思っていません。コーディングの詳しい方法が知りたければ、C++ や Java の文法について書いてある本を買ってきて読んでください。私はその本に載っていないことをお話しします!

さて、「汎化」について説明します。新しくクラスを作るときのことを想像してみてください。このときのシチュエーションは2通り考えられます。

  1. すでにクラス階層があって、そこに新しいクラスを追加できそうだ
  2. ちょうど良いクラス階層が存在しない

1番目の場合にどうするかは既に説明しました。この時は、すでにあるクラスの「特別バージョン」をサブクラスとして定義するので、こういう方法を「特化」と呼びます。

2番目の場合は、これから作ろうとしているクラスの機能の一部が他でも利用できそうなら、クラス階層を作ることになります。たとえば今作ろうとしているのが「タクシー」クラスなら、タクシーは乗用車の一種なので先に「乗用車」クラスを作ります。そうしておけば、あとで「トラック」クラスを作るのが楽になるわけです。あるクラスのより一般的なバージョンを作っているので、こういう方法を「汎化」と呼びます。

「汎化」は必要なだけ繰り返し適用されます。乗用車は乗り物の一種だから「乗り物」クラスを作って、乗り物は機械の一種で・・・、というぐあいです。汎化をどこまでやるかの判断基準は、そうすることによって後で楽ができるかどうかです。やりすぎて逆効果にならないように注意しましょう。

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)