PHPオブジェクト指向再入門 
デザインパターンに学ぶクラス設計 
1回3,000円のWeb技術教育・アシアル塾 
http://www.asial.co.jp/school/juku.php 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 1
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 2 
本講座の目的 
„ 本講座の目的 
• 書籍だけでは理解することが難しいオブジェクト指向の技術や考え方を、ひとつずつ理解していきます。 
„ 受講対象者 
• プログラミングの基本的な手法である構造化プログラミング(順次・反復・分岐)や変数・関数の仕組みを理 
解している方 
„ 第四回目の目標 
1. デザインパターンとは何か?を理解する 
2. 各パターンを読み解くために必要な知識を身に付ける 
3. 実際にパターンを読み解く
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 3 
デザインパターンとは何か?
デザインパターンとは何か? 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 4 
„ デザインパターンとは 
• オブジェクト指向設計(Object-Oriented Design: OOD)の達人たちが、優れたクラス設 
計から共通のパターンを見出し、名前を付けてカタログ化したもの。 
„ 代表的なデザインパターン 
• GoF (Gang of Four)によるデザインパターン 
9 最も有名 
– デザインパターンという考え方を初めにソフトウェア開発の世界に持ち込んだのもGoF 
9 23のパターンが紹介されている 
– パターンは3つのカテゴリに分類されている 
» 生成に関するパターン 
» 構造に関するパターン 
» 振る舞いに関するパターン
GoF ‒ 生成に関するパターン 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 5 
„ 生成に関するパターン 
• Abstract Factory:セットで使われるクラスを生成する 
• Builder:複雑なオブジェクトを組み立てる 
• Factory Method:生成するクラスを子クラスに決めさせる 
• Prototype:オブジェクトのクローンを作る 
• Singleton:一人っ子オブジェクトを作る
GoF ‒ 構造に関するパターン 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 6 
„ 構造に関するパターン 
• Adapter:好みのインターフェイスでラッピングする 
• Bridge:インターフェイスと実装を独立して発展させる 
• Composite:オブジェクトのツリー構造を表現する 
• Decorator:好きな順で振る舞いにフィルタを施す 
• Facade:パッケージの利用窓口を設ける 
• Flyweight:同じデータを持つオブジェクトを生成しない 
• Proxy:同じインターフェイスを持つクラスで仲介する
GoF ‒ 振る舞いに関するパターン 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 7 
„ 振る舞いに関するパターン 
• Chain of Responsibility:処理の責任をバトンタッチする 
• Command:処理実行のリクエストをクラスで表現する 
• Interpreter:プログラムの文法をクラスで表現する 
• Iterator:集合の要素に共通のインターフェイスでアクセス 
• Mediator:多数のオブジェクトのまとめ役をたてる 
• Memento:思い出を記憶してUndo機構を実現する 
• Observer:オブジェクトの状態変化を監視する 
• State:状態によって振る舞いを切り替える 
• Strategy:処理内容を実行時に切り替えられるようにする 
• Template Method:ひな型メソッドから抽象メソッドを利用 
• Visitor:型が統一されていない集合の要素にアクセスする
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 8 
【余談】デザインパターン 
„ システム開発における他のアイディアとの比較 
• アルゴリズム 
9 問題を解くための手順 
– 実装して利用する。あるいは実装済みのものを利用する。 
• ライブラリ 
9 汎用性の高いプログラムをまとめたもの 
– 呼び出して利用する。 
• フレームワーク 
9 アプリケーションの土台・半完成品 
– ルールに従いつつ、プログラムを記述して完成品に仕上げていく。 
• パターン 
9 優れた対処方法を命名してカタログ化したもの 
– 状況に応じて選択し、実情に適合させつつ利用する 
„ クラス設計以外のパターン 
• AWSクラウドデザインパターン 
9 AWSのクラウドサーバーでインフラ設計を行う際のパターン集
デザインパターンを理解するために必要な知識 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 9
デザインパターンを理解するために必要な知識 
„ デザインパターンを理解するために必要な知識 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 10 
• 継承 
• 委譲 
• インタフェース 
• 抽象クラス 
• クラス図 
• カプセル化 
• ポリモーフィズム(多態性・多様性) 
„ 理由 
• デザインパターンはオブジェクト指向の特徴を活用したものが多いため、上記の考え方などを再確認しな 
がら学習すると理解しやすい。
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 11 
継承とは 
„ 継承 
• クラスのプロパティ・メソッドを受け継いで新しいクラスを作成する仕組みです 
9 元になるクラスを親クラス・基底クラス・スーパークラスなどと呼びます 
9 新しいクラスを子クラス・サブクラス・派生クラスなどと呼びます 
„ 継承のメリット 
• 親クラスの機能を再利用することができます 
„ 記述方法 
• クラスを定義する際に「extends」で親クラスを指定します 
„ 注意点 
• 単純に機能を再利用したいだけの場合、継承ではなく委譲を検討して下さい
関連(has) 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 12 
委譲とは 
„ 委譲(delegation) 
• あるクラスの処理の一部を「別のクラスに任せる」こと 
• 例えばアプリケーション全体を管理するApplicationクラスがあったと仮定 
9 「ログを出力する」という処理が必要な場合 
– 具体的な処理はApplicationクラス内には直接記述しない 
– Loggerクラスを実装し、具体的な処理はそのクラスに任せる(委譲する) 
• ApplicationとLoggerの関連を表したクラス図 
„ 委譲のメリット 
• クラスの役割分担を行うことができる 
9 巨大なクラスができてしまうことを防ぐことができる 
9 Loggerを別のApplicationで再利用することも可能
インタフェースと抽象メソッド・抽象クラス 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 13 
„ インターフェイスとは 
• 「実装コードを定義せずに、どんなメソッドを持つかだけを定義する」もの 
9 抽象メソッドのみもつことができます 
„ 抽象メソッドとは 
• 実装コードのない、宣言だけのメソッド 
„ 抽象クラスとは 
• 直接インスタンス化できないクラス 
9 継承して利用します 
• プロパティやメソッドは普通のクラスと同じように実装することができます 
9 抽象メソッドを持つこともできます
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 14 
インターフェースの利用例 
„ インタフェースの利用例 
<?php 
interface Logger 
{ 
public function log($message); // インターフェイス内のメソッドは、すべて抽象メソッドとなる 
} 
class FileLogger implements Logger // Loggerインターフェイスを実装する 
{ 
public function log($message) 
{ 
// ここで実際のログ処理を行う 
} 
} 
FileLogger.php
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 15 
抽象クラスの利用例 
„ 抽象クラスの利用例 
<?php 
abstract class AbstractLogger // 抽象クラス 
{ 
abstract public function doLog($message); // 抽象メソッド(実装は子クラスにまかせる) 
public function log($message) // 通常のメソッド 
{ 
$this->doLog( date('[Y-m-d H:i:s] ') . $message . "¥n" ); 
} 
} 
AbstractLogger.php 
<?php // FileLogger.php 
class FileLogger extends AbstractLogger 
{ 
public function doLog($message) { 
file_put_contents('app.log', $message, FILE_APPEND); 
} 
} 
FileLogger.php
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 16 
クラス図の見方1/2
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 17 
クラス図の見方2/2
カプセル化・ポリモーフィズム 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 18 
„ カプセル化 
• 他クラスからアクセスされたくないプロパティやメソッドを隠すこと 
„ ポリモーフィズム 
• 同じ名前のメソッドを呼ぶ場合でも、クラスによって挙動が変化する性質のこと
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 19 
Strategyパターン
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 20 
Strategyパターン 
„ Strategyパターン 
• Strategyとは 
9 戦略・方策 
• 特徴 
9 特定の処理を別クラスに移譲し、処理ロジックを切り替えできるようにするパターン 
• 利用例 
9 開発環境と本番環境で挙動を変えたい 
– デバッグ用のメール送信クラスと本番用のメール送信クラスを切り替える 
9 データの保存方式を複数対応できるようにしたい 
– ファイルに保存するクラスやデータベースに保存するクラスを等を用意して切り替える 
• 鍵となる技術 
9 委譲 
9 ポリモーフィズム
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 21 
Strategyパターンの一般形
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 22 
今回作成するプログラム
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 23 
【実習】Strategyパターン 
„ インタフェースで、どんなメソッドを持つか定義 
<?php 
interface IMailSender 
{ 
public function send($message); 
} 
MailSender.php
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 24 
【実習】Strategyパターン 
„ インターフェースを実装するためのクラスを作成 
class MailSender implements IMailSender 
{ 
public function send($message) 
{ 
echo 'メールを送ります: '.$message; 
} 
} 
„ デバッグ用のメール送信クラスも作成 
MailSender.php 
class DebugMailSender implements IMailSender 
{ 
public function send($message) 
{ 
echo 'メールを送りません: '.$message; 
} 
}
public function setSender(IMailSender $sender) 
{ 
$this->sender = $sender; 
} 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 25 
【実習】Strategyパターン 
„ Mailを送信するクラスを作成 
• 実際の送信は別のクラスに委譲します 
<?php // Mail.php 
class Mail 
{ 
private $sender; 
„ デバッグ用のメール送信クラスも作成 
public function send($message) 
{ 
$this->sender->send($message); 
} 
} 
Mail.php
strategy_client.php 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 26 
【実習】Strategyパターン 
„ クライアント側 
<?php 
require_once('Mail.php'); 
require_once('MailSender.php'); 
$mail = new Mail(); 
$mail->setSender(new DebugMailSender()); 
$mail->send('Hello, world!'); // 「メールを送りません: Hello, world!」と表示されるはず
strategy_client.php 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 27 
Strategyクラスの切り替え 
„ 実行時にパラメータや設定ファイルの値を読み、生成するStrategyクラスを切り替える 
<?php 
require_once('Mail.php'); 
require_once('MailSender.php'); 
$mail = new Mail(); 
$mailer_class = 'DebugMailSender'; // 設定ファイルからクラス名を読み込むとする。 
$mail->setSender(new $mailer_class()); 
$mail->send('Hello, world!');
DI(Dependency Injection)依存性注入 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 28 
„ Dependency Injectionとは 
• Mailクラスは「MailSender」か「DebugMailSender」クラスを利用しています 
9 この状態が「依存している」状態です 
• MailクラスはsetSenderを用意しており、どちらのクラスを利用するか選択が可能 
9 依存先のオブジェクトを外部から生成し、メソッドの引数として渡す(注入する)ことをDIと呼ぶ 
– セッターに渡す場合、Setter Injection 
– コンストラクタに渡す場合、Constructor Injection 
• メリット 
9 クラス間の結びつき(依存度)を弱めることができる 
„ DIコンテナとは 
• 設定ファイルを記述するだけで、Dependency Injectionを自動的に行なってくれる仕組みのこと 
9 メリット 
– ソースコードを変更せずにクラスを切り替えることができる
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 29 
【付録】Compositeパターン
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 30 
Compositeパターン 
„ Compositeパターン 
• Compositeとは 
9 混成・複合 
• 特徴 
9 ファイルとディレクトリのような木構造を表せるパターン 
– 枝にあたるオブジェクトと葉にあたるオブジェクトを同様に扱うこともできる 
• 利用例 
9 ファイルやディレクトリのような仕組みを実現したい 
9 ECの単品商品やセット商品を分かりやすく管理したい 
• 鍵となる技術 
9 委譲 
9 ポリモーフィズム
Compositeパターンの一般形 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 31
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 32 
今回作成するプログラム
【実習】Compositeパターン 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 33 
„ 枝と葉で利用するインタフェースを定義 
<?php 
interface Entry { 
public function getPrice(); 
} 
Entry.php 
<?php 
class Item implements Entry { 
private $price = 0; 
public function __construct($price) { 
$this->price = $price; 
} 
public function getPrice() { 
return $this->price; 
} 
} 
Item.php
【実習】Compositeパターン 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 34 
„ 枝は枝と葉を持つことが出来る 
<?php 
class CompositeItem implements Entry 
{ 
private $child_entries = array(); 
public function addEntry(Entry $entry) { 
$this->child_entries[] = $entry; 
} 
public function getPrice() 
{ 
$total_price = 0; 
foreach ($this->child_entries as $entry) { 
$total_price += $entry->getPrice(); 
} 
return $total_price; 
} 
} 
CompositeItem.php
【実習】Compositeパターン 
„ セット商品もカートも同一のクラスで表現可能 
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 35 
<?php 
require_once('Entry.php'); 
require_once('Item.php'); 
require_once('CompositeItem.php'); 
// 商品 
$mouse = new Item(2000); 
$note_pc = new Item(1); 
$wifi_router = new Item(4800); 
// セット商品 
$pc_set = new CompositeItem(); 
$pc_set->addEntry($note_pc); 
$pc_set->addEntry($wifi_router); 
// カートに入れる 
$cart = new CompositeItem(); 
$cart->addEntry($mouse); 
$cart->addEntry($pc_set); 
// 合計金額を表示 
echo $cart->getPrice().'円'; // 6801円と表示されるはず 
composite_client.php
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 36 
参考文献
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 37 
参考文献 
„ PHPでGoFデザインパターンを実装したい 
• PHPによるデザインパターン入門 
9 http://www.doyouphp.jp/book/book_phpdp.shtml 
9 23のデザインパターンが全てPHPのコードで紹介されています。コードも分かりやすいので学習用におすすめ 
です。
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 38 
【CM】アシアルスクール
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 39 
アシアルスクールのご案内 
„ Web関連技術を集中的かつ体系的に学べる研修サービスです 
• 半日~二日間の集中講義を中心に実施 
• PHPやJavaScript、LinuxといったWeb関連技術が学べます 
„ URL 
• http://www.asial.co.jp/school/guide.php 
„ 例:PHP講座の学習ロードマップ
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 40 
アシアル塾のご案内 
„ 1回3,000円でWeb技術を約90分学習できる格安の教育サービスです 
• 60分の講義+30分の復習&質問タイム 
„ 主な対象 
• IT業界やWeb業界で働いているプロの方の学習を応援します! 
9 Webデザイナーの方大歓迎 
• 技術を分かりやすく教えます 
„ 絶対理解保証キャンペーン実施中 
• もし講義内容にご満足いただけなかった場合は返金いたします 
9 (返金手数料のみ頂戴いたします) 
„ URL 
• http://www.asial.co.jp/school/juku.php
URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 41 
企業研修のご案内 
„ アシアルではWeb技術に関する企業研修を行っています 
• 技術職採用の社員に向けた新人研修・中途採用者向け研修 
• 総合職向けのWeb技術入門研修 
„ 主な実績 
• グリー株式会社様 
• 株式会社ドワンゴ様 
• 株式会社朝日新聞社様 
• 他多数(詳しくは、Webサイトをご参照下さい) 
„ URL 
• http://www.asial.co.jp/business/training/

【アシアル塾】PHPオブジェクト指向再入門・第四回デザインパターンに学ぶクラス設計

  • 1.
    PHPオブジェクト指向再入門 デザインパターンに学ぶクラス設計 1回3,000円のWeb技術教育・アシアル塾 http://www.asial.co.jp/school/juku.php URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 1
  • 2.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 2 本講座の目的 „ 本講座の目的 • 書籍だけでは理解することが難しいオブジェクト指向の技術や考え方を、ひとつずつ理解していきます。 „ 受講対象者 • プログラミングの基本的な手法である構造化プログラミング(順次・反復・分岐)や変数・関数の仕組みを理 解している方 „ 第四回目の目標 1. デザインパターンとは何か?を理解する 2. 各パターンを読み解くために必要な知識を身に付ける 3. 実際にパターンを読み解く
  • 3.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 3 デザインパターンとは何か?
  • 4.
    デザインパターンとは何か? URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 4 „ デザインパターンとは • オブジェクト指向設計(Object-Oriented Design: OOD)の達人たちが、優れたクラス設 計から共通のパターンを見出し、名前を付けてカタログ化したもの。 „ 代表的なデザインパターン • GoF (Gang of Four)によるデザインパターン 9 最も有名 – デザインパターンという考え方を初めにソフトウェア開発の世界に持ち込んだのもGoF 9 23のパターンが紹介されている – パターンは3つのカテゴリに分類されている » 生成に関するパターン » 構造に関するパターン » 振る舞いに関するパターン
  • 5.
    GoF ‒ 生成に関するパターン URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 5 „ 生成に関するパターン • Abstract Factory:セットで使われるクラスを生成する • Builder:複雑なオブジェクトを組み立てる • Factory Method:生成するクラスを子クラスに決めさせる • Prototype:オブジェクトのクローンを作る • Singleton:一人っ子オブジェクトを作る
  • 6.
    GoF ‒ 構造に関するパターン URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 6 „ 構造に関するパターン • Adapter:好みのインターフェイスでラッピングする • Bridge:インターフェイスと実装を独立して発展させる • Composite:オブジェクトのツリー構造を表現する • Decorator:好きな順で振る舞いにフィルタを施す • Facade:パッケージの利用窓口を設ける • Flyweight:同じデータを持つオブジェクトを生成しない • Proxy:同じインターフェイスを持つクラスで仲介する
  • 7.
    GoF ‒ 振る舞いに関するパターン URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 7 „ 振る舞いに関するパターン • Chain of Responsibility:処理の責任をバトンタッチする • Command:処理実行のリクエストをクラスで表現する • Interpreter:プログラムの文法をクラスで表現する • Iterator:集合の要素に共通のインターフェイスでアクセス • Mediator:多数のオブジェクトのまとめ役をたてる • Memento:思い出を記憶してUndo機構を実現する • Observer:オブジェクトの状態変化を監視する • State:状態によって振る舞いを切り替える • Strategy:処理内容を実行時に切り替えられるようにする • Template Method:ひな型メソッドから抽象メソッドを利用 • Visitor:型が統一されていない集合の要素にアクセスする
  • 8.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 8 【余談】デザインパターン „ システム開発における他のアイディアとの比較 • アルゴリズム 9 問題を解くための手順 – 実装して利用する。あるいは実装済みのものを利用する。 • ライブラリ 9 汎用性の高いプログラムをまとめたもの – 呼び出して利用する。 • フレームワーク 9 アプリケーションの土台・半完成品 – ルールに従いつつ、プログラムを記述して完成品に仕上げていく。 • パターン 9 優れた対処方法を命名してカタログ化したもの – 状況に応じて選択し、実情に適合させつつ利用する „ クラス設計以外のパターン • AWSクラウドデザインパターン 9 AWSのクラウドサーバーでインフラ設計を行う際のパターン集
  • 9.
    デザインパターンを理解するために必要な知識 URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 9
  • 10.
    デザインパターンを理解するために必要な知識 „ デザインパターンを理解するために必要な知識 URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 10 • 継承 • 委譲 • インタフェース • 抽象クラス • クラス図 • カプセル化 • ポリモーフィズム(多態性・多様性) „ 理由 • デザインパターンはオブジェクト指向の特徴を活用したものが多いため、上記の考え方などを再確認しな がら学習すると理解しやすい。
  • 11.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 11 継承とは „ 継承 • クラスのプロパティ・メソッドを受け継いで新しいクラスを作成する仕組みです 9 元になるクラスを親クラス・基底クラス・スーパークラスなどと呼びます 9 新しいクラスを子クラス・サブクラス・派生クラスなどと呼びます „ 継承のメリット • 親クラスの機能を再利用することができます „ 記述方法 • クラスを定義する際に「extends」で親クラスを指定します „ 注意点 • 単純に機能を再利用したいだけの場合、継承ではなく委譲を検討して下さい
  • 12.
    関連(has) URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 12 委譲とは „ 委譲(delegation) • あるクラスの処理の一部を「別のクラスに任せる」こと • 例えばアプリケーション全体を管理するApplicationクラスがあったと仮定 9 「ログを出力する」という処理が必要な場合 – 具体的な処理はApplicationクラス内には直接記述しない – Loggerクラスを実装し、具体的な処理はそのクラスに任せる(委譲する) • ApplicationとLoggerの関連を表したクラス図 „ 委譲のメリット • クラスの役割分担を行うことができる 9 巨大なクラスができてしまうことを防ぐことができる 9 Loggerを別のApplicationで再利用することも可能
  • 13.
    インタフェースと抽象メソッド・抽象クラス URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 13 „ インターフェイスとは • 「実装コードを定義せずに、どんなメソッドを持つかだけを定義する」もの 9 抽象メソッドのみもつことができます „ 抽象メソッドとは • 実装コードのない、宣言だけのメソッド „ 抽象クラスとは • 直接インスタンス化できないクラス 9 継承して利用します • プロパティやメソッドは普通のクラスと同じように実装することができます 9 抽象メソッドを持つこともできます
  • 14.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 14 インターフェースの利用例 „ インタフェースの利用例 <?php interface Logger { public function log($message); // インターフェイス内のメソッドは、すべて抽象メソッドとなる } class FileLogger implements Logger // Loggerインターフェイスを実装する { public function log($message) { // ここで実際のログ処理を行う } } FileLogger.php
  • 15.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 15 抽象クラスの利用例 „ 抽象クラスの利用例 <?php abstract class AbstractLogger // 抽象クラス { abstract public function doLog($message); // 抽象メソッド(実装は子クラスにまかせる) public function log($message) // 通常のメソッド { $this->doLog( date('[Y-m-d H:i:s] ') . $message . "¥n" ); } } AbstractLogger.php <?php // FileLogger.php class FileLogger extends AbstractLogger { public function doLog($message) { file_put_contents('app.log', $message, FILE_APPEND); } } FileLogger.php
  • 16.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 16 クラス図の見方1/2
  • 17.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 17 クラス図の見方2/2
  • 18.
    カプセル化・ポリモーフィズム URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 18 „ カプセル化 • 他クラスからアクセスされたくないプロパティやメソッドを隠すこと „ ポリモーフィズム • 同じ名前のメソッドを呼ぶ場合でも、クラスによって挙動が変化する性質のこと
  • 19.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 19 Strategyパターン
  • 20.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 20 Strategyパターン „ Strategyパターン • Strategyとは 9 戦略・方策 • 特徴 9 特定の処理を別クラスに移譲し、処理ロジックを切り替えできるようにするパターン • 利用例 9 開発環境と本番環境で挙動を変えたい – デバッグ用のメール送信クラスと本番用のメール送信クラスを切り替える 9 データの保存方式を複数対応できるようにしたい – ファイルに保存するクラスやデータベースに保存するクラスを等を用意して切り替える • 鍵となる技術 9 委譲 9 ポリモーフィズム
  • 21.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 21 Strategyパターンの一般形
  • 22.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 22 今回作成するプログラム
  • 23.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 23 【実習】Strategyパターン „ インタフェースで、どんなメソッドを持つか定義 <?php interface IMailSender { public function send($message); } MailSender.php
  • 24.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 24 【実習】Strategyパターン „ インターフェースを実装するためのクラスを作成 class MailSender implements IMailSender { public function send($message) { echo 'メールを送ります: '.$message; } } „ デバッグ用のメール送信クラスも作成 MailSender.php class DebugMailSender implements IMailSender { public function send($message) { echo 'メールを送りません: '.$message; } }
  • 25.
    public function setSender(IMailSender$sender) { $this->sender = $sender; } URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 25 【実習】Strategyパターン „ Mailを送信するクラスを作成 • 実際の送信は別のクラスに委譲します <?php // Mail.php class Mail { private $sender; „ デバッグ用のメール送信クラスも作成 public function send($message) { $this->sender->send($message); } } Mail.php
  • 26.
    strategy_client.php URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 26 【実習】Strategyパターン „ クライアント側 <?php require_once('Mail.php'); require_once('MailSender.php'); $mail = new Mail(); $mail->setSender(new DebugMailSender()); $mail->send('Hello, world!'); // 「メールを送りません: Hello, world!」と表示されるはず
  • 27.
    strategy_client.php URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 27 Strategyクラスの切り替え „ 実行時にパラメータや設定ファイルの値を読み、生成するStrategyクラスを切り替える <?php require_once('Mail.php'); require_once('MailSender.php'); $mail = new Mail(); $mailer_class = 'DebugMailSender'; // 設定ファイルからクラス名を読み込むとする。 $mail->setSender(new $mailer_class()); $mail->send('Hello, world!');
  • 28.
    DI(Dependency Injection)依存性注入 URL: http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 28 „ Dependency Injectionとは • Mailクラスは「MailSender」か「DebugMailSender」クラスを利用しています 9 この状態が「依存している」状態です • MailクラスはsetSenderを用意しており、どちらのクラスを利用するか選択が可能 9 依存先のオブジェクトを外部から生成し、メソッドの引数として渡す(注入する)ことをDIと呼ぶ – セッターに渡す場合、Setter Injection – コンストラクタに渡す場合、Constructor Injection • メリット 9 クラス間の結びつき(依存度)を弱めることができる „ DIコンテナとは • 設定ファイルを記述するだけで、Dependency Injectionを自動的に行なってくれる仕組みのこと 9 メリット – ソースコードを変更せずにクラスを切り替えることができる
  • 29.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 29 【付録】Compositeパターン
  • 30.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 30 Compositeパターン „ Compositeパターン • Compositeとは 9 混成・複合 • 特徴 9 ファイルとディレクトリのような木構造を表せるパターン – 枝にあたるオブジェクトと葉にあたるオブジェクトを同様に扱うこともできる • 利用例 9 ファイルやディレクトリのような仕組みを実現したい 9 ECの単品商品やセット商品を分かりやすく管理したい • 鍵となる技術 9 委譲 9 ポリモーフィズム
  • 31.
    Compositeパターンの一般形 URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 31
  • 32.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 32 今回作成するプログラム
  • 33.
    【実習】Compositeパターン URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 33 „ 枝と葉で利用するインタフェースを定義 <?php interface Entry { public function getPrice(); } Entry.php <?php class Item implements Entry { private $price = 0; public function __construct($price) { $this->price = $price; } public function getPrice() { return $this->price; } } Item.php
  • 34.
    【実習】Compositeパターン URL :http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 34 „ 枝は枝と葉を持つことが出来る <?php class CompositeItem implements Entry { private $child_entries = array(); public function addEntry(Entry $entry) { $this->child_entries[] = $entry; } public function getPrice() { $total_price = 0; foreach ($this->child_entries as $entry) { $total_price += $entry->getPrice(); } return $total_price; } } CompositeItem.php
  • 35.
    【実習】Compositeパターン „ セット商品もカートも同一のクラスで表現可能 URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 35 <?php require_once('Entry.php'); require_once('Item.php'); require_once('CompositeItem.php'); // 商品 $mouse = new Item(2000); $note_pc = new Item(1); $wifi_router = new Item(4800); // セット商品 $pc_set = new CompositeItem(); $pc_set->addEntry($note_pc); $pc_set->addEntry($wifi_router); // カートに入れる $cart = new CompositeItem(); $cart->addEntry($mouse); $cart->addEntry($pc_set); // 合計金額を表示 echo $cart->getPrice().'円'; // 6801円と表示されるはず composite_client.php
  • 36.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 36 参考文献
  • 37.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 37 参考文献 „ PHPでGoFデザインパターンを実装したい • PHPによるデザインパターン入門 9 http://www.doyouphp.jp/book/book_phpdp.shtml 9 23のデザインパターンが全てPHPのコードで紹介されています。コードも分かりやすいので学習用におすすめ です。
  • 38.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 38 【CM】アシアルスクール
  • 39.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 39 アシアルスクールのご案内 „ Web関連技術を集中的かつ体系的に学べる研修サービスです • 半日~二日間の集中講義を中心に実施 • PHPやJavaScript、LinuxといったWeb関連技術が学べます „ URL • http://www.asial.co.jp/school/guide.php „ 例:PHP講座の学習ロードマップ
  • 40.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 40 アシアル塾のご案内 „ 1回3,000円でWeb技術を約90分学習できる格安の教育サービスです • 60分の講義+30分の復習&質問タイム „ 主な対象 • IT業界やWeb業界で働いているプロの方の学習を応援します! 9 Webデザイナーの方大歓迎 • 技術を分かりやすく教えます „ 絶対理解保証キャンペーン実施中 • もし講義内容にご満足いただけなかった場合は返金いたします 9 (返金手数料のみ頂戴いたします) „ URL • http://www.asial.co.jp/school/juku.php
  • 41.
    URL : http://www.asial.co.jp/│ Copyright © Asial Corporation. All Rights Reserved. │ 41 企業研修のご案内 „ アシアルではWeb技術に関する企業研修を行っています • 技術職採用の社員に向けた新人研修・中途採用者向け研修 • 総合職向けのWeb技術入門研修 „ 主な実績 • グリー株式会社様 • 株式会社ドワンゴ様 • 株式会社朝日新聞社様 • 他多数(詳しくは、Webサイトをご参照下さい) „ URL • http://www.asial.co.jp/business/training/