phpではじめるオブジェクト指向(公開用)

86
PHPではじめる オブジェクト指向 VOYAGE GROUP 田中 康一

Upload: voyage-group

Post on 20-Dec-2014

15.882 views

Category:

Business


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Phpではじめるオブジェクト指向(公開用)

PHPではじめるオブジェクト指向

VOYAGE GROUP田中 康一

Page 2: Phpではじめるオブジェクト指向(公開用)

自己紹介田中康一

株式会社 VOYAGE GROUP

子会社のFlesselでケータイサイト開発・運用

PHP歴11年

Twitter: @mugeso

Page 3: Phpではじめるオブジェクト指向(公開用)

アジェンダ自己紹介

アジェンダ

オブジェクト指向とは

PHPでのオブジェクト指向

オブジェクト指向の原則・法則・格言

Page 4: Phpではじめるオブジェクト指向(公開用)

オブジェクト指向とは

Page 5: Phpではじめるオブジェクト指向(公開用)

オブジェクトデータを持っている

振る舞いを持っている

Page 6: Phpではじめるオブジェクト指向(公開用)

メッセージをやり取りする

オブジェクト オブジェクト

オブジェクト

メッセージメッセージ

Page 7: Phpではじめるオブジェクト指向(公開用)

Web開発現場だと

ディレクター PM

プログラマ

開発依頼

実装依頼

デザイナ

デザイン依頼

Page 8: Phpではじめるオブジェクト指向(公開用)

PHPでのオブジェクト指向

Page 9: Phpではじめるオブジェクト指向(公開用)

クラス

Page 10: Phpではじめるオブジェクト指向(公開用)

例えば

社員

山田さん 鈴木さん 佐藤さん

クラス

インスタンス

Page 11: Phpではじめるオブジェクト指向(公開用)

コード例class Employee{ private $_name; public function __construct($name) { $this->_name = $name; } public function getName() { return $this->_name; }}

$yamada = new Employee(‘山田’);

Page 12: Phpではじめるオブジェクト指向(公開用)

継承

Page 13: Phpではじめるオブジェクト指向(公開用)

例えば

社員

ディレクター エンジニア デザイナ

継承元(親クラス)

派生(子クラス)

Page 14: Phpではじめるオブジェクト指向(公開用)

コード例class Designer extends Employee{ public function design() { // デザイン処理の実装 }}

$designer = new Designer(‘山田’);$designer->getName(); // Employeeで定義$designer->design(); // Designerで定義

Page 15: Phpではじめるオブジェクト指向(公開用)

インターフェイス

Page 16: Phpではじめるオブジェクト指向(公開用)

例えば

デザイナディレクターデザイン依頼

この関係をディレクターが求めている事に

注目してみると

Page 17: Phpではじめるオブジェクト指向(公開用)

例えば

ディレクターデザイン依頼

デザインできる

このように置き換える事ができます。この「デザインできる」がインターフェイスです。

Page 18: Phpではじめるオブジェクト指向(公開用)

例えば

デザイナ

デザインできる

デザイン会社

実装としてデザイナやデザイン会社があります。

Page 19: Phpではじめるオブジェクト指向(公開用)

例えば

デザイン会社ディレクターデザイン依頼

ディレクターは「デザインできる」というインターフェイスに基づき

デザイン会社に依頼できます

Page 20: Phpではじめるオブジェクト指向(公開用)

コード例interface DesignerInterface{ public function design();}

class Designer extends Employee implements DesignerInterface // ⬅デザイナインターフェイスを実装

{ public function design() { // デザイン処理の実装 }}

Page 21: Phpではじめるオブジェクト指向(公開用)

コード例// interface DesignerInterface// {// public function design();// }

class DesignerCompany extends Company // 継承元は会社クラス implements DesignerInterface // ⬅デザイナインターフェイスを実装

{ public function design() { // デザイン処理の実装 }}

Page 22: Phpではじめるオブジェクト指向(公開用)

その他機能多重継承

インターフェイス同士の継承

定数定義

Page 23: Phpではじめるオブジェクト指向(公開用)

トレイト

Page 24: Phpではじめるオブジェクト指向(公開用)

例えば……現実世界で例えるのは少し難しい

Page 25: Phpではじめるオブジェクト指向(公開用)

例えば!映画マトリックスでヘリコプターの操縦方法をインストールしたような感じ。

Page 26: Phpではじめるオブジェクト指向(公開用)

例えばエンジニア デザイナ

エンジニアとデザイナの技術を抜き出して

Page 27: Phpではじめるオブジェクト指向(公開用)

例えばエンジニア

プログラミング技術

デザイナ

エンジニアとデザイナの技術を抜き出して

Page 28: Phpではじめるオブジェクト指向(公開用)

例えばエンジニア

プログラミング技術

デザイナ

デザイン技術

エンジニアとデザイナの技術を抜き出して

Page 29: Phpではじめるオブジェクト指向(公開用)

例えば

ハイパークリエーター

プログラミング法

デザイン法

再利用ができます。

Page 30: Phpではじめるオブジェクト指向(公開用)

例えば

ハイパークリエーター

フリーランス

継承元が違ってもOK!

Page 31: Phpではじめるオブジェクト指向(公開用)

コード例(トレイト定義)

trait CodingTrait{ public function coding($design, $repository) { // 実装 }}

Page 32: Phpではじめるオブジェクト指向(公開用)

コード例(トレイトの利用)

class Engineer extends Employee{ use CodingTrait;}

$engineer = new Engineer(‘加藤’);$engineer->coding($design, $repository);

Page 33: Phpではじめるオブジェクト指向(公開用)

コード例(トレイト定義)

trait DesignTrait{ public function design($info, $repository) { // 実装 }}

Page 34: Phpではじめるオブジェクト指向(公開用)

コード例(トレイトの利用)

class HyperCreator{ use CodingTrait, DesignTrait;}

$creator = new HyperCreator(‘北村’);$creator->coding($design, $repository);$creator->design($info, $repository);

Page 35: Phpではじめるオブジェクト指向(公開用)

もしここでtrait CodingTrait{ public function coding($design, $repository) {/* 略 */} public function design($info, $repository) {/* 略 */}}

trait DesignTrait{ public function design($info, $repository) {/* 略 */}}

Page 36: Phpではじめるオブジェクト指向(公開用)

もしここでtrait CodingTrait{ public function coding($design, $repository) {/* 略 */} public function design($info, $repository) {/* 略 */}}

trait DesignTrait{ public function design($info, $repository) {/* 略 */}}

メソッド名が被っていたら

Page 37: Phpではじめるオブジェクト指向(公開用)

別名をつけるclass HyperCreator{ use CodingTrait, DesignTrait { CodingTrait::design insteadof designCode; DesignTrait::design insteadof designUi; }}

$creator = new HyperCreator(‘北村’);$creator->coding($design, $repository);$creator->designCode($info, $repository);$creator->designUi($info, $repository);

Page 38: Phpではじめるオブジェクト指向(公開用)

その他機能メソッドの可視性の変更

トレイトを組み合わせたトレイト

トレイトのメンバーの抽象化

静的なメンバー

プロパティ

Page 39: Phpではじめるオブジェクト指向(公開用)

名前空間

Page 40: Phpではじめるオブジェクト指向(公開用)

部長

人事部

部長

開発部

同じ部長でも仕事が違う区別したい

例えば

Page 41: Phpではじめるオブジェクト指向(公開用)

コード例<?php //fileA.phpnamespace Personnel;class Boss{}

<?php //fileB.phpnamespace DevelopDepartment;class Boss{}

Page 42: Phpではじめるオブジェクト指向(公開用)

コード例<?php // fileC.phpuse DevelopmentDepart;$hoge = new Boss(); // これは開発部部長

<?php // fileD.phpuse Personnel;$hoge = new Boss(); // これは人事部部長$foo = new DevelopmentDepart¥Boss();

Page 43: Phpではじめるオブジェクト指向(公開用)

原則・法則・格言

Page 44: Phpではじめるオブジェクト指向(公開用)

注意設計・コーディングの際に意識しましょう

必ず守らなければイケナイわけではありません

理由があればこれらを破るのもアリです

Page 45: Phpではじめるオブジェクト指向(公開用)

デメテルの法則

Page 46: Phpではじめるオブジェクト指向(公開用)

ディレクター

デザイナ

デザイン会社

ディレクター

デザイナ

デザイン会社

契約関係 指示の流れ

Page 47: Phpではじめるオブジェクト指向(公開用)

デザイン会社で人事異動発生!!

Page 48: Phpではじめるオブジェクト指向(公開用)

担当デザイナが交代

Page 49: Phpではじめるオブジェクト指向(公開用)

ディレクター

デザイナ

デザイン会社

ディレクター

デザイナ

デザイン会社

どっちが楽ですか?

Page 50: Phpではじめるオブジェクト指向(公開用)

コーディングではメソッドに渡されたオブジェクトとメンバオブジェクトのみにメッセージを送る

1行に->は1つまで

Page 51: Phpではじめるオブジェクト指向(公開用)

単一責任の原則(SRP)

Page 52: Phpではじめるオブジェクト指向(公開用)

「クラスを変更する理由は1つ以上存在してはならない」

Page 53: Phpではじめるオブジェクト指向(公開用)

社員

じつはこいつは大きすぎる

Page 54: Phpではじめるオブジェクト指向(公開用)

考えられる変更理由社員番号を持たせたい

給与を振り込めるようにしたい

人事評価をできるようにしたい

人事評価の方法を変更したい

Page 55: Phpではじめるオブジェクト指向(公開用)

社員

人事評価

給与

変更理由を考えるとこのように分割できる

Page 56: Phpではじめるオブジェクト指向(公開用)

リスコフの置換原則(LSP)

Page 57: Phpではじめるオブジェクト指向(公開用)

「派生型はその基本型と置換可能でなければならない」

Page 58: Phpではじめるオブジェクト指向(公開用)

プログラマ人事

社員

西野さん 北野さん

登場人物

Page 59: Phpではじめるオブジェクト指向(公開用)

西野さん 北野さん

Page 60: Phpではじめるオブジェクト指向(公開用)

西野さん 北野さん

人事評価なんだけど

Page 61: Phpではじめるオブジェクト指向(公開用)

西野さん 北野さん

人事評価なんだけど

え?何のことです?

Page 62: Phpではじめるオブジェクト指向(公開用)

西野さん 北野さん

人事評価なんだけど

え?何のことです?

社員なら分かれよ・・・

Page 63: Phpではじめるオブジェクト指向(公開用)

西野さん 北野さん

人事評価なんだけど

え?何のことです?

社員なら分かれよ・・・

社員ができる事はプログラマもできるべき!

Page 64: Phpではじめるオブジェクト指向(公開用)

具体的には基本クラスのメソッドを使えなくする

派生クラスから例外をなげる

これはNG!!!

Page 65: Phpではじめるオブジェクト指向(公開用)

開放閉鎖の原則

Page 66: Phpではじめるオブジェクト指向(公開用)

ソフトウェアの構成要素は、拡張に対して開いていて、

修正に対して閉じていなければならない。

Page 67: Phpではじめるオブジェクト指向(公開用)

うまく出来ている例ブラウザのプラグイン

外付けハードディスク(パソコンのネジをあけなくても使える)

Page 68: Phpではじめるオブジェクト指向(公開用)

依存関係逆転の原則

Page 69: Phpではじめるオブジェクト指向(公開用)

「上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも『抽象』に依存すべきである。」

「『抽象』は実装の詳細に依存してはならない。実装の詳細が『抽象』に依存すべきである。」

Page 70: Phpではじめるオブジェクト指向(公開用)

ディレクター

デザイナ

事業責任者

そのものに依存

Page 71: Phpではじめるオブジェクト指向(公開用)

ディレクター

デザイナ

事業責任者 ディレクションできる

デザインできる

求める能力にだけ依存

Page 72: Phpではじめるオブジェクト指向(公開用)

インターフェイス分離の原則

Page 73: Phpではじめるオブジェクト指向(公開用)

「クライアントに、クライアントが利用しないメソッドへの依存を

強制してはならない。」

Page 74: Phpではじめるオブジェクト指向(公開用)

例えば

契約できる*個人契約する*法人契約する

個人

株式会社

個人は法人契約は知らなくていい

Page 75: Phpではじめるオブジェクト指向(公開用)

例えば

個人

株式会社

インターフェイスを分離する

個人契約できる

法人契約できる

Page 76: Phpではじめるオブジェクト指向(公開用)

Tell,Don’t Ask.

Page 77: Phpではじめるオブジェクト指向(公開用)

例えば(ask)ディレクタ デザイナ

Page 78: Phpではじめるオブジェクト指向(公開用)

例えば(ask)ディレクタ デザイナ

背景は何色?

Page 79: Phpではじめるオブジェクト指向(公開用)

例えば(ask)ディレクタ デザイナ

背景は何色?

#348fddです

Page 80: Phpではじめるオブジェクト指向(公開用)

例えば(ask)ディレクタ デザイナ

背景は何色?

#348fddです

ここは何px?

Page 81: Phpではじめるオブジェクト指向(公開用)

例えば(tell)ディレクタ デザイナ

Page 82: Phpではじめるオブジェクト指向(公開用)

例えば(tell)ディレクタ デザイナ

このコンセプトでデザインよろしく。終わったら送って。

Page 83: Phpではじめるオブジェクト指向(公開用)

例えば(tell)ディレクタ デザイナ

このコンセプトでデザインよろしく。終わったら送って。

できました。こちらです。

Page 84: Phpではじめるオブジェクト指向(公開用)

後者の方が役割分担ができている。

Page 85: Phpではじめるオブジェクト指向(公開用)

コーディングではgetter,setterは極力使わない

getter = getHoge

setter = setHoge

Page 86: Phpではじめるオブジェクト指向(公開用)

参考文献http://php.net/manual/

http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf

http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/oo-principles.html

http://wiki.shos.info/index.php?%A1%DA%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE%A1%DB%A5%AA