際際滷

際際滷Share a Scribd company logo
Trait in Scala
2014/05/08
Livesense 皆鴛遺永i慕氏晦意寄氏
Scala
blog.enfranchisedmind.com/2009/05/scala-not-functional/
Scala
Java8
? interfaceのデフォルトg廾
? ラムダ塀
? 互Av方
? 侏容の晒
? K双來の晒K双コレクション、CompleteFuture
? W决u
? Stream
? Optional
? etc http://www.infoq.com/jp/articles/java-8-vs-scala
http://news.mynavi.jp/special/2014/java8/
それでもScala
を聞いたいか
こんなY創恬るくらい
だからわかりますよね
云晩のテ`マ
〆トレイト〇
なぜトレイトを
とりあげるか
? トレイトはScalaのオブジェクト峺鰕壞Zと
してのハイライトの匯つだと房う。
? ActorやらFutureやらを聞ったK佩來崙囮
の旋泣は謹いけど、謹くのIプログラマが
岷中するn}は、OOPを聞ったソフトウェア
n}の盾Qにあるのではないかと房う。
? ということで、Scalaの冱ZB初としてトレ
イトから函り貧げてみる。
$ scala	
scala> ^trait ̄.translate(^ja_JP ̄)	
res0: List[String] = List(蒙來, 蒙, 蒙弼)
http://ejje.weblio.jp/content/trait
トレイトとは
クラスのように、メソッドとフィ`
ルドの協xをカプセル晒したもの
で、Scalaにおけるコ`ド壅旋
喘の児云g了┘灰奪弃召茲蝪
trait Philosophical {	
def philosophize() {	
println(^厘房う絞に厘あり ̄)	
}	
}
クラスにミックスイン
? 渇鵐瓮鵐乂`だけを傚冱して、ミックスインする
クラスでのg廾を崙
? g廾を協xすることもできる
? }方のトレイトを揖rにミックスインすることも
できる
? ミックスインしたメソッドをオ`バ`ライドした
り、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()	 // 渇鵐瓮愁奪匹g廾Ε肇譽ぅBのfooを柵び竃し	
override def bar() = { // トレイトCのbarメソッドをoverride	
super.bar() // トレイトCのbarメソッドを柵び竃し	
println("BAR")	
}	
}
インスタンス伏撹rに
ミックスイン
class Japanese	
!
trait Kansai	
!
trait Kanto	
!
val me = 	
new Japanese with Kansai with Kanto
壊顎沿艶姻柵び竃しの瀰了
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

Trait in scala