w JOUFSGBDFͷσϑΥϧτ࣮
w ϥϜμࣜ
w ߴ֊ؔ
w ܕਪͷڧԽ
w ฒྻੑͷڧԽʢฒྻίϨΫγϣϯɺ$PNQMFUF'VUVSFʣ
w ԆධՁ
w 4USFBN
w 0QUJPOBM
w FUD IUUQXXXJOGPRDPNKQBSUJDMFTKBWBWTTDBMB
IUUQOFXTNZOBWJKQTQFDJBMKBWB
Slide 7
Slide 7 text
ͦΕͰ4DBMB
Λ͍͍͔ͨʁ
Slide 8
Slide 8 text
͜Μͳࢿྉ࡞Δ͘Β͍
͔ͩΒΘ͔Γ·͢ΑͶʁ
Slide 9
Slide 9 text
ຊͷςʔϚ
ʰτϨΠτʱ
Slide 10
Slide 10 text
ͳͥτϨΠτΛ
ͱΓ͋͛Δ͔ʁ
Slide 11
Slide 11 text
w τϨΠτ4DBMBͷΦϒδΣΫτࢦݴޠͱ
ͯ͠ͷϋΠϥΠτͷҰͭͩͱࢥ͏ɻ
w "DUPSΒ'VUVSFΒΛͬͨฒߦੑ੍ޚ
ͷརଟ͍͚Ͳɺଟ͘ͷ৬ۀϓϩάϥϚ͕
໘͢Δ՝ɺ001ΛͬͨιϑτΣΞ
՝ͷղܾʹ͋ΔͷͰͳ͍͔ͱࢥ͏ɻ
w ͱ͍͏͜ͱͰɺ4DBMBͷݴޠհͱͯ͠τϨ
Πτ͔ΒऔΓ্͛ͯΈΔɻ
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)
}
}
Slide 25
Slide 25 text
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
ʰ4DBMBεέʔϥϒϧϓϩάϥϛϯάʱষΑΓ
Slide 26
Slide 26 text
"01ͬΆ͍͜ͱՄೳ
ࢀߟ
IUUQEIBUFOBOFKQKJLP
Slide 27
Slide 27 text
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
Slide 28
Slide 28 text
ࣗܕΞϊςʔγϣϯ
Slide 29
Slide 29 text
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
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)
}
}
Slide 33
Slide 33 text
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)