Menu
Coddy logo textTech

デザインパターン入門

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 70/91。

デザインパターンは、開発者がソフトウェアを構築する際に繰り返し直面する一般的な問題に対する、実証済みの解決策です。毎回車輪の再発明をするのではなく、これらの確立されたテンプレートを適用して、自身のコードにおける同様の課題を解決することができます。

デザインパターンを料理のレシピのように考えてみてください。シェフが時間をかけて完成された料理を作るためにレシピに従うのと同じように、開発者は、これまでに数え切れないほどのプログラマーによってテストされ、洗練されてきた方法でコードを構造化するためにデザインパターンを使用します。

デザインパターンは通常、3つのカテゴリに分類されます:

カテゴリ 目的
生成 オブジェクトの生成方法 Singleton, Factory
構造 オブジェクトの構成方法 Adapter, Decorator
振る舞い オブジェクト間の通信方法 Observer, Strategy

実際、あなたはこのコースを通して、気づかないうちにパターンを使用してきました。子クラスが実装しなければならないメソッドを持つ抽象クラスを作成したとき、あなたは Template Method パターンの形式を適用していました。インターフェースを使用してコントラクトを定義したとき、あなたは Strategy パターンの準備をしていたのです。

デザインパターンを学ぶことで、他の開発者と共通の語彙を持つことができます。複雑な構造を詳細に説明する代わりに、単に「ここではFactoryパターンを使用しました」と言うだけで、経験豊富な開発者はあなたの意図をすぐに理解できるでしょう。これからのレッスンでは、PHPでいくつかの不可欠なパターンを実装していきます。

challenge icon

チャレンジ

簡単

デザインパターンがコードの整理にどのように役立つかを示す、シンプルなメッセージフォーマットシステムを構築しましょう。各コンポーネントがどのパターンカテゴリに属するかを特定し、システムの異なる部分がどのように連携するかを確認します。

コードを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"

?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン