本日は宮崎から飛んで大阪に来ています。
目的はScala関西Summit。
Scalaはほとんど手をつけていなかったのですが、DDDとCQRS/ESの話がきけるということで参加を決めました。
DDD
辻陽平さん(@crossroad0201 )の講演です。
実は興味はScalaの方ではなく、DDDをどう実装しているかが気になっていたのですが、予想外にもScalaの表現力はちょっといいなぁと思ってしまったセッションでした。
単純に簡単にオブジェクトやコレクションをイミュータブルにできるとかそういう利点があるのは知っていましたが、Scalaならではの表現は他にも、
def remaindTodayScheduleTo(id: UserId)={
def findUser={...}
def getScheduleOf(user: User) = {...}
...
}
(P19より)
のように関数をネストできるのでprivateメソッドがとっ散らからない。とか、
Application層の実装では、
def remaindTodayScheduleTo(id: UserId)
def findUser={...}
def getScheduleOf(user: User) = {...}
def sentRemainderTo(user: User, schedule: Schedule)
for {
user <- findUser
todaySchedule <- getScheduleOf(user)
sentResult <- sentRemainderTo(user, schedule)
} yield sentResult
}
(P24より)
のようにfor内包式を使って、UserCaseを表現したりとか、
例外をThrowせず、ラップして戻り値として返す(Either/Try)とか、テストしやすいし、APIとかは書きやすくなりそう。
対象のドメインをどのように表現するかは複雑なソフトウェアを設計する重要なテーマ。試してみようかなと思わせてくれるセッションでした。
CQRS/ES
@mtoyoshi さんの講演です。
CQRSは今まさに実装してみようかと色々試しているところで何か得れればと思っていたところ。
C(Commnad)とQ(query)でモデルを分ける(または、Qの集約を複数組み合わせる)とか、スナップショットは毎回取るのではなく、何回かに1回(回数はきちんとドメイン・業務をきちんと考慮して決める)で良くて、取得するときにはスナップショット+スナップショットをとった後のイベントから取得するとか。
ちょっとこの辺り、これから試してみようかと思います。
辻さんmtoyoshiさん、そしてScala関西Summitスタッフのみなさん。
本当にありがとうございました!
現場にきちんと還元します!アパホテルからは以上です。