PR

 最近になって、オブジェクト指向に関するセミナーの依頼をよく受けるようになりました。

  • 部課長クラスを対象に、オブジェクト指向の全容を理解させてほしい(2時間コース)
  • 中堅エンジニアを対象に、UMLを使った分析・設計技法を指導してほしい(2日間コース)
  • 新人プログラマを対象に、オブジェクト指向らしいプログラミングスタイルを教えてほしい(5日間コース)
など、対象者と内容は様々です。オブジェクト指向は、1970年代からある技法です。決して新しいわけではありません。それなのに、なぜ今になってオブジェクト指向が流行りだしたのでしょう? この疑問に対する答えも含め、2時間コースのセミナーの概要を、Web上で再現させていただきます。

 最初に、皆さんに質問します。オブジェクト指向とは、何でしょう?...「プログラムの部品化のことだ」「効率的にプログラムを作れる技法だ」「コストを削減できる技法だ」「大規模システムの開発に適した技法だ」...いろいろな意見が出ましたね。どの考えが正しいのでしょう。オブジェクト指向の考案者の考えが正しいに決まっています。

 それでは、オブジェクト指向の考案者は誰でしょう。これに関しても、いろいろな意見がありますが、私は、アラン・ケイ(Alan Kay)だと思います。なぜなら、アラン・ケイは、オブジェクト指向への貢献で、チューリング賞を受賞しているからです。チューリング賞は、アメリカのコンピュータ学会であるACM(the Association for Computing Machinery)が、年に1人(または1グループ)を選んで与える賞で、コンピュータ界のノーベル賞と呼ばれるほど権威があります。オブジェクト指向でチューリング賞を受賞しているアラン・ケイは、オブジェクト指向の考案者と呼ぶにふさわしい人物でしょう。

 アラン・ケイが来日した際のインタビュー記事が、IT Proにあります。インタビューアは、私たちが最も知りたいことを聞いてくれています。「どのようにしてオブジェクト指向を思い付いたか?」です。その答えは、「普通の人がコンピュータについて考えるようなことではなく、生物がどのようにして複雑な構造を作るかを考えた」です。

 アラン・ケイは、コンピュータ界のレオナルド・ダ・ビンチと呼ばれるほど多才な人です。コンピュータだけでなく、生物学や音楽にも長けています。そんなアラン・ケイが、コンピュータのことを一切考えずにオブジェクト指向を考案したのです。生物が構造を作るようにプログラムを作ると言っています。どんな意味なのか、イメージできますか? 私のような凡人には、ほとんどイメージできません。生物の細胞がお互いに情報を交換し合っている構造を、そのままプログラムで実現するという意味だと思いますが、それがいったい何の役に立つのかわかりません。

 オブジェクト指向プログラミング言語であるJavaを勉強したばかりの新人プログラマから、よく聞かれることがあります。それは、「私が作ったJavaプログラムは、オブジェクト指向らしいでしょうか?」です。プログラムが目的どおり動作するなら、それでいいじゃないかと思いますが、新人プログラマ君は、どうしても気になるようです。そんなとき、私は、アラン・ケイの言葉を引用して答えています。「プログラムを作るときに、生物の構造をイメージしていたならオブジェクト指向らしいよ」と。それを聞いた新人プログラマ君は、キョトンとしています。

 アラン・ケイの考えがわかり、同氏が考案したオブジェクト指向プログラミング言語であるSmalltalkを使いこなせる人たちを俗に「Smalltalker(スモールトーカ)」と呼びます。私の友人の中に、1人だけSmalltalkerがいます。P氏です。ある日、P氏と「プログラムは、何からできているか」という議論をしたことがあります。私の答えは、「プログラムは、処理とデータからできている」です。プログラムの中で、処理は関数で表され、データは変数で表されます。一方、P氏の答えは、「プログラムは、オブジェクトとメッセージからできている」です。

 私が「関数と変数をまとめたものがオブジェクトであり、関数を呼び出すことをメッセージパッシングと呼ぶのだろう」と聞くと、P氏は「そうだけど、ちょっと違う。関数と変数ではなく、オブジェクトの振る舞いと属性だ」と答えます。これで、何となくわかりました。私とP氏には、同じ対象を見ても、感じるイメージが違うのです。断っておきますが、私は、オブジェクト指向がきらいなわけではありません。どちらかと言うと、好きな方です。ただし、残念ながら、Smalltalkerのようなイメージでプログラムを見ることができないのです。

 プログラミング言語を切り口にして、オブジェクト指向の歴史を振り返ってみましょう。世界初のオブジェクト指向プログラミング言語と言われているのは、1967年に開発されたSimula67です。関数と変数をまとめる言語構文があったからです。1972年にアラン・ケイによってSmalltalkが開発され、ここで始めて「オブジェクト指向」という言葉が登場しました。当時は、ほんの一部の人だけがオブジェクト指向を理解し、Smalltalkを使いこなせました。これを第1次オブジェクト指向ブームと呼ぶことにしましょう。

 オブジェクト指向が広く普及したのは、1983年にC++というオブジェクト指向プログラミング言語が開発されたことがきっかけです。実は、私も、C++を通して初めてオブジェクト指向を知りました。C++は、従来からあるC言語にオブジェクト指向を実現するための言語構文を追加したものです。

 当時の私は、マイクロソフトのMS-Cというコンパイラ(プログラムを作るツール)を使っていました。確か、MS-CがVer.6かVer.7にバージョンアップするとき、勝手にC++になってしまったのです。C++は、C言語と下位互換性があり、C言語のプログラムもそのままコンパイルできるとのこと、それなら安心とバージョンアップを申込んだのですが、届いたパッケージを見て驚きました。横幅50cmぐらいあるパッケージの中に、フロッピーディスク約20枚と分厚いマニュアルが10冊ぐらい入っていたのです。従来のC言語のパッケージなら、フロッピーディスク5枚とマニュアル3冊ぐらいのものです。

 膨大なフロッピーディスクとマニュアルの内容はなんだったと思いますか。クラスライブラリを収録したフロッピーディスクと、その説明のマニュアルです。クラスライブラリとは、様々なプログラムを作るために利用できるプログラム部品群のことです。マイクロソフトのクラスライブラリは、MFC(Microsoft Foundation Classes)という名前でした。クラス≒オブジェクトだと考えてください。クラスというプログラム部品が、メモリにロードされた状態をオブジェクトと呼びます。

 クラスライブラリの使い方を覚えるのは大変ですが、一度覚えてしまえば、プログラムを効率的に開発できるでしょう。ただし、特定のメーカーのクラスライブラリに慣れてしまうと、そこから離れられなくなります。つまり、コンパイラメーカーにとって、C++とクラスライブラリは、長くお付き合いしてくれる優良なお客様(プログラマ)を獲得する絶好の手段になのです。オブジェクト指向が、ビジネスに結び付きました。これを第2次オブジェクト指向ブームと呼ぶことにしましょう。

 1995年にJavaが登場します。当初のJavaは、Webブラウザだけあればいいという戦略で、Windowsを凌駕することを目標にしていましたが、成功しませんでした。Java2にバージョンアップしたとき、Javaは、Webサーバー側で実行されるプログラムを構築するクラスライブラリに重点を置くようになりました。高度なWebシステムを効率的に開発できますよ、というわけです。この戦略は成功し、Javaが大いに普及しました。Javaは、Windows環境でもLinux環境でも利用できます。

 Javaに負けてなるものか。2000年にマイクロソフトは、.NET(ドットネット)を発表します。Javaと同様に、.NETも膨大なクラスライブラリを提供しています。Javaとの違いは、.NETでは、C#やVisual Basic .NETなど複数のプログラミング言語が利用できることです。.NETは、基本的にWindows環境だけで利用できます。マイクロソフトの主力商品は、何たってWindowsだからです。

 現在は、Javaがやや優勢で、.NETが追い上げを見せています。これを第3次オブジェクト指向ブームと呼ぶことにしましょう。

 これで、今になって、なぜオブジェクト指向が騒がれているかがわかったでしょう。ビジネスの変化が速い現在、システムの納期がとても短くなっています。3ヶ月なんて納期もザラにあります。それでいて要求されるのは、Webシステムです。Webシステムを開発するには、GUI、データベース、ネットワーク、セキュリティ、...つまりコンピュータ技術のすべてが要求されます。Webシステムは、コンピュータ技術の集大成なのです。それを短納期で開発するには、プログラムをすべて手作りしていたのでは間に合いません。メーカーが提供するプログラムの部品群、すなわちクラスライブラリに頼らざるを得ないのです。

 Javaも.NETも、オブジェクト指向の開発環境です。オブジェクトによって、複雑なシステムの構造が作られます。「それならオブジェクト指向を理解しなくちゃ!」というわけで、皆さんは、このセミナーに参加されたのでしょう。考案者がどう考えていたとしても、現在のオブジェクト指向は、他人(メーカー)が提供するクラスライブラリを使うということがポイントになっています。

 それでは、皆さんに現代版オブジェクト指向に適正があるかどうかチェックしてみましょう。「他人が作ったプログラム部品を使うことに対して、どう感じますか?」以下の5つの中から答えてください。すでにおわかりのことと思いますが、番号が大きいほど、現代版オブジェクト指向に適正があると言えます。私は、2の「やや嫌な感じがする。ちょっと心配だ」です。つまり、私は、現代版オブジェクトに適正がないのです。皆さんは、どうですか? どうやら、4と5の人が多いようですね。安心しました。皆さんには、適正があります。

 別の角度から、オブジェクト指向とは何かを説明しましょう。オブジェクト指向とは、何でしょう? という問に答えるには、オブジェクト指向でないものと比べればよいのです。私は、ときどき大学で教鞭をとっています。大学の情報工学風に説明すると、システムの分析・設計には、大きく分けて3つの技法があり、その1つがオブジェクト指向です。

 3つの技法とは、処理に重点を置く「POA=Process Oriented Approach」、データに重点を置く「DOA=Data Oriented Approach」、そしてオブジェクトに重点を置く「OOA(Object Oriented Approach)」です。OOAがオブジェクト指向です。

 データに重点を置くDOAでは、関係するデータの集まりを「エンティティ」としてまとめます。たとえば、「顧客エンティティ」なら、顧客名、住所、電話番号、FAX番号、メールアドレスなどをまとめたものです。OOAすなわちオブジェクト指向は、DOAの発展形だと言えます。エンティティに処理を追加したものがオブジェクトだと考えられるからです。

 POA、DOA、OOAは、あくまでも学術的な分類です。学問というものは、社会の仕組みや自然現象を体系化するのが好きなのですね。実際の開発の現場では、POA、DOA、OOAのどれか1つだけを選んでいるわけではありません。対象に合わせて使い分けたり、複数の技法をミックスして使っています。学問は目安です。知識の引き出しです。

 POA、DOA、OOAそれぞれで、よく使われる図があります。POAではDFD(Data Flow Diagram)、OOAではERD(Entity Relationship Diagram)、そしてOOAではUML(Unified Modeling Language)です。同じ対象に対して、どの技法を使うこともできます。要は、開発者の好みの問題というか、対象がどのように見えるかの違いです。

 例として、コンピュータとユーザーが「じゃんけん」するプログラムを作るとしましょう。POA、DOA、OOAのどれでもアプローチできます。皆さんには、じゃんけんがどのように見えますか? 私は、何たってDFDで示されたPOAです。こんな私が講師で、本当にごめんなさい。

 まとめです。皆さんが会社に戻られたら、開発チーム内で、オブジェクト指向について話し合う場を設けてください。いくつかテーマを挙げておきましたので、開発チーム全員の意見を聞いてみてください。そうすることで、オブジェクト指向を効果的に実践するヒントを見出せるはずです。セミナーにご参加いただきありがとうございました。