ARCHIVES
アーカイブス
アーカイブス

オブジェクト指向についての五つの疑問に答えます

日経BP 日経ソフトウエア2001年1月号より2002年1月号に「オブジェクト指向は難しくない」として連載

平澤 章
2002年01月01日
※内容は公開当時のものです

皆さん,はじめまして。縁あって今月から"オブジェクト指向"をテーマに連載記事を書くことになりました。これまでオブジェクト指向がよくわからなかった方たちでも,「なーんだ,そういうことだったのか」と納得していただける内容を目指します。よろしくお願いします。

オブジェクト指向ってなんだ?

さて,皆さんは「オブジェクト指向って一体なんですか?」と聞かれたらどう答えるでしょう。ちなみに本誌2000年10月号の用語集には,「オブジェクト指向とは,オブジェクト(もの)のあり方に注目して,データとその機能を一体化して扱う手法」と書かれています。うーん,何のことやら,という感じですね。またオブジェクト指向というと,継承やカプセル化,ポリモーフィズムといったキーワードが必ず出てきます。しかし,いきなりこれらの用語を説明されたって,何にも予備知識のない人にはさっぱりわからないでしょう。「だからオブジェクト指向って,とっつきにくい」とか「勉強しても挫折しそう」なんて声が聞こえてきそうです。これを読んでいる皆さんの中にも,そういう思いを持っている人は少なくないかもしれません。

試しにオンライン書店アマゾンのサイト(http://www.amazon.co.jp)で,「オブジェクト指向」をキーワードに書籍を検索してみてください。筆者がやってみたら,なんと450冊以上もの書籍が見つかりました。それらのタイトルを眺めてみると,以下のように実にたくさんのキーワードが散りばめられていることがわかります。

UML,デザイン・パターン,Java,C++,Ruby,モデリング,フレームワーク,Delphi,CORBA,DCOM,ActiveX,Smalltalk,分析/設計,方法論,オブジェクト指向データベース,画像処理,クラスライブラリ...

まるで,ソフトウエア開発に関する用語のオンパレードみたいですね。これでは,一口にオブジェクト指向といっても混乱するばかりです。そこで今回は,オブジェクト指向をもっと大局的に理解するために,次の五つの切り口(疑問)を用意しました。

  1. オブジェクト指向技術は普及している?
  2. オブジェクト指向技術の習得は難しい?
  3. オブジェクト指向技術による開発は従来とどう違う?
  4. オブジェクト指向技術を採用すれば生産性は向上する?
  5. オブジェクト指向技術を採用するとソフトウエアの実行性能(パフォーマンス)が悪くなるって本当?

以降は,これらの疑問それぞれについて,筆者なりの考えを紹介したいと思います。これらの疑問を解き明かせば,きっと「オブジェクト指向とは何か」ということを理解するヒントになると思います。「オブジェクト指向なんてわかっている」という方も,ぜひ一緒に考えてみてください。

疑問1 オブジェクト指向技術は普及している?

この質問に対して「普及していると思う」と答える人の割合はどのくらいでしょうか? 多くの人は「オブジェクト指向なんて自分には関係ないさ」と考えているかもしれません。もしかしたら,低いことでは定評のある(?)どこかの国の内閣支持率にも負けてしまうかもしれません。しかし筆者は断言します。

「オブジェクト指向技術は完全に普及段階に入っており,その流れは今後も止まらない」 まず,皆さんの周りをよーく眺めてください。「ほら,周りはオブジェクト(=もの)ばかりでしょ?」というのはつまらないオチでしたね。失礼しました。さて気を取り直してもう一度。皆さんが使っているコンピュータの中をよーく眺めてみてください。「ほらね,オブジェクトだらけでしょ?」といってもやっぱりわかりませんね。再び失礼しました。しかし実際は,私たちが意識する,しないにかかわらず,現在のコンピュータの中はオブジェクト指向技術だらけになっているのです。

例えば開発言語を取り上げてみましょう。皆さんは普段,どんな言語を使っていますか? Java? C++? Visual Basic(VB)? Delphi(Object Pascal)? Ruby?...これらはすべて「オブジェクト指向言語」と呼べるものです。つまり,言語体系の中に,オブジェクト指向のエッセンスが取り込まれている,というわけです。「いや,VBは違うだろ?」----確かにVBをオブジェクト指向言語と呼ぶことに,違和感を覚える人は多いかもしれません。しかしVBには,現バージョンでもクラス・モジュールという立派なオブジェクト指向の機能があります。ですから,VBもオブジェクト指向言語の一つだと考えて差し支えないでしょう。次期版のVisual Basic.NETでは,継承機能も使える,本格的なオブジェクト指向言語に変身することが明らかになっています(注1)。

これらの言語のうち,特にJavaはオブジェクト指向言語として有名です。Javaを使えばちょっとしたアプレット(注2)などを簡単に作って動かすことができます。またJavaは,サーバー・アプリケーションや携帯電話,家電製品などの領域にも用途が広がっていますが,その背後ではたくさんのオブジェクト(ソフトウエア部品)が裏方として動いています。そうしたソフトウエア部品群,例えばJ2EE(注3)やEJB(注4)などは,オブジェクト指向技術の結晶と言ってもよいでしょう。

さらに,RDB(リレーショナル・データベース)にODB(注5)の技術を取り込んだORDB(注6),通信技術のCORBA(注7),クラスライブラリのMFC(注8)やSwing(注9)など,現在のソフトウエア開発の多くの部分で,オブジェクト指向技術は中核技術になっている,と言えます(図1)。

図1

図1

とはいえ,「うーん,そうは言っても実感ないなあ」と思った方もいるかもしれません。確かに,開発言語やミドルウエアに比べ,一般のアプリケーション開発では,まだまだオブジェクト指向技術は脇役的な存在のようです。C++コンパイラをただのCコンパイラとして使っていたり,VBでもクラス・モジュールをいっさい使わなかったり...といった開発スタイルは珍しくありません。

しかし筆者は,こうした"非オブジェクト指向的開発"が今後いつまでも続くとは考えていません。開発言語やミドルウエアをきちんと使いこなすためには,それを支えるオブジェクト指向技術の理解が必須(ひっす)だからです。こうしたことから,今後はアプリケーション開発でもオブジェクト指向技術を活用するケースが多くなるでしょう。

疑問2 オブジェクト指向技術は難しい?

筆者の考えはこうです。

「オブジェクト指向が難しいというのはぬれぎぬだ!」

確かにオブジェクト指向には,覚えることがたくさんあります。クラス,カプセル化,継承,ポリモーフィズム,クラスライブラリ,フレームワーク,デザイン・パターン...など,わかりづらい言葉ばかりです。また「ものごとを抽象化する考え方が重要」などとも言われます。こんなことを聞くと,日常のプログラミング作業で忙しい人は,ますます煙たく感じるかもしれません。

しかし,そんなに難しい技術なら,どうしてオブジェクト指向は消えてなくならないのでしょう? この技術が登場してからすでに30年以上も経つそうですが(注10),消えてなくなるどころか,時間が経つにつれどんどん発展し普及してきています。それは疑問1で紹介した通りです。これは一体どういうことなのでしょう?

そう,真犯人は別にいるのです。その犯人とは,「ソフトウエア開発」そのものだと筆者は確信しています(図2)。

図2

図2

筆者もかれこれ15年以上,ソフトウエア開発の仕事をしてきました(年がバレますね)が,現在に至っても,つくづくこの仕事は難しいと感じます。そもそも作るものが直接目に見えるわけではありませんから,ユーザーの要求をきちんと理解するのは容易ではありません。しかもほとんどの場合,納期や予算はあらかじめ決まっています。さらに,進歩したとはいえコンピュータの能力は無限ではありませんから,パフォーマンスも気にしなければなりません。そんな状態ですから,バグの一つや二つは当たり前ですし,納期遅れや予算オーバーもしょっちゅうです。プロジェクトが途中でキャンセルされてしまうことさえ珍しくありません。それにもかかわらず,ユーザーの要求はどんどんエスカレートしています。システムはどんどん複雑でかつ大規模になりますが,納期は短く費用は安く...とあれもこれもが要求されます(注11)。

このような状況のなかでオブジェクト指向技術が消えるどころか普及しているのは,オブジェクト指向が「難しいソフトウエアを少しでも楽に開発するためのノウハウ集」だからです。オブジェクト指向技術の中には,部品化しやすいプログラム言語や,設計の定石集,それに再利用可能なソフトウエア部品などが含まれます。これらはどれも,過去の経験から得られた貴重なノウハウです。言わば「システム開発の虎の巻」と言ってもよいでしょう。たくさんの用語がはんらんしているのは,それだけ対象とする範囲が広いことの証拠でもあります。オブジェクト指向が難しい(と感じる)のは,それが対象とするソフトウエア開発自体が難しいことの表れなのです。「簡単にする」という志は高いものの,残念ながらまだ発展途上といったところでしょうか。

また,オブジェクト指向が抽象的というのも考えてみれば当たり前のことです。なぜならば,ソフトウエア自体が,目に見えない抽象物なのですから。

疑問3 オブジェクト指向は従来の開発とどう違う?

これはちょっと答えにくい質問です。「従来のやり方」をどう考えているかにもよりますが,あえて言うなら

「本質的な違いはない。開発の目標が増えただけ」 と筆者は考えています。

一般的によく言われるのは,以下のようなアプローチの違いです。

  • 従来は,システム全体の機能を徐々に分割していくトップダウン・アプローチだったが,オブジェクト指向では小さな部品を作りながら全体を組み上げていくボトムアップ・アプローチである
  • 従来の手法では「機能中心」だったが,オブジェクト指向では「もの(=オブジェクト)中心」である

この説明は,当たっている点もありますが,筆者には今ひとつしっくりしません。なぜなら,従来のやり方でも共通サブルーチンを見つけるボトムアップの視点が必要でしたし,反対にオブジェクト指向でも,外部仕様をきちんと確認したり,全体をサブシステムに分割したりするトップダウンの視点は重要だからです。したがって,こうしたアプローチの違いでは両者の違いをうまく説明できません。

違いをあえて一言で言うならば,それが目指す目標ではないでしょうか。つまり従来の手法は,要求された機能を実現して「きちんと動くソフトウエアを作ること」が最大の目的でした。しかしオブジェクト指向開発では,さらに「保守性と再利用性を向上させること」という目標が追加されています。ここで重要なことは目標が「変わった」のではなく,「追加された」という点です。オブジェクト指向であっても従来からの優れた技術はそのまま生き残っており,消えてなくなったわけではありません。このため,CやCOBOLを使っていたときでも保守性や再利用性を向上させようと何らかの工夫してきた人にとっては,オブジェクト指向は受け入れやすいはずです。なぜならオブジェクト指向技術は,過去に同じような人たちが工夫してきたノウハウだからです。反対に保守や再利用性をあまり考えず,要求された機能通りに動けばよいと考えてきた人にとっては,オブジェクト指向は大きなギャップを感じることでしょう。「オブジェクト指向の習得には発想の転換が必要だ」などと言われることがありますが,転換すべき発想は案外こんなところにあるのかもしれません(図3)。

図3

図3

疑問4 オブジェクト指向技術を採用すれば, 開発の生産性は向上する?

「もちろんイエス!」

でしょう。今や生産性を向上させるためには,オブジェクト指向は必要不可欠な技術です。反対に生産性を上げようと何らかの工夫をすると,自然とオブジェクト指向になるはずです。

しかし「じゃあ,一体どれくらい向上するのですか?」と聞かれると,根が真面目な筆者としては少々答えに詰まってしまいます。こういうときにあまり深く考えずに「5倍ぐらいですね!」などと胸を張って言える性格だったら,もっと気楽な人生を送れたかもしれません。

これまで筆者はシステム開発をするたびに,プログラムの規模と,それに要した費用や作業量などを調べてきました。

しかしそれでも,オブジェクト指向でどれくらい生産性が良くなるかはわからない,というのが正直なところです。

理由の一つは,オブジェクト指向技術があまりに多岐にわたっていることです。いったい何をどこまで採用したらオブジェクト指向をやったと言えるのか,実際のところよくわからないのです。また二つ目の理由としては,技術以外の要素が生産性に大きく影響することです。これは担当者のスキルや経験であったり,リーダーの管理能力だったりします。また個人のやる気やチームワークの良さなども無視できません。したがって残念ながら筆者には,オブジェクト指向でどれくらい生産性が良くなるのかはわかりません。それでも,もしオブジェクト指向技術を使わなかったら,開発生産性がかなり落ちたであろう,ということは断言できます。

生産性についてはもう一つ付け加えておくべき重要なことがあります。それは漫然と個々の技術を使っただけでは,けっして効果は出ない,ということです。先ほど生産性を上げるためにはオブジェクト指向は不可欠だと述べましたが,実はこの反対は必ずしも成り立ちません。つまりオブジェクト指向技術を見よう見まねで使っただけでは,生産性は上がらない,ということです。しょせんオブジェクト指向は道具(ツール)なのだ,と割り切るべきでしょう。使う人がその道具をどういう目的で,どういう場面で使うかによって,結果は大きく変わってしまうわけです。この点について,オブジェクト指向関連に詳しいソフトウエア・デザイナ兼ライターの,επιστημη(えぴすてーめー)氏による名言があります(注12)。

----オブジェクト指向を使えば生産性が上がると思ってるおかたが少なからずいらっしゃるようですが,それはとんでもないマチガイです。「オブジェクト指向を使えば生産性が上がる」のではありません。「オブジェクト指向を使って生産性を上げる」のです。

疑問5 オブジェクト指向技術を採用するとソフトウエアの実行性能(パフォーマンス)が悪くなるって本当?

これもなかなか微妙な質問です。あえて一言で言うならば,

「パフォーマンスは若干悪くなるが,ハードウエアが進歩した現在ではほとんど気にする必要がない」 といったところでしょうか。

オブジェクト指向は,主に保守や再利用をしやすくするための技術ですから,パフォーマンスの良しあしとは,直接関係がありません。しかし「二兎を追うものは一兎をも得ず」のたとえ通り,保守性や再利用性と,パフォーマンスの間にはある程度のトレードオフがあります。

具体的な例を挙げましょう。一般的に,オブジェクト指向言語で書かれたアプリケーションでは,実行時に必要なメモリーを確保したり,関数テーブルを介して関数を呼び出したり,といった動作が多くなります。したがって,そうでない場合に比べると,パフォーマンスはその分だけ悪くなります。しかし10年前,20年前ならいざ知らず,ハードウエアが進歩した現在では,この程度の問題はほとんど気にする必要はないでしょう。

ビジネス・アプリケーションならば,パフォーマンスの考慮として,次のことぐらいに気をつけておけば,一般的には十分と考えられます。

  • データベースの構造やアクセス方法が適切か?
  • スレッドやプロセス,データベースのコネクション,といったシステム資源の使い方は適切か?
  • 何万回,何十万回もループするようなロジックの中に無駄なコードが書かれていないか?

実際にパフォーマンス上の問題が起きた場合でも,上記に該当するような一部のコードを修正するだけで,全体のパフォーマンスは劇的に改善するものです。その他の部分についてのパフォーマンス改善は多くの場合,全体から見れば小さなものですから,それよりも保守性や再利用性の向上を優先させるべきでしょう。

まとめ 結局,オブジェクト指向とは?

さて,いろいろと述べてきましたが,ここでもう一度,冒頭の「オブジェクト指向って一体なんですか?」という質問について,考えてみましょう。筆者ならこう答えます。

「オブジェクト指向とは,品質が高く,理解が容易で,保守しやすいソフトウエアを開発するための技術やノウハウの総称である」

こう考えると,プログラム言語,分析/設計手法,プロジェクト管理手法,デザイン・パターン,クラスライブラリ,UML,CORBAなど多くの技術が「オブジェクト指向」という枠組みの中に入っていることの説明がつくのではないでしょうか。

オブジェクト指向は,最初はプログラミング言語からスタートしました。その後さまざまなアイデアや仕組みがつけ加えられてどんどん発展し,今日のような広がりを見せました。今後もしばらくは,オブジェクト指向を軸にソフトウエアの開発技術は発展していくでしょう。したがってソフトウエア開発をずっと続けていこうと考えている人にとっては,欠かすことのできない技術と言えるでしょう。

では,この技術をどうやって勉強すればよいでしょうか? 「この連載を読み続けてください」というのは冗談として,まずはプログラミングをきちんと理解しておくことが重要です。実際にJavaなどを使ってコードを書き,デバッガを使って動かしながら,クラス,継承,ポリモーフィズムなどの仕組みを体感するのが一番手っ取り早い方法です。そのうえで,UML,デザイン・パターン,分析/設計手法と進んでいくのがおすすめのコースでしょう(図4)。実際,この連載もこの順序に沿って進めていく予定です。

図4

図4

とはいえ,"形"から入ることも重要ですが,やっぱり最後は皆さんの"意志"です。それは,問題意識を持って,生産性や保守性,あるいは再利用性を向上させようとする意志であり,そのために工夫をすることだと思います。そういう人にとっては,オブジェクト指向が提供するさまざまなノウハウや仕組みがまさに宝の山となるでしょう。反対にそうした意識をあまりせずにソフトウエアを書いてきた人にとっては,オブジェクト指向は,わかりづらく使いづらいただのガラクタ箱に見えることでしょう(図5)。 ☆☆☆

図5

図5

いかがだったでしょうか? 次回は,オブジェクト指向にまつわる用語を整理する予定です。より具体的にオブジェクト指向の全体像がつかめると思います。

ご意見,ご要望のある方は,info@ulsystems.co.jpまで,ぜひメールをお送りください。

  • 注1:米Microsoftは,オブジェクト指向技術を非常にうまく使いこなして自社製品に取り込んでいる会社だと,筆者は感じています。
  • 注2:アプレットは,ネットワークを通じてWebブラウザにダウンロードされて実行されるJavaプログラムのこと。
  • 注3:J2EE(Java2 Platform Enterprise Edition)は,Java言語を使ってサーバー・アプリケーションを構築するためのプラットフォーム仕様。
  • 注4:EJB(Enterprise JavaBeans)は,サーバーで利用されるJava部品プログラムの仕様。
  • 注5:ODB(Object Oriented Database:オブジェクト指向データベース)は,オブジェクト指向技術を使ったデータベース。
  • 注6:ORDB(オブジェクト指向リレーショナル・データベース)は,ODBの技術で拡張したRDB。
  • 注7:CORBA(Common Object Request Broker Architecture)は,標準化団体OMG(Object Management Group)が定めた,分散オブジェクト通信技術の仕様。
  • 注8:MFC(Microsoft Foundation Classes)は,マイクロソフトが提供するWindowsアプリケーションを開発するためのC++用クラスライブラリ。
  • 注9:Swingは,Javaアプリケーションを開発するためのグラフィックス用クラスライブラリ。
  • 注10:1967年に北欧で開発されたSimula(シミュラ)という言語がはじめてのオブジェクト指向言語だそうです。
  • 注11:こうしたユーザーには,パソコンや携帯電話を使って,少しでも便利な生活をしたいと考えている私たち(開発者)自身も含まれています。
  • 注12:「επιστημηのオブジェクト指向的日常」επιστημη(えぴすてーめー)著,翔泳社,の30ページより引用。
アーカイブス一覧へ