Trait とは? その使い道を考えてみる

11,301 views

Published on

使い道を考える時間があまりありませんでした。教えてください。

Published in: Technology
0 Comments
23 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,301
On SlideShare
0
From Embeds
0
Number of Embeds
87
Actions
Shares
0
Downloads
11
Comments
0
Likes
23
Embeds 0
No embeds

No notes for slide

Trait とは? その使い道を考えてみる

  1. 1. Trait とは? その使い道を考えてみる 藤村 拓也 @tlync12年8月9日木曜日
  2. 2. 自己紹介12年8月9日木曜日
  3. 3. 自己紹介 • 藤村 拓也@tlync • アプリケーション開発第二 • 最近の関心事 • Scala, Agile(Project Mgt.) • PHP は生きる為にやっています12年8月9日木曜日
  4. 4. ※ ちなみに残念ながら? PHP の Trait のお話しです12年8月9日木曜日
  5. 5. Trait を知ってる人?12年8月9日木曜日
  6. 6. Trait を説明できる人?12年8月9日木曜日
  7. 7. trait /tréit ¦ tréi/ 名 詞 形式的 1 (性格習慣の)特徴, 特色, 特質 admirable traits like honesty and courage|誠実さや勇気と いったすばらしい特質 American traits|米国国民性. 2 希用語 (ペン鉛筆などの)一筆, 筆使い;(性質など の)気味, 気配 of ... a trait of sadness|一まつの悲哀.12年8月9日木曜日
  8. 8. 特徴, 特色, 特質12年8月9日木曜日
  9. 9. Trait とは? • メソッドとプロパティの集合 • 単一継承の制約を軽減する • 継承関係とは関係なく、共通の特性、 振舞いを再利用(水平展開)できる • それ自体ではインスタンス化できない12年8月9日木曜日
  10. 10. 継承関係と関係なく 実装 を 再利用 できる仕組み12年8月9日木曜日
  11. 11. PHP 5.4 <=12年8月9日木曜日
  12. 12. 他言語での類似の機構 • Scala … trait • Perl 6 … role • Ruby … Mix-in ※同様の概念だが仕様は微妙に異なる。 型情報を持つか(is_aをパスするか)とか。12年8月9日木曜日
  13. 13. 簡単なサンプル12年8月9日木曜日
  14. 14. trait Engine { public function startEngine() { echo BRRRM!; } } class Car { use Engine; } (new Car)->startEngine(); // BRRRM!12年8月9日木曜日
  15. 15. これは継承でも できなくはない12年8月9日木曜日
  16. 16. では、これは?12年8月9日木曜日
  17. 17. class Vehicle { protected function startEngine() { echo ⚡; } } class Plane extends Vehicle { public function fly() { echo ✈; } } class Boat extends Vehicle { public function sail() { echo ⚓; } }12年8月9日木曜日
  18. 18. class SeaPlane extends ??? { // ボートして走らせたいし、飛行機 として飛ばしたい。どうすれば… }12年8月9日木曜日
  19. 19. Vehicle startEngine() Boat Plane sail() fly() ??? SeaPlane sail() fly()12年8月9日木曜日
  20. 20. 多重継承はできない12年8月9日木曜日
  21. 21. 委譲(Composition) ?12年8月9日木曜日
  22. 22. interface Plane { public function fly(); } interface Boat { public function sail(); }12年8月9日木曜日
  23. 23. class SimplePlane extends Vehicle implements Plane { public function fly() { echo ✈; } } class SimpleBoat extends Vehicle implements Boat { public function sail() { echo ⚓; } }12年8月9日木曜日
  24. 24. class SeaPlane extends Vehicle implements Plane, Boat { private $boat; private $plane; public function __constract() { $this->boat = new SimpleBoat(); $this->plane = new SimplePlane(); } public function sail() { return $this->boat->sail(); } public function fly() { return $this->plane->fly(); } } $seaPlane = new SeaPlane(); $seaPlane->sail(); // ! $seaPlane->fly(); // ✈12年8月9日木曜日
  25. 25. 形式的な記述が多い やや面倒12年8月9日木曜日
  26. 26. Trait で 実装の共有をしてみる12年8月9日木曜日
  27. 27. // 命名はちょっと微妙 trait FlyEngine { public function fly() { echo ✈; } } trait FloatEngine { public function sail() { echo ⚓; } } class SeaPlane implements Plane, Boat // 型の継承 { use FloatEngine, FlyEngine; // 実装の継承 } $seaPlane = new SeaPlane(); $seaPlane->sail(); // ! $seaPlane->fly(); // ✈12年8月9日木曜日
  28. 28. 記述はすっきり 実装の共有ができた12年8月9日木曜日
  29. 29. Vehicle startEngine() Boat Plane sail() BoatEngine fly() FlyEngine sail() fly() SeaPlane sail() BoatEngine FlyEngine fly() sail() fly()12年8月9日木曜日
  30. 30. 型の保証 … Interface 実装の再利用 … trait ※ 注: Scala, Ruby などではまたちょっと違うよ!12年8月9日木曜日
  31. 31. Trait は 継承ツリーに関係なく 実装の再利用を行うだけ12年8月9日木曜日
  32. 32. で、実際どう使うと便利なのか?12年8月9日木曜日
  33. 33. 1. 抽象クラスを作る前に Trait の検討12年8月9日木曜日
  34. 34. 抽象クラスの主な理由は コードの再利用(多分)12年8月9日木曜日
  35. 35. Trait が利用できないか検討する12年8月9日木曜日
  36. 36. ※Trait 中2病には注意しましょう12年8月9日木曜日
  37. 37. 2. Entity の振舞いの共有12年8月9日木曜日
  38. 38. Entity の振舞い • タイムスタンプ管理 • 変更のトレース • ソフトデリート可能か • など…12年8月9日木曜日
  39. 39. trait Timestampable { private $createdAt; private $updatedAt; ... getter, setter /** * Updates createdAt and updatedAt timestamps. */ public function updateTimestamps() { if (null === $this->createdAt) { $this->createdAt = new DateTime(now); } $this->updatedAt = new DateTime(now); } }12年8月9日木曜日
  40. 40. /** * 商品エンティティ */ class Product { use Timestampable, // タイムスタンプを自動で SoftDeletable, // ソフトデリート可能に Activatable; // 活性、非活性を可能に private $name; // 本質的なロジック }12年8月9日木曜日
  41. 41. 312年8月9日木曜日
  42. 42. 時間なかった \(^o^)/12年8月9日木曜日
  43. 43. いいアイディアあったら 教えてください12年8月9日木曜日
  44. 44. まとめ12年8月9日木曜日
  45. 45. Trait を知り、PHP 5.4 時代の 新たな設計を探ろう12年8月9日木曜日
  46. 46. それか12年8月9日木曜日
  47. 47. この会社から PHP を撲滅しよう12年8月9日木曜日
  48. 48. おわり12年8月9日木曜日

×