実戦での Scala: Cake パターンを用いた Dependency Injection (DI)

Akka の作者として益々注目を集めている Jonas Bonér さんが 2008年に書いた "Real-World Scala: Dependency Injection (DI)" を翻訳しました。翻訳の公開は本人より許諾済みです。翻訳の間違い等があれば遠慮なくご指摘ください

さて、実戦での Scala シリーズ第二弾の今回は、Scala を用いた Depenency Injection (DI) の実装をみていきたい。Scala は、備わっている言語機構だけを用いても何通りかの DI を実現できる非常に豊かでディープな言語だが、必要に応じて既存の Java DI フレームワークを使うこともできる。

Triental では、一つの戦略に落ち着くまで三つの異なる方法を試した。以下のように話を進めていく。まず、現行の DI の実現方法を詳しく説明した後で、試した他の方法も簡単にカバーする。

Cake パターンを用いる

私たちが用いている現行の戦略は、いわゆる Cake パターンに基づいている。このパターンは、Martin Odersky の論文 Scalable Component Abstractions において、Ordersky と彼のチームが Scala のコンパイラを構成した方法として最初に発表された。このパターンがどのようにして DI を実現するのかということを日本語で説明する事を試みるよりも、(私たちの実際に使っているコードに大まかに基づいた)愚直なサンプルコードをみてみよう。

Scala と Json で tweed を織る

次々とヤバいコードを紡ぎ出し NY Scala シーンの中心的存在であり続ける @n8han が二年前に書いた "Weaving tweed with Scala and Json" を翻訳しました。翻訳の公開は本人より許諾済みです。翻訳の間違い等があれば遠慮なくご指摘ください。

命からがら逃げ出した僕は抽出子をありとあらゆる状況に適用するよう努めた。例えば、JavaScript インタプリタが理解できるお洒落な文字列、Json オブジェクトだ。抽出子を使えば case 構文でこのように処理することができる:

import dispatch.json.Js
val echo = Js("""{"acting": "無表情で前を見ている"}""")
object Echo extends Js { val acting = 'acting ? str }
echo match {
  case Echo.acting(hmm) => hmm
  case _ => "pshaw"
}

res0: String = 無表情で前を見ている

Symbol 'acting に対して ? を呼び出すことで抽出子が作成される。Symbol には ? メソッドはないが暗黙の変換でそれをもつオブジェクトに変換されている。

sbt-twt

simple-build-tool から twitter できれば面白くないか、と思って年越し中の別のコーディングからの休憩として twitter processor を作ってみました。機能的には全部 @n8han の dispatch 任せで、oauth とかもそのまま使えると思ったので、dispatch サンプルである dispatch-twine をフォークして作りました。基本的には、sbt 内から

> twt log

と書くことでツイートが読め、

> twt grep #scala

で検索、

> twt commit "tweet!"

でつぶやくという感じです。

IntelliJ IDEA のための Twilight

Scala をやりながら他の IDE も試しましたが、結局 TextMate に戻っています。
今回巷で話題の IntelliJ IDEA に便乗するにあたって、Twilight theme を作りました。

screenshot

Scala コレクションのアーキテクチャ

Martin Odersky さんと Lex Spoon さんの "The Architecture of Scala Collections" を EPFL Scala Team の許可を得て翻訳しました。
eed3si9n による非公式翻訳 (user-contributed work) なので、EPFL は一切関知しません。 翻訳の間違い等があれば遠慮なく Issues などで訳者の方にご指摘ください。

Scala 2.8 アクター API

コレクション API に引き続き、Philipp Haller さんと Stephen Tu さんの "Scala 2.8 Actors API" を EPFL Scala Team の許可を得て翻訳しました。
eed3si9n による非公式翻訳 (user-contributed work) なので、EPFL は一切関知しません。これも github でホストしてるので、質問・ご意見などは Issues にどうぞ。

型クラスによる XML データバインディング

Scala 2.8 コレクション API

Martin Odersky さんと Lex Spoon さんの "The Scala 2.8 Collections API" を EPFL Scala Team の許可を得て翻訳しました。
eed3si9n による非公式翻訳 (user-contributed work) なので、EPFL は一切関知しません。 翻訳の間違い等があれば遠慮なく Issues などで訳者の方にご指摘ください。

結構長いので、github に移行しました。http://eed3si9n.github.com/scala-collections-doc-ja/

sjson: Scala の型クラスによる JSON シリアライゼーション

ver 0.7 より sjson は元のものに加えリフレクションを使わない JSON シリアライゼーションプロトコルを用意した.これはユーザが任意のオブジェクトから JSON へシリアル化する自分のプロトコルを規定できるようになった.リフレクションによる JSON シリアライゼーションではアノテーションで行っていたものをカスタムプロトコルを自分で実装することで実現することができる.

Scala 型クラスへのリファクタリング

二週間ほど前に Scala の暗黙の(implicit)パラメータを用いた型クラスの実装について書いた.型クラスはある抽象体(abstraction)についての直交した関心事を,抽象体そのものに直接組み込むことなくモデル化することができる.これでコアな抽象体から余計なものを取り去って,別々の独立したクラス構造に変えていくことができる.最近 Akka actor のシリアライゼーションをリファクタリングして型クラスの恩恵に関する実地的な知見を得ることができたので,ここに報告したい.

Syndicate content