オブジェクト指向分析,オブジェクト指向設計,オブジェクト指向プログラミング---ソフトウエア開発の分野で「オブジェクト指向」という言葉が頻繁に使われるようになってから10年以上になる。しかし,熱烈な信者がいる一方で,「オブジェクト指向なんて何の役にも立たない」とまで言う人も少なくない。実際,開発の現場でもこれらの手法が十分に浸透しているわけではないようだ。

 オブジェクト指向懐疑論者の言い分はこうだ。

 まず,オブジェクト指向分析/設計で,何をクラスにすればよいのかを簡単に決める方法がない。オブジェクト指向開発では,プログラムをクラスに切り分けてしまえば,後の作業は機械的に進めることができる。ところが,このクラスをどう切り分けるかが難しい。「名詞の抜き出し」といったよく知られた手法に頼っているだけではだめで,やはり設計者の腕が重要になる。

 二つ目は,言われているほど再利用性が高くないこと。オブジェクト指向開発では,派生によって既存のクラスを再利用できるというのが「売り」の一つだ。が,将来どのような状況で利用されるのかまったく予想できないようなクラスのインタフェースを適切に設計することは非常に難しい。先のことを考えてクラスを作ったつもりでも,いざそれを再利用する段になると,たいてい手を加える必要が生じてしまう。用途がかなり限定されるものであればともかく,汎用的なライブラリなどを設計できるエンジニアは,おそらく1000人に1人といったところだろう。

 ただ,ここで気を付けてほしいのは,これらの問題がいずれもエンジニアの習熟度に起因するものであって,オブジェクト指向という方法論自体によるものではないことだ。

 オブジェクト指向的手法を使うにせよ,そうでないにせよ,開発したプログラムの質がエンジニアの技術に依存することは変わらない。強いて違いを挙げれば,オブジェクト指向的な手法のほうが開発者の経験による差が表れやすいということだ。実際,オブジェクト指向開発が浸透しない最大の理由は,「できるエンジニアが少ない」というのが正直なところだろう。

 確かに,オブジェクト指向に則ったプログラムを組めるようになるには,ある程度の経験が必要だ。言葉ではうまく説明できないのだが,オブジェクト指向開発と従来の開発手法には「思考方法の違い」のようなものが存在する。こうした思考のしかたが身につくまでには,それなりに時間かかるのはしかたがない。ただ,いったん身につけてしまえば,それまで「関数をどう切り分けるべきか」などと悩んでいたものが,非常にすっきりと見えてくるようになる。

 ちなみに最近担当した日経ソフトウエアのDirectXの特集では,C言語のプログラマにも理解できるよう,久しぶりにクラスを使わずにゲームを作ってみた。

 ところが,プログラムはそれほど長くない(1000行強)にもかかわらず,ファイルや関数の切り分けがなかなか決まらない。結局,後からメンバー関数をグローバルに変更することにして,とりあえずクラスの切り分けを考えてみたところ,数十分で構成を決定できた。プログラムの規模が小さいとはいえ,改めてオブジェクト指向的な手法のありがたみを実感した次第だ。

 月並みな意見になってしまうが,これからシステム開発にオブジェクト指向的な手法を取り入れてみようという場合は,以下の2点に注意してほしい。

 一つは,「オブジェクト指向だから生産性が高い」「オブジェクト指向だから再利用ができる」といった言葉に過度の期待を抱かないこと。冷静な目で眺めてみれば,きっとメリットを実感できるはずだ。もう一つは,分析/設計にはできるだけ経験豊富なエンジニアを使え,ということだろうか。

(山本 哲史=日経ソフトウエア)