SlideShare a Scribd company logo
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

PDF
10のJava9で変わるJava8の嫌なとこ!
PDF
Phantom Type in Scala
PDF
演算子オーバーライドをDSLに活用する
PDF
Scalaで萌える関数型プログラミング[完全版]
PDF
Why Reactive Matters #ScalaMatsuri
PPT
Java9新機能概要
PDF
Sbtのマルチプロジェクトはいいぞ
PDF
Scala2.8への移行
10のJava9で変わるJava8の嫌なとこ!
Phantom Type in Scala
演算子オーバーライドをDSLに活用する
Scalaで萌える関数型プログラミング[完全版]
Why Reactive Matters #ScalaMatsuri
Java9新機能概要
Sbtのマルチプロジェクトはいいぞ
Scala2.8への移行

What's hot (20)

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

Viewers also liked (17)

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

Similar to Trait in scala (20)

PDF
Scala勉強会 2015 02_03
PDF
Essential Scala 第4章 トレイトによるデータモデリング
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
プログラミング言語Scala
PPTX
Reladomo in Scala #scala_ks
PPTX
Ipros techmeetup 20131218_scala_handson
PDF
はてなブックマーク in Scala
PDF
Introduce Groovy 2.3 trait
PDF
Clojure
PPTX
Scalatronで楽しく学ぶ関数型プログラミング
PPT
Rpscala2011 0601
PPTX
明日から業務で使うScala
PDF
ICSE2014参加報告 (SE勉強会 6/12)
PDF
Scala with DDD
PDF
めんどくさくない Scala #kwkni_scala
PPTX
Play2 scalaを2年やって学んだこと
PDF
Scala の関数型プログラミングを支える技術
PDF
Scalaプログラミング・マニアックス
Scala勉強会 2015 02_03
Essential Scala 第4章 トレイトによるデータモデリング
BOF1-Scala02.pdf
BOF1-Scala02.pdf
BOF1-Scala02.pdf
プログラミング言語Scala
Reladomo in Scala #scala_ks
Ipros techmeetup 20131218_scala_handson
はてなブックマーク in Scala
Introduce Groovy 2.3 trait
Clojure
Scalatronで楽しく学ぶ関数型プログラミング
Rpscala2011 0601
明日から業務で使うScala
ICSE2014参加報告 (SE勉強会 6/12)
Scala with DDD
めんどくさくない Scala #kwkni_scala
Play2 scalaを2年やって学んだこと
Scala の関数型プログラミングを支える技術
Scalaプログラミング・マニアックス

Trait in scala