SlideShare a Scribd company logo
1 of 37
Download to read offline
Trait in Scala
2014/05/08
Livesense SICP読書会LT大会
Scala
blog.enfranchisedmind.com/2009/05/scala-not-functional/
Scala
Java8
• interfaceのデフォルト実装
• ラムダ式
• 高階関数
• 型推論の強化
• 並列性の強化(並列コレクション、CompleteFuture)
• 遅延評価
• Stream
• Optional
• etc http://www.infoq.com/jp/articles/java-8-vs-scala
http://news.mynavi.jp/special/2014/java8/
それでもScala
を使いたいか?
こんな資料作るくらい
だからわかりますよね?
本日のテーマ
『トレイト』
なぜトレイトを
とりあげるか?
• トレイトはScalaのオブジェクト指向言語と
してのハイライトの一つだと思う。
• ActorやらFutureやらを使った並行性制御
の利点は多いけど、多くの職業プログラマが
直面する課題は、OOPを使ったソフトウェア
課題の解決にあるのではないかと思う。
• ということで、Scalaの言語紹介としてトレ
イトから取り上げてみる。
$ scala	
scala> “trait”.translate(“ja_JP”)	
res0: List[String] = List(特性, 特徴, 特色)
http://ejje.weblio.jp/content/trait
トレイトとは?
クラスのように、メソッドとフィー
ルドの定義をカプセル化したもの
で、Scalaにおけるコード再利
用の基本単位(コップ本より)
trait Philosophical {	
def philosophize() {	
println(“我思う故に我あり”)	
}	
}
クラスにミックスイン
• 抽象メンバーだけを宣言して、ミックスインする
クラスでの実装を強制
• 実装を定義することもできる
• 複数のトレイトを同時にミックスインすることも
できる
• ミックスインしたメソッドをオーバーライドした
り、super呼び出しすることもできる
trait A {	
def f() // 抽象メソッド	
}	
!
trait B {	
def foo() = println("foo")	
}	
!
trait C {	
def bar() = println("bar")	
}	
!
class D extends A with B with C {	
def f() = foo()	 // 抽象メソッドを実装&トレイトBのfooを呼び出し	
override def bar() = { // トレイトCのbarメソッドをoverride	
super.bar() // トレイトCのbarメソッドを呼び出し	
println("BAR")	
}	
}
インスタンス生成時に
ミックスイン
class Japanese	
!
trait Kansai	
!
trait Kanto	
!
val me = 	
new Japanese with Kansai with Kanto
super呼び出しの線形化
class Animal	
!
trait HasLegs extends Animal	
!
trait FourLegged extends HasLegs	
!
trait Furry extends Animal	
!
class Cat extends Animal	
with Furry with FourLegged
Animal HasLegs
Furry FourLegged
Cat
class Cat extends Animal
with Furry with FourLegged
Cat -> FourLegged ->
HasLegged -> Furry -> Animal
線形化
積み重ね可能な変更
abstract class IntQueue {	
def put(x: Int)	
def get(): Int	
}	
!
import scala.collection.mutable.ArrayBuffer	
class BasicIntQueue {	
private val but = new ArrayBuffer[Int]	
def put(x: Int) = but += x	
def get() = but.remove(0)	
}	
!
trait Doubling extends IntQueue {	
abstract override def put(x: Int) = { 	
super.put(2 * x) 	
}	
}	
!
trait Filtering extends IntQueue {	
abstract override def put(x: Int) = {	
super.put(x.abs) 	
}	
}
val q1 = new BasicIntQueue	
q1.put(10)	
q1.get() // Int = 10	
!
val q2 = new BasicIntQueue with Doubling	
q2.put(10)	
q2.get() // Int = 20	
!
val q3 = new BasicIntQueue with Doubling with
Filtering	
q3.put(-10)	
q3.get() // Int = 20
『Scalaスケーラブルプログラミング』12章より
AOPっぽいことも可能
参考) http://d.hatena.ne.jp/j5ik2o/20101103/1288752727
trait Executor {	
def execute(): Unit	
}	
!
trait LoggableExecutor extends Executor {	
def log(() => Unit):Unit = …	
abstract override def execute(): Unit {	
log { super.execute }	
}	
}	
!
class SomeExecutor extends Executor {	
def execute(): Unit = …	
}	
!
val e = new SomeExecutor with LoggableExecutor	
e.execute
自分型アノテーション
trait A {	
def foo() = “foo”	
}	
!
trait B {	
def bar() = “bar”	
}	
!
trait C {	
this: A with B =>	
def f() = foo + bar	
}	
!
val c = new C with A with B	
c.f // String = foobar
Trait Cのインスタンスを生成す
るにはAとBをミックスインしな
ければならない。CからAとBへ
の依存性を明示することができる。
Cake PatternでDI
class User	
!
trait UserRepositoryComponent {	
val repos: UserRepository	
trait UserRepository {	
def findById(id: Int): User	
}	
}	
!
class UserService {	
this: UserRepositoryComponent =>	
def findById(id: Int): User = {	
repos.findById(id)	
}	
}
trait MySQLUserRepositoryComponent 	
extends UserRepository Component {	
val repos = new MySQLUserRepository	
class MySQLUserRepository = {	
def findById(id: Int): User = …	
}	
}	
!
val userService = 	
new UserService with MySQLUserRepositoryComponent	
!
val user = userService.findById(1)
注)cake pattern
については問題点も指摘
されているので注意
http://togetter.com/li/539827
まとめ
トレイト使うとOOPが気
持ちよくなる。かもね。

More Related Content

What's hot

Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellbitter_fox
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallなおき きしだ
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編takeuchi-tk
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds411周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41Kazumune Katagiri
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6TanUkkii
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数amkt922
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 

What's hot (20)

Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Scalaノススメ
ScalaノススメScalaノススメ
Scalaノススメ
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds411周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
ScalaCL in ScalaKaigi
ScalaCL in ScalaKaigiScalaCL in ScalaKaigi
ScalaCL in ScalaKaigi
 
Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 

Viewers also liked

Web workers&parallel.js html5勉強会lt大会
Web workers&parallel.js   html5勉強会lt大会Web workers&parallel.js   html5勉強会lt大会
Web workers&parallel.js html5勉強会lt大会Yuta Shimakawa
 
Livesense tech night immutable-js at a glance
Livesense tech night   immutable-js at a glanceLivesense tech night   immutable-js at a glance
Livesense tech night immutable-js at a glanceYuta Shimakawa
 
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみるFluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみるYuta Shimakawa
 
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料Yuta Shimakawa
 
型についてあれこれ
型についてあれこれ型についてあれこれ
型についてあれこれYuta Shimakawa
 
タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合Yuta Shimakawa
 
Meva biografia angles xavicid
Meva biografia angles xavicidMeva biografia angles xavicid
Meva biografia angles xavicidxavi1090
 
2009.06.15 呼吸計測結果
2009.06.15 呼吸計測結果2009.06.15 呼吸計測結果
2009.06.15 呼吸計測結果大祐 伊東
 
Faulkner on films
Faulkner on filmsFaulkner on films
Faulkner on filmsgalofix
 
Samplerightlgiht
SamplerightlgihtSamplerightlgiht
Samplerightlgihtadambcarney
 
1421 talk for portsmouth historical association
1421 talk for portsmouth historical association1421 talk for portsmouth historical association
1421 talk for portsmouth historical associationPeter Missen
 
Global laboratory
Global laboratoryGlobal laboratory
Global laboratoryrbuckster
 
Global Laboratory
Global LaboratoryGlobal Laboratory
Global Laboratoryrbuckster
 
Peter missen end of semester 1 state of play
Peter missen end of semester 1 state of playPeter missen end of semester 1 state of play
Peter missen end of semester 1 state of playPeter Missen
 

Viewers also liked (17)

Web workers&parallel.js html5勉強会lt大会
Web workers&parallel.js   html5勉強会lt大会Web workers&parallel.js   html5勉強会lt大会
Web workers&parallel.js html5勉強会lt大会
 
Livesense tech night immutable-js at a glance
Livesense tech night   immutable-js at a glanceLivesense tech night   immutable-js at a glance
Livesense tech night immutable-js at a glance
 
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみるFluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
FluxのDispatcherとAction周りのことでもやもやしていることを晒してみる
 
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
 
型についてあれこれ
型についてあれこれ型についてあれこれ
型についてあれこれ
 
タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合タスクボード始めました(仮)++ アジャイルサムライ他流試合
タスクボード始めました(仮)++ アジャイルサムライ他流試合
 
Organizadores
OrganizadoresOrganizadores
Organizadores
 
Meva biografia angles xavicid
Meva biografia angles xavicidMeva biografia angles xavicid
Meva biografia angles xavicid
 
2009.06.15 呼吸計測結果
2009.06.15 呼吸計測結果2009.06.15 呼吸計測結果
2009.06.15 呼吸計測結果
 
Power medidas
Power medidasPower medidas
Power medidas
 
Heal from within
Heal from withinHeal from within
Heal from within
 
Faulkner on films
Faulkner on filmsFaulkner on films
Faulkner on films
 
Samplerightlgiht
SamplerightlgihtSamplerightlgiht
Samplerightlgiht
 
1421 talk for portsmouth historical association
1421 talk for portsmouth historical association1421 talk for portsmouth historical association
1421 talk for portsmouth historical association
 
Global laboratory
Global laboratoryGlobal laboratory
Global laboratory
 
Global Laboratory
Global LaboratoryGlobal Laboratory
Global Laboratory
 
Peter missen end of semester 1 state of play
Peter missen end of semester 1 state of playPeter missen end of semester 1 state of play
Peter missen end of semester 1 state of play
 

Similar to Trait in scala

Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateTakashi Aoe
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用Takuya Iwatsuka
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発Nomura Yusuke
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-PE-BANK
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 

Similar to Trait in scala (20)

ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX Update
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 

Trait in scala