デザインパターン


 

はじめに

オブジェクト指向とは

オブジェクト指向プログラミング

最近は、C++やJavaなどを用いたオブジェクト指向プログラミングが一般的となってきました。オブジェクト指向プログラミングとは、いくつかの「オブジェクト」を生成して、これらの「オブジェクト」同士を相互作用させることによりプログラムを実行していくプログラミング言語のことです。

オブジェクト指向プログラミングのメリット

生産性の向上
「再利用」することによって、以前書いたコードを再度書く必要が無くなる。
信頼性の向上
「再利用」を重ねていくことで、バグが減る。

オブジェクト指向プログラミングのメリットとして、その「生産性」や「信頼性」の向上がよく挙げられます。「再利用」することによって、以前書いたコードを再度書く必要が無くなり、「生産性の向上」が期待できることは明らかです。また、再利用を重ねていくことで、そのクラスやクラスライブラリに対する「信頼性が向上」していきます。再利用性の高い設計にすることで、生産性と信頼性の向上が期待できるのです。

では、なぜ「再利用性」が高くなるのでしょう?オブジェクト指向プログラミングでは、「クラス」として機能のまとまりを定義していますので、クラス単位での再利用が可能であるという考えです。例えば、一度クラスを定義しておけば、別のアプリケーションでも、そのクラスが必要となったとき、これを使いまわせるというわけです。

ここで、ひとつ、はっきりさせておきたいことがあります。 「再利用」ということばです。以前作成したソースを手直しして利用することも広い意味で「再利用」かもしれませんが、オブジェクト指向プログラミングでは違います。オブジェクト指向プログラミングでいう「再利用」とは、以前作成したソースにはいっさい手を加えないで利用することです。

毎回ソースを手直ししていたのでは信頼性は向上しない!
再利用性の高いクラスを設計することは簡単じゃない!




しかし、このように再利用性の高いクラスを設計することは容易ではありません。前回作った自動販売機クラスが、今回のアプリケーションでもそのまま利用できるなんてうまい話は、そうそうあるものではありません。

それでは、「生産性の向上」「信頼性の向上」といった恩恵を受けるには、どうしなければならないのでしょうか。良いオブジェクト指向設計をするためには、直面している問題を解決することだけでなく、将来の仕様変更や仕様追加にも柔軟に対応できることや、再利用性の高いクラスやライブラリの作成を念頭においておくことが重要となります。


では、どのような設計にしておけば、再利用性が高いクラスやライブラリができるのでしょうか。

設計者が何か問題に直面したとき、そのような問題に出会うのが初めてであれば、いろいろ試行錯誤をして良い解決方法を見つける必要があります。しかし、以前似たような問題に出会い、うまく解決した経験があれば、以前と同じような方法でその問題を解決することができるのです。「よく出会う問題とそれに対処する良い設計」をたくさん知っていれば、良い設計をスムースに進めていくことができるわけです。

デザインパターンとは、このような「よく出会う問題とそれに対処する良い設計」です。要は「こんな問題に直面したら、こんな設計にしましょう。」という指針を示しています。

デザインパターンとは

デザインパターンとは、様々なプログラムで再利用できる汎用的な設計パターンのことです。ソフトウェアの設計を分類し、文書化して残したノウハウです。各パターンには、多くの知恵が凝縮されています。

プログラマの世界では、様々なデザインパターンが知られていますが、その中でも特に有名なのが「GoFデザインパターン」です。GoF(ゴフ)とは”The Gang Of Four(4人の奴等)”の略であり、エリック・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人を指しています。

彼らは、オブジェクト指向プログラミングに役立つデザインパターンを持ち寄り、それらを Design Patterns : Elements of Reusable Object Oriented Software というタイトルの本にまとめました(1995年発刊)。

デザインパターンとは、ソフトウェアの設計を分類し、文書化して残した、ノウハウの財産です。すべてのパターンについて、作るべきクラスの形が示されていますが、その他に、以下のような情報が付随しています。

ただし、本に書かれているパターンの形の通りに、自分のクラスを作れば、それで正しい設計、となる訳ではありません。ソフトウェアの目指している目標や利点と、パターンを利用した時に生じる効果や利点とが一致して、初めて正しい設計となります。逆に、これらが一致しない場合は、デザインパターン通りの見事なクラスを作っても、それは最悪の設計をした、ということになりかねません。

ですから、デザインパターンを学ぶ時は、クラスの形を丸暗記しても、あまり意味があるとは言えません。

それなりにデザインパターンを学んでいれば、ソフトウェアのコードを見て、どんなパターンが使用されているか、読み取ることは、そう難しくはありません。しかし、大切なのは、使われているパターン名の正解を答えることではなくて、そのソフトウェアで重視すべき利点を意識した上で、そのパターンを使っていることが正しいのかどうか、どういう欠点には目をつむっているのかを、判断できるかどうか、です。

どんなソフトウェアにも、設計の仕方にはたくさんの選択肢があります。どのような点を重視するか、何を優先するかによって、採用すべき設計の形は決ってきます。デザインパターンとは、その典型的な例を集めたものだとも言えます。

デザインパターンを学ぶ意義

デザインパターンを学んでおくことで、ソフトウェアの設計をした時に、その長所と短所を、自分で理解できるようになれば良いと思います。

また、より多くのデザインパターンを学べば、ソフトウェアの設計をする際に、よりたくさんの設計を思い浮かべることができるようになるでしょう。そうすれば、それぞれの設計の長所と短所を踏まえた上で、(単に動くというだけでない、バグが少ない、変更改修のしやすい)最適な設計を選択することができるでしょう。