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

空間軸でつくる!

システムを設計するとき、現在最も多く使用されている手法はおそらく「モジュール分割」です。この手法では、まずシステムに要求される機能をすべて洗い出すことからはじめます。作るべき機能が全部リストアップできたら、今度はそれぞれの機能の詳細を明らかにしていきます。

関連性の高い機能はひとまとめにして、モジュールにします。結果、システムはいくつかのモジュールに分割されます。一般に、モジュール内の各機能の関連性が高く(=モジュール強度が強く)、他のモジュールへの依存度が低い(=モジュール結合度が低い)程良い設計といえます。

残念ながら、モジュール分割は非常に難しい手法です。大きなシステムをこのやり方でうまく設計するには、圧倒的な才能が必要になってしまいます。うまく設計された例を、わたしは見たことがありません。細かい話は省きますが、モジュール分割には次のような弱点があるのです。

  • 修正、追加が困難である(しかし、修正や追加は常に発生する!)
  • 修正のたびにシステムが肥大化し、複雑化する傾向がある(そして手に負えなくなる!)
  • コードの再利用が難しい
  • 上流工程で機能の洗い出しを完了しなければならない(ほとんど不可能!)

経験的に言えることですが、モジュール分割では「まずああして、次にこうして…」と時間軸に沿ったコーディングに陥りがちです。新しい機能が増えるごとにアルゴリズムの分岐点も増えて、手に負えない迷路のような状態になっていきます。

はじめのうちはモジュールが適切に分割されていたはずなのに、修正を重ねていくうちにいつの間にか分割すべき場所が変わってくることが多くあります。しかしそうなっても後戻りはできません(モジュールの分割点を変えるコストは莫大です)。しだいにモジュール結合度は増し、システム全体がひとつの巨大なモジュールのようになってしまいます。

モジュール分割の弱点を克服するため、「オブジェクト指向」を導入するのがトレンドです。オブジェクト指向は、一言で言うと、システムの構造をそのままの形で実装してしまおうという考え方です。

まずシステム中に存在するオブジェクトを洗い出します。オブジェクトとは、「実体や概念として確かに存在するもの」のことです。システムを、機能ではなく「もの」の集まりとしてとらえるのです。システムを実体のない機能の集まりととらえるのと、実体のあるものの集まりとしてとらえるのとでは、後者のほうがずっと簡単で理解しやすいはずです。あとで機能の追加や修正があっても、オブジェクト同士の境界線があいまいになったりはしません(モジュール分割ではすぐにモジュール同士の境界線があいまいになることが問題でした)。

オブジェクトを洗い出したら、今度はひとつひとつのオブジェクトが他のオブジェクトに対してどのような機能を提供すべきか検討します。システム中で、そのオブジェクトが演じている役割をしっかり把握することが重要です。

オブジェクト指向で設計されたシステムは、演劇に似ています。演劇において舞台というシステムを構成するのが役者というオブジェクトです。ひとりひとりの役者が自分の役を演じ、他の役者と影響を及ぼしあうことによって舞台が進行します。オブジェクトを設計する作業というのは、システム中の登場人物をデザインするようなものです。自己完結したひとりの人間のような振る舞いをするように設計しなければなりません。性格の違ういろいろな役者と立派に共演できるようにしてやるのです!

オブジェクト指向ではいつもひとつのオブジェクトに注目してコーディングします。あるオブジェクトは他のオブジェクトにサービスを提供したりされたりしながら協調動作します。システムという空間の中で自分が演じなければならない役割をきっちり演じきってはじめて一人前のオブジェクトです。ですからひとつひとつのオブジェクトを自己完結させることが重要です。

システムの仕様が変更になって機能の追加や修正が必要になっても、登場するオブジェクトの構成が変わることは稀です。演劇でちょっとくらいストーリーが変わっても役ががらっと変わったりしないようなものです。つまり、モジュール分割よりもずっと変更に強いのです。

今は細かい話はしませんが、オブジェクト指向には次のような利点があります。

  • バグが発生しにくい、またはバグの原因を究明しやすい
  • 設計が易しく、またいつでも柔軟に変更できる
  • 修正すべきポイントが常に明白である
  • うまく行えば、可読性の高いコードが書ける
  • うまく行えば、再利用可能なコードが書ける
  • 設計とコーディングを同時進行できる(これぞ究極!)

そもそもオブジェクト指向というのは、最も「普通の」設計手法であるといえます。歴史的にも、どこかの天才がひとりで作り上げたものではなく、あちこちで同時多発的に起こってきた設計手法なのです。試しにモジュール分割で演劇を設計したらどうなるか想像してみると面白いでしょう(なんと不自然なこと!)。

オブジェクト指向はまだ発展途上ですが、決して熟していない新しい技術などではありません。現在主流のシングルプロセッサによるパソコンでプログラミングをするのが目的なら、これ以上の方法はありません。それに、マルチプロセッサ技術との相性も良いので、将来を約束された手法なのです。

オブジェクト指向についての詳しい話はしませんでしたが、もっと知りたい人は、こちらのページをご覧下さい

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)