SlideShare une entreprise Scribd logo
1  sur  41
Télécharger pour lire hors ligne
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/

Contenu connexe

Tendances

ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する増田 亨
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primerオブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer増田 亨
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talkkyon mm
 
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Akito Tsukahara
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門増田 亨
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Pythonkwatch
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
3週連続DDDその3 ドメイン駆動設計 戦略的設計
3週連続DDDその3  ドメイン駆動設計 戦略的設計3週連続DDDその3  ドメイン駆動設計 戦略的設計
3週連続DDDその3 ドメイン駆動設計 戦略的設計増田 亨
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
 
RDRA DDD Agile
RDRA DDD AgileRDRA DDD Agile
RDRA DDD Agile増田 亨
 

Tendances (20)

ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primerオブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
 
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
3週連続DDDその3 ドメイン駆動設計 戦略的設計
3週連続DDDその3  ドメイン駆動設計 戦略的設計3週連続DDDその3  ドメイン駆動設計 戦略的設計
3週連続DDDその3 ドメイン駆動設計 戦略的設計
 
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
 
RDRA DDD Agile
RDRA DDD AgileRDRA DDD Agile
RDRA DDD Agile
 

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

jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークkenjis
 
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)アシアル株式会社
 
Getting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreGetting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreChihiro Ito
 
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲アシアル株式会社
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介Akira Tanaka
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinigTom Hayakawa
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)アシアル株式会社
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
HTML5プロフェッショナル認定試験対策講座
HTML5プロフェッショナル認定試験対策講座HTML5プロフェッショナル認定試験対策講座
HTML5プロフェッショナル認定試験対策講座アシアル株式会社
 
開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015
開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015
開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015Shigeharu Yamaoka
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」ericsagnes
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
初めてのPadrino
初めてのPadrino初めてのPadrino
初めてのPadrinoTakeshi Yabe
 
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Frameworks We Live By: Design by day-to-day framework development: Multi-para...Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Frameworks We Live By: Design by day-to-day framework development: Multi-para...Atsuhiro Kubo
 
PHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 SilexPHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 SilexMasao Maeda
 

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

jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
 
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド(体験版)
 
Getting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreGetting started MySQL as Document Data Store
Getting started MySQL as Document Data Store
 
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Cakephp
CakephpCakephp
Cakephp
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)
書籍『Monacaで学ぶはじめてのプログラミング』 講義スライド第2弾(体験版)
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
HTML5プロフェッショナル認定試験対策講座
HTML5プロフェッショナル認定試験対策講座HTML5プロフェッショナル認定試験対策講座
HTML5プロフェッショナル認定試験対策講座
 
開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015
開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015
開発初心者のためのMoodleプラグインの開発と利用(第二部) for Moodle Moot 2015
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
初めてのPadrino
初めてのPadrino初めてのPadrino
初めてのPadrino
 
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Frameworks We Live By: Design by day-to-day framework development: Multi-para...Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
 
PHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 SilexPHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 Silex
 

Plus de アシアル株式会社

Monacaによるモバイルアプリ開発ことはじめ
Monacaによるモバイルアプリ開発ことはじめMonacaによるモバイルアプリ開発ことはじめ
Monacaによるモバイルアプリ開発ことはじめアシアル株式会社
 
kintone 連携スマホアプリの開発・配布体験
kintone 連携スマホアプリの開発・配布体験kintone 連携スマホアプリの開発・配布体験
kintone 連携スマホアプリの開発・配布体験アシアル株式会社
 
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)アシアル株式会社
 
書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)
書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)
書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)アシアル株式会社
 
Onsen UI 2 開発における JS フレームワーク衝突事例集
Onsen UI 2 開発における JS フレームワーク衝突事例集Onsen UI 2 開発における JS フレームワーク衝突事例集
Onsen UI 2 開発における JS フレームワーク衝突事例集アシアル株式会社
 
Web標準技術で iOS、Android両対応アプリを開発
Web標準技術でiOS、Android両対応アプリを開発Web標準技術でiOS、Android両対応アプリを開発
Web標準技術で iOS、Android両対応アプリを開発 アシアル株式会社
 
Onsen UI の最近とこれから 〜 国内サポートはじめました
Onsen UI の最近とこれから 〜 国内サポートはじめましたOnsen UI の最近とこれから 〜 国内サポートはじめました
Onsen UI の最近とこれから 〜 国内サポートはじめましたアシアル株式会社
 
Monaca事例から学ぶHTML5モバイルアプリの活用ポイント
Monaca事例から学ぶHTML5モバイルアプリの活用ポイントMonaca事例から学ぶHTML5モバイルアプリの活用ポイント
Monaca事例から学ぶHTML5モバイルアプリの活用ポイントアシアル株式会社
 
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法アシアル株式会社
 
モバイル用Webフレームワーク最前線
モバイル用Webフレームワーク最前線モバイル用Webフレームワーク最前線
モバイル用Webフレームワーク最前線アシアル株式会社
 
Monacaソリューションセミナー20160621
Monacaソリューションセミナー20160621Monacaソリューションセミナー20160621
Monacaソリューションセミナー20160621アシアル株式会社
 
創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ
創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ
創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀアシアル株式会社
 
HTML5ハイブリッドアプリ開発 で拓くビジネスチャンス
HTML5ハイブリッドアプリ開発で拓くビジネスチャンスHTML5ハイブリッドアプリ開発で拓くビジネスチャンス
HTML5ハイブリッドアプリ開発 で拓くビジネスチャンス アシアル株式会社
 

Plus de アシアル株式会社 (20)

MonacaとEducation活動の紹介
MonacaとEducation活動の紹介MonacaとEducation活動の紹介
MonacaとEducation活動の紹介
 
PWA 4 Business
PWA 4 BusinessPWA 4 Business
PWA 4 Business
 
Monacaによるモバイルアプリ開発ことはじめ
Monacaによるモバイルアプリ開発ことはじめMonacaによるモバイルアプリ開発ことはじめ
Monacaによるモバイルアプリ開発ことはじめ
 
kintone 連携スマホアプリの開発・配布体験
kintone 連携スマホアプリの開発・配布体験kintone 連携スマホアプリの開発・配布体験
kintone 連携スマホアプリの開発・配布体験
 
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
 
書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)
書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)
書籍『Monacaで学ぶはじめてのプログラミング』発展資料(試験問題アプリ編)
 
Onsen UI 2 開発における JS フレームワーク衝突事例集
Onsen UI 2 開発における JS フレームワーク衝突事例集Onsen UI 2 開発における JS フレームワーク衝突事例集
Onsen UI 2 開発における JS フレームワーク衝突事例集
 
Web標準技術で iOS、Android両対応アプリを開発
Web標準技術でiOS、Android両対応アプリを開発Web標準技術でiOS、Android両対応アプリを開発
Web標準技術で iOS、Android両対応アプリを開発
 
Cordovaの特徴と開発手法概要
Cordovaの特徴と開発手法概要Cordovaの特徴と開発手法概要
Cordovaの特徴と開発手法概要
 
Html5/JSモバイルアプリ最前線
Html5/JSモバイルアプリ最前線Html5/JSモバイルアプリ最前線
Html5/JSモバイルアプリ最前線
 
Onsen UI の最近とこれから 〜 国内サポートはじめました
Onsen UI の最近とこれから 〜 国内サポートはじめましたOnsen UI の最近とこれから 〜 国内サポートはじめました
Onsen UI の最近とこれから 〜 国内サポートはじめました
 
Monaca事例から学ぶHTML5モバイルアプリの活用ポイント
Monaca事例から学ぶHTML5モバイルアプリの活用ポイントMonaca事例から学ぶHTML5モバイルアプリの活用ポイント
Monaca事例から学ぶHTML5モバイルアプリの活用ポイント
 
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法
 
Gartner summit 2016
Gartner summit 2016Gartner summit 2016
Gartner summit 2016
 
モバイル用Webフレームワーク最前線
モバイル用Webフレームワーク最前線モバイル用Webフレームワーク最前線
モバイル用Webフレームワーク最前線
 
Monacaソリューションセミナー20160621
Monacaソリューションセミナー20160621Monacaソリューションセミナー20160621
Monacaソリューションセミナー20160621
 
20160308seminar2
20160308seminar220160308seminar2
20160308seminar2
 
Nifty cloud mbaas
Nifty cloud mbaasNifty cloud mbaas
Nifty cloud mbaas
 
創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ
創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ
創業明治33年の衣料卸問屋がﰀ アプリで挑むコミュニケーション変革 ﰀ ~MonacaとmBaaSを活用したﰀ ビジネスチャットアプリの紹介〜 ﰀ
 
HTML5ハイブリッドアプリ開発 で拓くビジネスチャンス
HTML5ハイブリッドアプリ開発で拓くビジネスチャンスHTML5ハイブリッドアプリ開発で拓くビジネスチャンス
HTML5ハイブリッドアプリ開発 で拓くビジネスチャンス
 

【アシアル塾】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/