オブジェクト指向も分割統治

図3●オブジェクト指向の基本アイデア
データを中心に据え,それを変更できるのはそのオブジェクトのメソッドだけに限定する。ほかのオブジェクトとの連携にはメッセージ送信を使う。メッセージを受け取ったオブジェクトがそれに応じて何らかの動作をし,必要に応じて自分が持つデータを書き換える。このようにしてオブジェクト同士が連携することによりシステムが動作する。

 さて,オブジェクト指向も基本は分割統治である。構造化とは違う観点で,プログラムの分割を可能にした。構造化アプローチがあくまでも「機能」あるいは「手順」を基に分割するのに対し,オブジェクト指向ではデータに基づいて分割する(図3[拡大表示])。これが「発想の転換を強要する」と言われるポイントだ。ただしオブジェクト指向は,構造化アプローチの考え方を内包しているので,新しい分割の単位が加わった,と考えてもいいだろう。

 オブジェクト指向の基本的な考え方は,データとそれに対する操作(メソッド)をひとまとめのモジュール(オブジェクト)として分離・独立させることにある。外部からそのデータを操作したいときは,そのオブジェクトに処理を依頼する。これが「メッセージ」である。メッセージは単なるメソッド呼び出しとは本来違うものである。ただプログラミング言語の実装上,同じメソッド名でも引数によって振る舞いを変えるので,メソッド呼び出し=メッセージとなっている。

現実に近いモデル化が可能

 もう一つの重要なポイントが,現実に近いモデルに基づいてシステムを設計できることだ。現実に存在するモノをそのまま,オブジェクトとして定義する。例えば伝票。伝票の記入用紙がいわばクラスである。そして起票した個々の伝票がオブジェクトということになる(図4[拡大表示])。伝票に付随する情報(起票者,取引先,部門名,科目,金額など)がオブジェクトの属性,伝票に対する処理(記入や押印,回送など)がメソッドということになる。このように複雑な構造を持つ情報をそのまま「オブジェクト」として定義できるので,うまくいけばとても見通しのよいデータ構造を確立できるのだ。

 オブジェクト指向にはもう一つ,「継承」という仕組みがある。これも現実に近いモデルを作るのに有効なものである。伝票には現金伝票や支払伝票などいくつか種類が存在する。基本的な操作や要素は共通だが,微妙な違いがある。継承を使えば,こういった関連性があるものを体系立てて整理できる。

 継承は基本的に,定義済みのモジュールの差分を拡張して記述して,新しいモジュールを作り出すことである。このことを「差分プログラミング」と呼び,再利用性の中核のように言われていた時期もあったが,継承が重要なのは差分の定義だけで済むことにはない。むしろ現実に近いモデルを作る際に有効な手段である。通常ものごとを体系立てて整理する際には,類似性に注目する。何らかの基準に基づいて類似性を引き出すか,あるいは類似しているモノから共通の構造を抽出して体系づけることになる。こう説明するといかめしく聞こえるが,例えば生物の分類を考えてもらいたい。生物は大きく動物と植物に分類される。その中で構造の類似性から「綱」「目」「科」などに分類していく(図5[拡大表示])。このように,物事を分類するのにある基準に則って一つの体系で整理していくのはごく自然なことだ。

図4●現実に近いデータ定義を可能にする
例えば伝票のように具体的に存在するモノは,オブジェクトとしてほぼ1対1の関係で定義できる。
 
図5●生物の分類は類似性に基づく継承構造
物事の分類には階層的な分類構造が使われる。これも現実に即したモデル作りに貢献している

 継承を使うのは,情報,特にコードの重複を避けるためである。同じことを実行するのに,複数個所で同じ記述をするのは冗長であり,無駄な手間がかかる。しかも単に冗長なだけでなく,後々のバグの温床となる。万が一複数個所でロジック的なバグが発覚したら,それをすべての場所で修正しなければならない。修正漏れの危険があるし,修正ミスする可能性も高まる注6)。継承をうまく使えば,変更個所を1カ所に集中できるのだ。

「なぁるほどぉ。やっぱりオブジェクト指向って,すごいんですね」
「うん。正しい方向の進化であることは間違いないよ」
「でも,普及に時間がかかったわけですよね」
「発想の転換には時間がかかるからね。それにいいことばかりじゃあない,ってことかな」

(北郷 達郎、八木 玲子)