|
|
Log In | Not a Member? |
Contact ADC |
| < Previous PageNext Page > |
デザインパターンとは、特定のコンテキスト(文脈)において繰り返し起きる一般的な問題を解決する、デザインのテンプレートのことで、ソフトウェア開発だけでなく、アーキテクチャやエンジニアリングのような分野でも役に立つ抽象化手段です。以降のセクションでは、デザインパターンとは何か、また、デザインパターンがなぜオブジェクト指向のデザインにとって重要なのかについて概説し、デザインパターンの例を示します。
特定のコンテキストにおける問題の解決策
例:Commandパターン
開発者であれば、オブジェクト指向プログラミングにおけるデザインパターンの概念についてすでに熟知している人もいるかもしれません。デザインパターンについては、『Design Patterns: Elements of Reusable Object-Oriented Software』(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissidesによる共著。邦訳『オブジェクト指向における再利用のためのデザインパターン 改訂版』。この4人はしばしば、“Gang of Four”と呼ばれています)という書籍で初めて本格的に解説、分類されました。この本は1994年に初めて発刊されましたが、その後まもなく、オブジェクト指向システムにおけるデザインパターンについて詳説したほかの書籍や記事が登場しました。
デザインパターンの簡潔な定義は、“特定のコンテキストにおける問題の解決策”です。この定義について、単語ごとに考えてみましょう。コンテキスト(文脈)とは、パターンが適用される繰り返し起こる状況のことです。問題とは、このコンテキストの中で達成しようとしている目標のことであり、そのコンテキストに付随するあらゆる制約でもあります。そして、解決策とは、目標を達成し、制約を解決する、コンテキストの全般的なデザインのことです。
デザインパターンによって、具体的なデザイン構造のうち、時とともに効果的であることが実証されている主要な側面が抽象化されます。パターンには名前があり、パターンに関与するクラスやオブジェクトが識別されるとともに、その責務や共同作業も識別されます。また、名前によって、結果(コストや利点)と、パターンを適用できる状況も明らかになります。デザインパターンは特定のデザインに対する一種のテンプレートまたはガイドであり、ある意味で、具体的なデザインはパターンを“インスタンス化”したものと考えられます。デザインパターンは絶対的なものではなく、その適用方法には多少の柔軟性があります。そして、多くの場合、プログラミング言語や既存のアーキテクチャなどでパターンの適用方法を決めることができます。
デザインパターンは、デザインに関するいくつかの命題や原則の影響を受けます。これらのデザイン原則は、“システム構造のうち変化する部分をカプセル化する”、あるいは“実装に対してではなくインターフェイスに対してプログラミングする”といった、オブジェクト指向システムを構築する際の経験則です。デザイン原則は重要な識見を示します。たとえば、システム要素のうち変化する部分を隔離してカプセル化した場合、それらはシステムのほかの部分とは独立して変化することができます。特に、実装の具体的な内容と切り離されたインターフェイスを定義する場合はこのことが重要になります。これらの可変部分については、システムのほかの部分に影響を与えることなく、後で変更や拡張を加えることができます。そうすることで、各部どうしの依存関係がなくなり、結び付きが弱くなる結果、システムの柔軟性が高まり、変化に対して堅牢になります。
このような利点があるため、デザインパターンはソフトウェアを作成する際に検討することが重要になっています。プログラムのデザインの中で、パターンを見つけたり、パターンを応用したり、パターンを使用したりすることで、そのプログラムだけでなく、プログラムを構成するオブジェクトやクラスについても、再利用性や拡張性が高まり、将来の要件に対しても変更を加えやすくなります。そのうえ、デザインパターンに基づいて作成されたプログラムは、そうでないプログラムよりも一般に、洗練されていて効率的です。これは、同じ目標を達成するのに必要なコード量が少なく済むからです。
Gang of Fourによる書籍の大部分はデザインパターンのカタログで構成されており、カタログの中でパターンが有効範囲別(クラスまたはオブジェクト)および目的別(生成に関するパターン、構造に関するパターン、または振る舞いに関するパターン)に分類されています。カタログ内の各項目では、デザインパターンの目的、動機付け、応用性、構造、参加者、共同作業、結果、実装について、それぞれ説明しています。それらの項目の1つに、Commandパターン(オブジェクトの振る舞いに関するパターン)があります。
Commandパターンの目的は、その説明によれば、“要求をオブジェクトとしてカプセル化し、それによって、クライアントを異なる要求ごとにパラメータ化したり、要求をキューに置いたり、要求をログに記録したり、取り消しが可能な操作をサポートしたりできるようにすること”です。パターンによって、メッセージを送信する側のオブジェクトと、それらのメッセージを受信して評価する側のオブジェクトとが分離されます。メッセージの発信者(クライアント)では、特定の受信者(レシーバ)を対象とする1つまたは複数のアクションをまとめることによって、要求をカプセル化します。カプセル化されたメッセージは、オブジェクト間で受け渡したり、キューに置いたり(または後で呼び出せるように格納したり)、レシーバやメッセージパラメータを変化させるために動的に変更したりできます。Figure 4-1に、このパターンの構造図を示します。
Cocoaに慣れている開発者であれば、このCommandパターンの概要図に思い当たることがあるかもしれません。このパターンは、Foundationフレームワークにおいてメッセージのカプセル化を目的としているクラスNSInvocationを完璧に表現しています。パターンの目的で説明されているように、その目的の1つは操作の取り消しを可能にすることです。Cocoaのデザインでは、取り消しの管理に呼び出しオブジェクトが使用されています。また、プロセス間通信のアーキテクチャである分散オブジェクトにも、呼び出しオブジェクトが使用されています。Commandパターンではまた、Cocoaのターゲット/アクションメカニズムも(不完全ながら)表現されています。このメカニズムでは、ユーザインターフェイスのコントロールオブジェクトによって、ユーザがそれらのオブジェクトをアクティブにしたときにオブジェクトから送信されるメッセージのターゲットとアクションがカプセル化されます。
Cocoaのフレームワーククラスと、Cocoaの言語およびランタイムでは、分類されているデザインパターンの多くがすでに実装されています(これらの実装の詳細については、“「Cocoaにおけるデザインパターンの応用」”を参照してください)。これらのデザインパターンの“既製の”応用からいずれかを使用することで、開発要件の多くを満たせます。あるいは、問題やそのコンテキストに対して、まったく新しいパターンベースのデザインを独自に求めることも可能です。重要なことは、ソフトウェアを開発する際にパターンを意識し、デザインの中で必要に応じてパターンを使用することです。
| < Previous PageNext Page > |
Last updated: 2006-05-23
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |