デザインパターン入門
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 70/91。
デザインパターンは、ソフトウェアを構築する際に開発者が繰り返し直面する、一般的な問題に対する実証済みの解決策です。毎回ゼロから解決策を考えるのではなく、これらの確立されたテンプレートを適用して、自分のコード内の同様の課題を解決できます。
デザインパターンをレシピだと考えてみましょう。シェフが長い時間をかけて完成させた料理を作るためにレシピに従うのと同じように、開発者は、数え切れないほどのプログラマーによって検証され、改良されてきた方法でコードを構成するためにデザインパターンを使用します。
デザインパターンは通常、3つのカテゴリに分類されます。
| カテゴリ | 目的 | 例 |
|---|---|---|
| Creational | objects がどのように作成されるか | Singleton, Factory |
| 構造 | objects がどのように構成されるか | Adapter, Decorator |
| Behavioral | objects がどのように communicate するか | Observer, Strategy |
実は、あなたはこのコースを通して、気づかないうちにpatternsを使ってきました。子クラスが実装しなければならないmethodを持つ抽象クラスを作成したとき、あなたはTemplate Method patternの一種を適用していました。interfaceを使って契約をdefineしたとき、Strategy patternの準備をしていました。
デザインパターンを学ぶと、他の開発者と共有できる語彙が身につきます。複雑な構造を詳しく説明する代わりに、「ここではFactory patternを使いました」と簡単に言うだけで、経験豊富な開発者はすぐにあなたのアプローチを理解できます。これからのレッスンでは、PHPでいくつかの重要なパターンを実装します。
チャレンジ
簡単デザインパターンがコードの整理にどのように役立つかを示す、シンプルなメッセージ formatting システムを構築しましょう。各コンポーネントがどのパターン category に属するかを確認し、システムのさまざまな部分がどのように連携するかを見ていきます。
コードを3つのファイルに分けて整理します。
MessageFormatter.php: メッセージの formatting に関する契約を define する、MessageFormatterという interface を Create します。単一の methodformat(string $message): stringを持たせます。これはbehavioral category を表します。objects がどのように communicate し、データを処理するかを define します。Formatters.php: MessageFormatter ファイルを読み込み、interface を実装する2つのクラスを create します。UppercaseFormatter: Itsformat()method は、message を大文字に converted して返しますBracketFormatter: Itsformat()method は、[message]のように message を角括弧で囲みます
main.php: Formatters ファイルを読み込みます。2つの input、つまり message string と formatter type("upper"または"bracket")を受け取ります。processMessageという function を Create します。この function はMessageFormatterと message string を accepts し、formatted result を返します。この function は、どの specific formatter を受け取ったかを知る必要がありません。渡された object に対してformat()を呼び出すだけです。formatter type input に Based して、appropriate な formatter object を create します。それを message と一緒に
processMessagefunction に渡し、result を print します。新しい line で、この構造が表す pattern category を print します。interface を通じて interchangeable な behaviors を define しているため、次を print します:
Pattern category: Behavioral
この challenge は、interface によって、それらを使用するコードを変更せずに実装を入れ替えられることを示しています。これは、これからのレッスンで学ぶ Strategy のような patterns の foundation となります。
自分で試してみよう
<?php
require_once 'Formatters.php';
// 入力を読み取る
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: MessageFormatter を受け取る processMessage という関数を作成する
// およびメッセージ文字列を受け取り、フォーマットされた結果を返す
// TODO: $formatterType ("upper" または "bracket") に基づいて、適切なフォーマッターを作成する
// TODO: フォーマッターとメッセージで processMessage を呼び出し、結果を出力する
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ