目次へ

0.デザインパターンの基本

0.1 はじめに

最近は、C++やJavaなどを用いたオブジェクト指向プログラミングが一般的となってきました。オブジェクト指向プログラミングとは、いくつかの「オブジェクト」を生成して、これらの「オブジェクト」どうしを相互作用させることによりプログラムを実行していくプログラミング言語のことです。 デザインパターンを学ぶ前に、まずはオブジェクト指向についてしっかり復習しておく必要があります。そこで、簡単にオブジェクト指向のおさらいをしておきましょう。

オブジェクト指向の考え方を説明するために、まずは人間社会の例を挙げましょう。人間社会は、さまざまなオブジェクトが相互作用することで進行していると言えます。例えば、のどが渇いてジュースを買うときを想像してみましょう。自動販売機にお金を入れてボタンを押すと、ジュースを手に入れることができます。オブジェクト指向的には、これを「自動販売機クラスは、お金を引数に取るジュースを出すメソッドを持ち、その返り値は、ジュースである。」と説明することができます。 しかし、この話にはなんの実体も伴っていません。自動販売機にはどのような機能があるかなどは分かりますが、誰がジュースを買ったのか、どの自動販売機で買ったのか、などが明らかにされていないためです。これを「あなたの友達の太郎君が、3丁目の公園の自動販売機でジュースを買う」という話にすれば、実体が伴った話になります。これが、オブジェクトどうしが相互作用している様子です。 自動販売機にはどのような機能があるのかを定義するのが「クラス」で、実際に特定の自動販売機として実体を伴うものが「オブジェクト」ということになります。 オブジェクト指向プログラミングでは、クラスを定義し、このクラスを実体化したオブジェクトどうしの相互作用を表現していくのです。

次に、オブジェクト指向プログラミングのメリットをお話しておきましょう。オブジェクト指向のメリットとして、その「生産性」や「信頼性」の向上がよく挙げられます。 「再利用」ということで、以前書いたコードを再度書く必要が無くなり、「生産性の向上」が期待できることは明らかです。また、再利用を重ねていくことで、そのクラスやクラスライブラリに対する「信頼性が向上」していくこともお分かりいただけるでしょうか。再利用性の高い設計にすることで、生産性と信頼性の向上が期待できるのです。 では、なぜ「再利用性」が高くなるのでしょう?オブジェクト指向プログラミングでは、「クラス」として機能のまとまりを定義していますので、クラス単位での再利用が可能であるという考えです。例えば、一度自動販売機クラスを定義しておけば、別のアプリケーションでも、自動販売機が必要となったとき、これを使いまわせるというわけです。 しかし、このように再利用性の高いクラスを設計することは容易ではありません。前回作った自動販売機クラスが、今回のアプリケーションでもそのまま利用できるなんてうまい話は、そうそうあるものではありません。
では、オブジェクト指向言語を使ってプログラミングを行っても「再利用性の向上」「信頼性の向上」といった恩恵を受けることはできないのでしょうか。いえ、そうではありません。オブジェクト指向の恩恵を受けるには、再利用しやすい形の設計にしておくことが重要となるわけです。良いオブジェクト指向設計をするためには、直面している問題を解決することだけでなく、将来の仕様変更や仕様追加にも柔軟に対応できることや、再利用性の高いクラスやライブラリの作成を念頭においておくことが重要となります。

オブジェクト指向プログラミングの「生産性」や「信頼性」の向上という恩恵を受けるためには、少し考えられて設計された「再利用性の高い」クラスを設計することが鍵となるわけです。

0.2 デザインパターンとは

オブジェクト指向言語で開発を行う際に、再利用性の高いクラスやライブラリが重要になることは分かりました。では、どのような設計にしておけば、再利用性が高いクラスやライブラリができるのでしょう。これに対する指針を示してくれるのが1995年に出版された「オブジェクト指向における再利用のためのデザインパターン」という本(通称「GoF本」)です。デザインパターンが広く認知されるきっかけとなったこの本では、オブジェクト指向で再利用性の高い設計とするためのパターンを23個抽出しています。

この本の執筆者である Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides 
の四人を合わせて the Gang of Fourと呼び、これが GoF と略されたわけです。

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

一般に、デザインパターンというと、この GoF が命名した23個のパターンを意味しますが、もっと幅広く、『よく出会う問題とそのスマートな解決策』という意味でも使われることがあります。

0.3 デザインパターンのメリット

前章でも説明したとおり、デザインパターンとは、「よく出会う問題とそれにうまく対処するための設計」をまとめたものです。 デザインパターンを利用するメリットとして、最初にあげられるのが、「再利用性の高い柔軟な設計ができる」という点です。各パターンには、多くの知恵が凝縮されています。これまでは、設計者の直感や経験などに依存していた設計が、デザインパターンを導入することで、初心者でも先人たちが詰め込んだ「知恵」を利用した設計をすることが可能となります。また、先人たちの知恵を参考にすることで、設計力の向上も期待できます。

次のメリットは、「技術者どうしの意思疎通が容易になる」ことが挙げられます。デザインパターンを習得している技術者どうしであれば、設計について相談するとき「Singleton パターンで行きましょう」とか「Strategy パターンが応用できるのではないでしょうか」というようにパターン名で設計の概要の合意を取ることが可能です。デザインパターンを習得していない技術者には「こんなクラスを作って、このクラスはこんな役割を持っていて・・・。」と延々と説明しなければなりません。このように、デザインパターンを学習しておくことで開発者どうしの意思疎通がスムースになるのです。

論語は人間の生き方に対する考え方を伝えます。孫子は兵法の心得を教えてくれます。デザインパターンはオブジェクト指向設計に対する指針を与えてくれるものと考えましょう。 しかし、GoF本を読んだからといって、直面している設計に関する悩みを全て解決できるようになるわけではありません。論語は、今の生活にぴったりと当てはまる出来事に対する対処法を期待して読むわけではなく、もっと深いところで「その考え方」を蓄積しておき、日常生活のあらゆる場面でその考え方を応用するために読む人が多いと思います。デザインパターンも、直面している問題に対する直接の解決策を与えてくれるわけではなく、その「考え方」を深いところで蓄積しておくことが重要なのだと理解してください。 デザインパターンを深く理解し、その考え方を身に着けていくことで、日々の設計が「再利用性」が高いものに変わっていくのです。

デザインパターンをうまく利用すれば、再利用性が高く、柔軟な設計を行うことができるのです。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp