Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

18,760 views

Published on

Published in: Business
  • Be the first to comment

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

  1. 1. PHPではじめるオブジェクト指向 VOYAGE GROUP 田中 康一
  2. 2. 自己紹介田中康一株式会社 VOYAGE GROUP 子会社のFlesselで ケータイサイト開発・運用PHP歴11年Twitter: @mugeso
  3. 3. アジェンダ自己紹介アジェンダオブジェクト指向とはPHPでのオブジェクト指向オブジェクト指向の原則・法則・格言
  4. 4. オブジェクト指向とは
  5. 5. オブジェクトデータを持っている振る舞いを持っている
  6. 6. メッセージをやり取りするオブジェクト オブジェクト メッセージ メッセージ オブジェクト
  7. 7. Web開発現場だと 開発依頼ディレクター PM デザイン依頼 実装依頼 デザイナ プログラマ
  8. 8. PHPでのオブジェクト指向
  9. 9. クラス
  10. 10. 例えば 社員 クラス山田さん 鈴木さん 佐藤さん インスタンス
  11. 11. コード例class Employee{ private $_name; public function __construct($name) { $this->_name = $name; } public function getName() { return $this->_name; }}$yamada = new Employee(‘山田’);
  12. 12. 継承
  13. 13. 例えば 社員 継承元(親クラス)ディレクター エンジニア デザイナ 派生(子クラス)
  14. 14. コード例class Designer extends Employee{ public function design() { // デザイン処理の実装 }}$designer = new Designer(‘山田’);$designer->getName(); // Employeeで定義$designer->design(); // Designerで定義
  15. 15. インターフェイス
  16. 16. 例えば デザイン依頼ディレクター デザイナ この関係を ディレクターが求めている事に 注目してみると
  17. 17. 例えば デザイン依頼ディレクター デザインできるこのように置き換える事ができます。 この「デザインできる」が インターフェイスです。
  18. 18. 例えば デザインできる デザイナ デザイン会社 実装としてデザイナやデザイン会社があります。
  19. 19. 例えば デザイン依頼 ディレクター デザイン会社ディレクターは「デザインできる」という インターフェイスに基づき デザイン会社に依頼できます
  20. 20. コード例interface DesignerInterface{ public function design();}class Designer extends Employee implements DesignerInterface // デザイナインターフェイスを実装{ public function design() { // デザイン処理の実装 }}
  21. 21. コード例// interface DesignerInterface// {// public function design();// }class DesignerCompany extends Company // 継承元は会社クラス implements DesignerInterface // デザイナインターフェイスを実装{ public function design() { // デザイン処理の実装 }}
  22. 22. その他機能多重継承インターフェイス同士の継承定数定義
  23. 23. トレイト
  24. 24. 例えば……現実世界で例えるのは少し難しい
  25. 25. 例えば!映画マトリックスでヘリコプターの操縦方法をインストールしたような感じ。
  26. 26. 例えばエンジニア デザイナ エンジニアとデザイナの 技術を抜き出して
  27. 27. 例えば エンジニア デザイナプログラミング 技術 エンジニアとデザイナの 技術を抜き出して
  28. 28. 例えば エンジニア デザイナプログラミング デザイン 技術 技術 エンジニアとデザイナの 技術を抜き出して
  29. 29. 例えば ハイパー クリエーター プログラミング法 デザイン法再利用ができます。
  30. 30. 例えば フリーランス ハイパー クリエーター継承元が違ってもOK!
  31. 31. コード例 (トレイト定義)trait CodingTrait{ public function coding($design, $repository) { // 実装 }}
  32. 32. コード例 (トレイトの利用)class Engineer extends Employee{ use CodingTrait;}$engineer = new Engineer(‘加藤’);$engineer->coding($design, $repository);
  33. 33. コード例 (トレイト定義)trait DesignTrait{ public function design($info, $repository) { // 実装 }}
  34. 34. コード例 (トレイトの利用)class HyperCreator{ use CodingTrait, DesignTrait;}$creator = new HyperCreator(‘北村’);$creator->coding($design, $repository);$creator->design($info, $repository);
  35. 35. もしここでtrait CodingTrait{ public function coding($design, $repository) {/* 略 */} public function design($info, $repository) {/* 略 */}}trait DesignTrait{ public function design($info, $repository) {/* 略 */}}
  36. 36. もしここでtrait CodingTrait{ public function coding($design, $repository) {/* 略 */} public function design($info, $repository) {/* 略 */}}trait DesignTrait{ public function design($info, $repository) {/* 略 */}} メソッド名が被っていたら
  37. 37. 別名をつける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);
  38. 38. その他機能メソッドの可視性の変更トレイトを組み合わせたトレイトトレイトのメンバーの抽象化静的なメンバープロパティ
  39. 39. 名前空間
  40. 40. 例えば人事部 開発部部長 部長 同じ部長でも仕事が違う 区別したい
  41. 41. コード例<?php //fileA.phpnamespace Personnel;class Boss{}<?php //fileB.phpnamespace DevelopDepartment;class Boss{}
  42. 42. コード例<?php // fileC.phpuse DevelopmentDepart;$hoge = new Boss(); // これは開発部部長<?php // fileD.phpuse Personnel;$hoge = new Boss(); // これは人事部部長$foo = new DevelopmentDepart¥Boss();
  43. 43. 原則・法則・格言
  44. 44. 注意設計・コーディングの際に意識しましょう必ず守らなければイケナイわけではありません理由があればこれらを破るのもアリです
  45. 45. デメテルの法則
  46. 46. ディレクター ディレクターデザイン会社 デザイン会社 デザイナ デザイナ 契約関係 指示の流れ
  47. 47. デザイン会社で人事異動発生!!
  48. 48. 担当デザイナが交代
  49. 49. ディレクター ディレクターデザイン会社 デザイン会社 デザイナ デザイナ どっちが楽ですか?
  50. 50. コーディングではメソッドに渡されたオブジェクトとメンバオブジェクトのみにメッセージを送る1行に->は1つまで
  51. 51. 単一責任の原則 (SRP)
  52. 52. 「クラスを変更する理由は1つ以上存在してはならない」
  53. 53. 社員じつはこいつは大きすぎる
  54. 54. 考えられる変更理由社員番号を持たせたい給与を振り込めるようにしたい人事評価をできるようにしたい人事評価の方法を変更したい
  55. 55. 社員 給与 人事評価変更理由を考えるとこのように分割できる
  56. 56. リスコフの置換原則 (LSP)
  57. 57. 「派生型はその基本型と置換可能でなければならない」
  58. 58. 登場人物 社員 人事 プログラマ西野さん 北野さん
  59. 59. 西野さん 北野さん
  60. 60. 西野さん 北野さん 人事評価なんだけど
  61. 61. 西野さん 北野さん 人事評価なんだけど え?何のことです?
  62. 62. 西野さん 北野さん 人事評価なんだけど え?何のことです? 社員なら分かれよ・・・
  63. 63. 西野さん 北野さん 人事評価なんだけど え?何のことです? 社員なら分かれよ・・・ 社員ができる事は プログラマもできるべき!
  64. 64. 具体的には基本クラスのメソッドを使えなくする派生クラスから例外をなげる これはNG!!!
  65. 65. 開放閉鎖の原則
  66. 66. ソフトウェアの構成要素は、 拡張に対して開いていて、修正に対して閉じていなければならない。
  67. 67. うまく出来ている例ブラウザのプラグイン外付けハードディスク(パソコンのネジをあけなくても使える)
  68. 68. 依存関係逆転 の原則
  69. 69. 「上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも『抽象』に依存すべきである。」「『抽象』は実装の詳細に依存してはならない。実装の詳細が『抽象』に依存すべきである。」
  70. 70. 事業責任者ディレクター そのものに依存 デザイナ
  71. 71. ディレクション 事業責任者 できるデザインできる ディレクター デザイナ 求める能力にだけ依存
  72. 72. インターフェイス分離 の原則
  73. 73. 「クライアントに、クライアントが利用しないメソッドへの依存を 強制してはならない。」
  74. 74. 例えば 個人 契約できる *個人契約する *法人契約する株式会社 個人は法人契約は 知らなくていい
  75. 75. 例えば 個人 個人契約できる株式会社 法人契約できるインターフェイスを分離する
  76. 76. Tell,Don’t Ask.
  77. 77. 例えば(ask)ディレクタ デザイナ
  78. 78. 例えば(ask)ディレクタ デザイナ 背景は何色?
  79. 79. 例えば(ask)ディレクタ デザイナ 背景は何色? #348fddです
  80. 80. 例えば(ask)ディレクタ デザイナ 背景は何色? #348fddです ここは何px?
  81. 81. 例えば(tell)ディレクタ デザイナ
  82. 82. 例えば(tell)ディレクタ デザイナ このコンセプトで デザインよろしく。 終わったら送って。
  83. 83. 例えば(tell)ディレクタ デザイナ このコンセプトで デザインよろしく。 終わったら送って。 できました。 こちらです。
  84. 84. 後者の方が役割分担ができている。
  85. 85. コーディングではgetter,setterは極力使わない getter = getHoge setter = setHoge
  86. 86. 参考文献http://php.net/manual/http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdfhttp://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/oo-principles.htmlhttp://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

×