デザインパターン入門
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 70/91。
デザインパターンは、開発者がソフトウェアを構築する際に繰り返し直面する一般的な問題に対する、実証済みの解決策です。毎回車輪の再発明をするのではなく、これらの確立されたテンプレートを適用して、自身のコードにおける同様の課題を解決することができます。
デザインパターンを料理のレシピのように考えてみてください。シェフが時間をかけて完成された料理を作るためにレシピに従うのと同じように、開発者は、これまでに数え切れないほどのプログラマーによってテストされ、洗練されてきた方法でコードを構造化するためにデザインパターンを使用します。
デザインパターンは通常、3つのカテゴリに分類されます:
| カテゴリ | 目的 | 例 |
|---|---|---|
| 生成 | オブジェクトの生成方法 | Singleton, Factory |
| 構造 | オブジェクトの構成方法 | Adapter, Decorator |
| 振る舞い | オブジェクト間の通信方法 | Observer, Strategy |
実際、あなたはこのコースを通して、気づかないうちにパターンを使用してきました。子クラスが実装しなければならないメソッドを持つ抽象クラスを作成したとき、あなたは Template Method パターンの形式を適用していました。インターフェースを使用してコントラクトを定義したとき、あなたは Strategy パターンの準備をしていたのです。
デザインパターンを学ぶことで、他の開発者と共通の語彙を持つことができます。複雑な構造を詳細に説明する代わりに、単に「ここではFactoryパターンを使用しました」と言うだけで、経験豊富な開発者はあなたの意図をすぐに理解できるでしょう。これからのレッスンでは、PHPでいくつかの不可欠なパターンを実装していきます。
チャレンジ
簡単デザインパターンがコードの整理にどのように役立つかを示す、シンプルなメッセージフォーマットシステムを構築しましょう。各コンポーネントがどのパターンカテゴリに属するかを特定し、システムの異なる部分がどのように連携するかを確認します。
コードを3つのファイルに分けて整理します:
MessageFormatter.php— メッセージをフォーマットするための規約を定義するMessageFormatterというインターフェースを作成します。これには、単一のメソッドformat(string $message): stringを持たせる必要があります。これは Behavioral(振る舞い)カテゴリを表します。これは、オブジェクトがどのように通信し、データを処理するかを定義します。Formatters.php— MessageFormatter ファイルをインクルードし、インターフェースを実装する2つのクラスを作成します:UppercaseFormatter— そのformat()メソッドは、メッセージを大文字に変換して返します。BracketFormatter— そのformat()メソッドは、メッセージを[message]のように角括弧で囲みます。
main.php— Formatters ファイルをインクルードします。2つの入力、メッセージ文字列とフォーマッタタイプ("upper"または"bracket")を受け取ります。MessageFormatterとメッセージ文字列を受け取り、フォーマットされた結果を返すprocessMessageという関数を作成します。この関数は、どの具体的なフォーマッタを受け取ったかを知る必要はありません。渡されたオブジェクトに対してformat()を呼び出すだけです。入力されたフォーマッタタイプに基づいて、適切なフォーマッタオブジェクトを作成します。それをメッセージとともに
processMessage関数に渡し、結果を出力します。新しい行に、この構造がどのパターンカテゴリを表しているかを出力します。インターフェースを通じて交換可能な振る舞いを定義しているため、次のように出力してください:
Pattern category: Behavioral
このチャレンジは、インターフェースを使用することで、それを利用するコードを変更することなく実装を入れ替える方法を示しています。これは、今後のレッスンで学習する Strategy パターンのようなパターンの基礎となります。
チートシート
デザインパターンは、コードを効果的に構造化するためのテンプレートを提供する、一般的なプログラミングの問題に対する実証済みの解決策です。
デザインパターンは3つのカテゴリに分類されます:
| カテゴリ | 目的 | 例 |
|---|---|---|
| 生成 (Creational) | オブジェクトがどのように作成されるか | Singleton, Factory |
| 構造 (Structural) | オブジェクトがどのように構成されるか | Adapter, Decorator |
| 振る舞い (Behavioral) | オブジェクトがどのように通信するか | Observer, Strategy |
デザインパターンは開発者間で共通の語彙を提供し、複雑なアーキテクチャ上の決定を伝えやすくします。
自分で試してみよう
<?php
require_once 'Formatters.php';
// 入力を読み込む
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: MessageFormatterとメッセージ文字列を受け取り、
// フォーマットされた結果を返すprocessMessageという関数を作成する
// TODO: $formatterType ("upper" または "bracket") に基づいて、適切なフォーマッタを作成する
// TODO: フォーマッタとメッセージを使用してprocessMessageを呼び出し、結果を出力する
// TODO: パターンカテゴリを新しい行に出力する
// 形式: "Pattern category: Behavioral"
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。