目次へ

0.4 設計への利用について

実際に設計に行き詰った際には、このカタログと呼ばれる一覧表を睨んで、良いアイディアを与えてくれそうなものを探すことが薦められています。あくまでも「良いアイディアを与えてくれそうなものを探す」ことを目的としましょう。よく「無理にパターンにあてはめようとして苦しんでしまう」という罠にかかる方がいます。このカタログで紹介されているパターンは、たった23種類しかないのです。実際の開発で、この23パターンにぴったりと当てはまることなんて、そうそうないのだということを頭に入れておいてください。 前にも述べていますが、デザインパターンは論語と同じで、そのまま現在直面している問題の解決につながるようなものではないのです。デザインパターンを学習して、なぜこれらが良い設計とされているのかを理解することが大切なのです。これらの設計のキモをつかむことで、明日からの設計が少しずつ変わってくるはずです。

さて、ではデザインパターンはどのように設計者を助けてくれるのでしょう。設計に困ったといっても困り方もいろいろあります。ここではデザインパターンを思い出すべき場面をいくつか紹介しようと思います。

クラスの抽出

オブジェクト指向では、基本的に現実世界に即した形で設計するとよく言われますが、実は、現実世界には存在しない抽象的なものをクラスとして抽出することがあります。抽象的な概念をクラスとすることで、非常に柔軟な設計となることがあるためです。
オブジェクト指向設計の方法として、いくつかの異なったアプローチがあります。現象を文章として記述し、その中から名詞と動詞を抽出し、それを元にクラスとメソッドを考える方法や、UML などを利用して実世界をモデル化し、現れたオブジェクトを設計に盛り込んでいく方法などです。全ての方法にはそれぞれ理論があり、どれもすばらしいものなのですが、いずれの方法を用いても抽象的な概念をクラスにするという設計に至るのは難しいのです。
デザインパターンには、このような抽象的な概念をうまく取り入れたものがいくつかあります。例えばStrategy パターンというパターンでは「戦略」をクラスとして抽出していますし、State パターンでは「状態」というさらに抽象的なものをクラスとして抽出しています。
デザインパターンを学習することで、このような抽象的なものをクラスとして抽出する感覚が身についてきます。 現実世界だけを見ていると、なかなか設計がうまくいかないことがあります。こんなときは、デザインパターンを思い出して、抽象的な概念をクラスとして抽出することを考えてみましょう。

実装とインタフェースの切り分け

デザインパターンでは、インタフェースに対してプログラミングすることが積極的に取り入れられています。実装に対してプログラミングをするのではなく、インタフェースに対してプログラミングをしましょうということなのですが、初心者の方にはなんだかよく分からない感覚かも知れません。デザインパターンを理解してくると、この意味が分かるようになると思います。 何かの変数を宣言するときに、抽象クラスやインタフェースではなく、特定の具象クラスを使ってしまうことで、柔軟さが失われてしまいます。変数の宣言時に、その型としてインタフェースなどを指定するだけで、ほんの少しですが柔軟性が向上します。
デザインパターンを学習していくと、インタフェースを使うことのすばらしさに気付かされます。 具象クラスを変数宣言している場面では「インタフェースにしておいたほうが良いのではないか」と常に自分に問いかけるようにしましょう。

再利用性を高める

オブジェクト指向における再利用の方法には、大きく2つあります。ひとつは「継承」で、もうひとつが「オブジェクトコンポジション」という考え方です。
 ご存知の通り、継承を使うとスーパークラスで実装されている内容をサブクラスにも引き継ぐことができます。継承を利用することで、同じ目的を持ったメソッドを何度も実装する必要がなくなります。 次に「オブジェクトコンポジション」です。オブジェクトコンポジションという言葉が、あまり聞きなれない言葉で少し戸惑っておられるかもしれません。しかし、怖がることはありません、なぜなら、オブジェクトコンポジションは気づかないうちによく使っているからです。日本語にすると、オブジェクトは「もの」、コンポジションは「組み立て」となります。オブジェクトコンポジションとは、他のオブジェクトが持つ機能をうまく組み合わせて再利用する方法なのです。
 例えば、最近の携帯電話にはSD カードというものを差し込むことができます。この SD カードは、データを記録しておくためのものです。携帯電話本体にもデータを記録しておく機能はありますが、SDカードを挿しこむことで大容量が記録できるように拡張されるわけです。携帯電話は、SDカードの「記録する」という機能を利用して機能を拡張しています。このように、別のオブジェクトが持つ機能を組み合わせて利用することをオブジェクトコンポジションと言うわけです。
 デザインパターンでは、継承やオブジェクトコンポジションがとてもうまく利用されており、とても参考になります。再利用性を高めたいときには、ぜひともこれを思い出すようにしてください。 GoF のデザインパターンでは、オブジェクトコンポジションを多用することを理想的としています。オブジェクトを組み合わせることで、必要とする機能の全てが用意できるようになることが、再利用性が最も高まった状態と言えるからです。

デザインパターンでは、委譲という言葉がよく出てきます。これは、あるメソッドの処理を、とある他のインスタンスの、あるメソッドに任せてしまうことでオブジェクトコンポジションの考え方をベースとしているものです。

変更に強くする

仕様の追加や変更に柔軟に対応できるような設計が、優れた設計であることは言うまでもありません。仕様の追加や変更が発生するたびに、設計から見直すことは、大きなコスト増につながります。設計の変更には、クラスの変更、実装の変更、再テストなどを伴うからです。  仕様の追加や変更に柔軟に対応するためには、あらかじめ起こりうる追加や変更を想定しておく必要があります。デザインパターンは、想定される仕様の追加や変更に柔軟に対応できる方法を教えてくれます。

デザインパターンがおよそ何を目的としたものかはお分かりいただけたでしょうか。 次章以降では、実際の利用場面に照らし合わせながら、いくつかのパターンをじっくり見ていくことにします。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp