デザインパターンについて
はじめに
デザインパターンについて学んだので、まとめていきます。
デザインパターンとは
デザインパターンとは、オブジェクト指向言語(Java, C++, C#など)でよく使われる設計をパターン化して、最適な方法でプログラミングを行えるようにするテクニックです。
複雑化するソフトウェア開発の効率化および信頼性向上のためにパターンの利用が有効であるという考えのもとに、広く知られています。
デザインパターンを学ぶ上で、理解しておくべき概念
デザインパターンを理解する上で、OOP言語を使用する上で必須となる、以下のテクニックについて解説します。
継承
継承とは、他のクラスを継承することで、継承したクラスに定義している関数を利用できるようにする仕組みです。これにより、コードの再利用性や拡張性が向上します。
詳しくはこちらを見てみてください。
ポリモフィズム
ポリモフィズムとは、ある一つの関数の呼び出しに対し、オブジェクトごとに違う動作をすることを指します。以下の記事でわかりやすくまとめられているので参考にしてください。
コンポジション
コンポジションは、異なるクラスのオブジェクトを組み合わせて新しい機能を提供する方法を指します。これは、継承に代わるオブジェクトの再利用の手段として利用されることがあります。
以下を参考にしてください。
デザインパターンを使用する目的
再利用性の向上
デザインパターンは、特定の文脈で成功している設計アイディアやソリューションを提供するため、これらを再利用することができます。
再利用性が高まることで、同じまたは類似の問題に対して同じパターンを適用することができ、コードの冗長性を減少させます。
柔軟性と拡張性の向上
デザインパターンは、ソフトウェアの変更や拡張に対して柔軟で堅牢な設計を提供します。
新しい機能や要件が追加された場合、デザインパターンを使用することで、既存のコードを変更する必要が少なくなり、容易に拡張できるようになります。
共通の語彙の提供
デザインパターンは、共通の語彙やアーキテクチャを提供します。これにより、開発者やチームがコミュニケーションを円滑に行うことができ、共通の理解を持つことができます。
これはプロジェクトのコミュニケーションと協力を促進し、開発者間の一貫性を保つのに役立ちます。
パターンの理解による設計スキル向上
デザインパターンを理解し、適切な文脈で使用できるようになることで、開発者の設計スキル向上に繋がります。これにより、より効果的で効率的なソフトウェア設計が可能となります。
主なデザインパターンの種類
デザインパターンは、23種類存在します。以下がその種類をまとめた参考記事になります。
デザインパターンには23種類ありますが、それらは、「生成」、「構造」、「振る舞い」3種類に分類されます。
生成デザインパターン
オブジェクトは必ずはじめに生成されます。その生成をどのように行うかという問いに対するパターンになります。
これらのパターンは、オブジェクトの生成と初期化の方法を隠蔽し、柔軟性と再利用性を向上させることを目的としています。代表的な生成デザインパターンには以下が含まれます。以下が代表例です。
・Builderパターン
元となるオブジェクトを生成し、それをもとに複数のオブジェクトをを生成するパターン。
・Abstract Factoryパターン
インスタンスの生成をサブクラスに委任し、具体的な生成処理をサブクラスで実装するパターン。
・Singletonパターン
クラスが一つのインスタンスのみを持つようにするためのパターン。
構造デザインパターン
オブジェクトは一つだけでなく複数のオブジェクトが必ず使われますが、構造デザインパターンは、その組み合わせのパターンに焦点を当てています。
これにより、システムの構造を柔軟に変更できるようになります。以下が代表例です。
・Adaptorパターン
互換性のないクラス同士を関連付けるパターン。
・Bridgeパターン
機能を拡張するクラスと、実装をするクラスを分離し、相互の橋渡しを行うパターン。
・Decoratorパターン
継承は使用せず、オブジェクトに新しい機能を次々に追加して、拡張ができるようにしたパターン。
振る舞いデザインパターン
それぞれのオブジェクトは、必ずやり取りをします。振る舞いデザインパターンは、オブジェクトが協力し、役割を分担する方法に焦点を当てています。以下が代表例です。
・Command
操作をオブジェクトとして定義するパターン。
・Iterator
コレクションに対する、探索の振る舞いを定義し、イテレータと呼ばれるオブジェクトへ抽出するパターン。
・Observer
一対多の依存関係を定義し、状態変化に応じて処理を実行するパターン。
まとめ
デザインパターンは、効果的なソフトウェア設計を行う上で、必須になってきます。かなり奥が深いので、これからも学び続けていきたいなと思います。
Discussion