デザインパターン入門
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 51/70。
デザインパターンは、ソフトウェアを構築する際に開発者が繰り返し直面する一般的な問題に対する、実証済みの解決策です。毎回車輪の再発明をするのではなく、パターンはコードを構造化するための共通の語彙とテスト済みの手法を提供してくれます。
デザインパターンを設計図と考えてください。それらはコピーするための正確なコードを提供するものではありませんが、特定の課題を解決するためにクラスやオブジェクトをどのように構成するかを説明します。誰かが「ここではFactoryパターンを使いましょう」と言えば、経験豊富な開発者は提案されている一般的な構造をすぐに理解します。
デザインパターンは、主に3つのカテゴリに分類されます:
| カテゴリ | 目的 | 例 |
|---|---|---|
| 生成 | オブジェクトがどのように作成されるか | Singleton, Factory |
| 構造 | オブジェクトがどのように構成されるか | Adapter, Decorator |
| 振る舞い | オブジェクトがどのように通信するか | Observer, Strategy |
これから学習するパターンは、すでに学んだOOP(オブジェクト指向プログラミング)の概念、つまりインターフェース、継承、ポリモーフィズム、そしてコンポジションを直接の基礎としています。各パターンは、柔軟性、保守性、または再利用性を実現するために、これらの基本原則を特定の方法で活用しています。
今後のレッスンでは、Singleton、Factory、Observer、Strategyをはじめとする、いくつかの重要なパターンを実装します。これらのパターンを理解することで、既存のコードベースにおける一般的なソリューションを認識し、自身のプロジェクトでより良いアーキテクチャの決定を下すのに役立ちます。
チャレンジ
簡単複数のファイルにまたがってデザインパターンの情報を整理する、シンプルなパターンカタログシステムを構築しましょう。これにより、適切なコード構成を練習しながら、パターンがどのように分類されるかを理解することができます。
役割を分離するために、3つのファイルを作成します:
Pattern.cs:Patterns名前空間内に、単一のデザインパターンを表すPatternクラスを定義します。各パターンはName、Category(Creational、Structural、または Behavioral)、およびDescriptionを持つ必要があります。[{Category}] {Name}: {Description}という形式の文字列を返すGetSummary()メソッドを含めてください。PatternCatalog.cs:Patterns名前空間内に、パターンのコレクションを管理するPatternCatalogクラスを作成します。カタログはパターンを追加できる必要があり、指定されたカテゴリに一致するすべてのパターンのリストを返すGetPatternsByCategory(string category)メソッドを持つ必要があります。また、カタログ内のすべてのパターンのサマリー文字列のリストを返すGetAllSummaries()メソッドも含めてください。Program.cs: カタログを作成し、入力に基づいてパターンを登録することで、すべてをまとめます。その後、カテゴリでフィルタリングされたパターンを表示します。
以下の入力を受け取ります:
- 追加するパターンの数
- 各パターンについて:名前、カテゴリ、説明を含む3行
- フィルタリングするカテゴリ
すべてのパターンをカタログに追加した後、フィルターカテゴリに一致するパターンのサマリーを1行に1つずつ出力します。一致するパターンがない場合は、No patterns found と出力してください。
例えば、入力が以下の場合:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
Creational出力は以下のようになります:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classこのチャレンジは、関連するクラスを別々のファイルに整理することで、コードベースをクリーンで保守しやすく保つ方法を示しています。これは、今後のレッスンで実際のデザインパターンを実装する際に、さらに重要になる原則です!
チートシート
デザインパターンは、ソフトウェア開発における一般的な問題に対する、実証済みの解決策です。これらは、コピーするための正確なコードではなく、クラスやオブジェクトを整理するための設計図を提供します。
デザインパターンは、主に3つのカテゴリに分類されます:
| カテゴリ | 目的 | 例 |
|---|---|---|
| 生成 | オブジェクトがどのように作成されるか | Singleton, Factory |
| 構造 | オブジェクトがどのように構成されるか | Adapter, Decorator |
| 振る舞い | オブジェクトがどのように通信するか | Observer, Strategy |
デザインパターンは、インターフェース、継承、ポリモーフィズム、コンポジションといったOOP(オブジェクト指向プログラミング)の概念に基づいて構築されており、柔軟性、保守性、再利用性を実現します。
自分で試してみよう
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// パターンの数を読み込む
int n = Convert.ToInt32(Console.ReadLine());
// 新しい PatternCatalog を作成する
PatternCatalog catalog = new PatternCatalog();
// TODO: 各パターンの詳細(名前、カテゴリ、説明)を読み込む
// そして、それらをカタログに追加する
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Pattern を作成し、カタログに追加する
}
// フィルタリングするカテゴリを読み込む
string filterCategory = Console.ReadLine();
// TODO: フィルタカテゴリによってパターンを取得する
// そして、それらの概要を出力する
// 一致するパターンがない場合は、"No patterns found" と出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。