Submit Search
Upload
Trait とは? その使い道を考えてみる
•
28 likes
•
15,105 views
Takuya Fujimura
Follow
使い道を考える時間があまりありませんでした。教えてください。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 48
Download now
Download to read offline
Recommended
traitを使って楽したい話
traitを使って楽したい話
infinite_loop
ScalaにまつわるNewsな話
ScalaにまつわるNewsな話
Yosuke Mizutani
Akka-Streams in Production
Akka-Streams in Production
Kazunobu Raita
バッチではじめてAkkaを使ってみた (refined)
バッチではじめてAkkaを使ってみた (refined)
Koji Agawa
こわくないScala
こわくないScala
Kota Mizushima
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
Kota Mizushima
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
suno88
新標準PSRに学ぶきれいなPHP
新標準PSRに学ぶきれいなPHP
Yusuke Ando
Recommended
traitを使って楽したい話
traitを使って楽したい話
infinite_loop
ScalaにまつわるNewsな話
ScalaにまつわるNewsな話
Yosuke Mizutani
Akka-Streams in Production
Akka-Streams in Production
Kazunobu Raita
バッチではじめてAkkaを使ってみた (refined)
バッチではじめてAkkaを使ってみた (refined)
Koji Agawa
こわくないScala
こわくないScala
Kota Mizushima
株式会社ドワンゴにおけるScala教育の現状
株式会社ドワンゴにおけるScala教育の現状
Kota Mizushima
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
NetBeans、FuelPHP と過ごしたこの 2 ヶ月
suno88
新標準PSRに学ぶきれいなPHP
新標準PSRに学ぶきれいなPHP
Yusuke Ando
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Masashi Shinbara
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
Masataka Kono
第7回こども病院移転計画調査委員会資料
第7回こども病院移転計画調査委員会資料
f_kodomo
Play jjug2012spring
Play jjug2012spring
Takafumi Ikeda
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
8a1
PSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解する
Wataru Terada
先取り!PHP 7 と WordPress
先取り!PHP 7 と WordPress
Masashi Shinbara
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
龍治 常盤木
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
Natsumi Oki
SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録
Fumiya Sakai
Electronで社内ツールを作ったお話
Electronで社内ツールを作ったお話
sters
DMMの闇に触れた話
DMMの闇に触れた話
Katsunori Tanaka
これから始める人の為のディープラーニング基礎講座
これから始める人の為のディープラーニング基礎講座
NVIDIA Japan
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
Masashi Shinbara
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
Masahito Zembutsu
コンテンツ作りの三原則
コンテンツ作りの三原則
INFOBAHN.inc(株式会社インフォバーン)
More Related Content
Viewers also liked
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Masashi Shinbara
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
Masataka Kono
第7回こども病院移転計画調査委員会資料
第7回こども病院移転計画調査委員会資料
f_kodomo
Play jjug2012spring
Play jjug2012spring
Takafumi Ikeda
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
8a1
PSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解する
Wataru Terada
先取り!PHP 7 と WordPress
先取り!PHP 7 と WordPress
Masashi Shinbara
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
龍治 常盤木
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
Natsumi Oki
SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録
Fumiya Sakai
Electronで社内ツールを作ったお話
Electronで社内ツールを作ったお話
sters
DMMの闇に触れた話
DMMの闇に触れた話
Katsunori Tanaka
これから始める人の為のディープラーニング基礎講座
これから始める人の為のディープラーニング基礎講座
NVIDIA Japan
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
Masashi Shinbara
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
Masahito Zembutsu
コンテンツ作りの三原則
コンテンツ作りの三原則
INFOBAHN.inc(株式会社インフォバーン)
Viewers also liked
(17)
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
第7回こども病院移転計画調査委員会資料
第7回こども病院移転計画調査委員会資料
Play jjug2012spring
Play jjug2012spring
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
【ハンズオン】初めてのUnityで作る「3D野球盤」_"8a1"20150204発表資料
PSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を5分でざっくり理解する
先取り!PHP 7 と WordPress
先取り!PHP 7 と WordPress
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
東京から沖縄に移住したからこそわかるクラウドとコミュニティの有り難み 〜人はもっと自由になれる〜
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
はじめて作ったアプリが10,000ダウンロード達成したから自慢する
SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録
Electronで社内ツールを作ったお話
Electronで社内ツールを作ったお話
DMMの闇に触れた話
DMMの闇に触れた話
これから始める人の為のディープラーニング基礎講座
これから始める人の為のディープラーニング基礎講座
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
コンテンツ作りの三原則
コンテンツ作りの三原則
Trait とは? その使い道を考えてみる
1.
Trait とは?
その使い道を考えてみる 藤村 拓也 @tlync 12年8月9日木曜日
2.
自己紹介 12年8月9日木曜日
3.
自己紹介
• 藤村 拓也@tlync • アプリケーション開発第二 • 最近の関心事 • Scala, Agile(Project Mgt.) • PHP は生きる為にやっています 12年8月9日木曜日
4.
※ ちなみに残念ながら?
PHP の Trait のお話しです 12年8月9日木曜日
5.
Trait を知ってる人? 12年8月9日木曜日
6.
Trait を説明できる人? 12年8月9日木曜日
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.
特徴,
特色, 特質 12年8月9日木曜日
9.
Trait とは?
• メソッドとプロパティの集合 • 単一継承の制約を軽減する • 継承関係とは関係なく、共通の特性、 振舞いを再利用(水平展開)できる • それ自体ではインスタンス化できない 12年8月9日木曜日
10.
継承関係と関係なく
実装 を 再利用 できる仕組み 12年8月9日木曜日
11.
PHP 5.4 <= 12年8月9日木曜日
12.
他言語での類似の機構
• Scala … trait • Perl 6 … role • Ruby … Mix-in ※同様の概念だが仕様は微妙に異なる。 型情報を持つか(is_aをパスするか)とか。 12年8月9日木曜日
13.
簡単なサンプル 12年8月9日木曜日
14.
trait Engine
{ public function startEngine() { echo 'BRRRM!'; } } class Car { use Engine; } (new Car)->startEngine(); // BRRRM! 12年8月9日木曜日
15.
これは継承でも
できなくはない 12年8月9日木曜日
16.
では、これは? 12年8月9日木曜日
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.
class SeaPlane extends
??? { // ボートして走らせたいし、飛行機 として飛ばしたい。どうすれば… } 12年8月9日木曜日
19.
Vehicle
startEngine() Boat Plane sail() fly() ??? SeaPlane sail() fly() 12年8月9日木曜日
20.
多重継承はできない 12年8月9日木曜日
21.
委譲(Composition) ? 12年8月9日木曜日
22.
interface Plane
{ public function fly(); } interface Boat { public function sail(); } 12年8月9日木曜日
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.
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.
形式的な記述が多い
やや面倒 12年8月9日木曜日
26.
Trait で
実装の共有をしてみる 12年8月9日木曜日
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.
記述はすっきり
実装の共有ができた 12年8月9日木曜日
29.
Vehicle
startEngine() Boat Plane sail() BoatEngine fly() FlyEngine sail() fly() SeaPlane sail() BoatEngine FlyEngine fly() sail() fly() 12年8月9日木曜日
30.
型の保証 … Interface
実装の再利用 … trait ※ 注: Scala, Ruby などではまたちょっと違うよ! 12年8月9日木曜日
31.
Trait は
継承ツリーに関係なく 実装の再利用を行うだけ 12年8月9日木曜日
32.
で、実際どう使うと便利なのか? 12年8月9日木曜日
33.
1. 抽象クラスを作る前に
Trait の検討 12年8月9日木曜日
34.
抽象クラスの主な理由は
コードの再利用(多分) 12年8月9日木曜日
35.
Trait が利用できないか検討する 12年8月9日木曜日
36.
※Trait 中2病には注意しましょう 12年8月9日木曜日
37.
2. Entity の振舞いの共有 12年8月9日木曜日
38.
Entity の振舞い
• タイムスタンプ管理 • 変更のトレース • ソフトデリート可能か • など… 12年8月9日木曜日
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.
/**
* 商品エンティティ */ class Product { use Timestampable, // タイムスタンプを自動で SoftDeletable, // ソフトデリート可能に Activatable; // 活性、非活性を可能に private $name; // 本質的なロジック } 12年8月9日木曜日
41.
3 12年8月9日木曜日
42.
時間なかった
\(^o^)/ 12年8月9日木曜日
43.
いいアイディアあったら
教えてください 12年8月9日木曜日
44.
まとめ 12年8月9日木曜日
45.
Trait を知り、PHP 5.4
時代の 新たな設計を探ろう 12年8月9日木曜日
46.
それか 12年8月9日木曜日
47.
この会社から PHP を撲滅しよう 12年8月9日木曜日
48.
おわり 12年8月9日木曜日
Download now