play2 で dbのmodelになんでcase classを使うの?
イシュー
- scala の case classは、マッチングに使うクラスだが(だからcase)、dbのモデルにも使われる。
- case classの何がいいか?
参考
case をつけて class宣言
- case をつけて class宣言すると以下のメソッドとコンパニオンオブジェクトが自動生成される(マクロ?)
- equals メソッド(case 比較用)
- hashCode メソッド(比較する時に hash値を使う方が速い)
- toString
- canEqual
- copy (値をコピーして値をインスタンスを生成)
- product トレイト のミックスインメソッド(フィールドの個数、フィールドの値、クラス名の文字列)
- apply (ファクトリーパターン)
- unapply(unapplyを実装すると、match式の caseに使用できる)
参考
- scalaのcase class - scalaとか・・・
- Q&A - 【質問】Scalaのcase classはグッドパーツですか? - Qiita
- Scala ひと巡り : ケースクラス (Case Classes) - プログラミング言語Scala 日本語情報サイト
- スケーラブルで関数型でオブジェクト指向なScala入門(5):Scalaのクラスとオブジェクト、パターンマッチ (3/3) - @IT
- upapplyは、マッチした時に呼ばれて、実行結果をリターンする
よさげなところ
getterが生成される(setterは生成されない)
- 以下のcase classをつくっておくと、getId()クラスをつくらなくても、Todo.id でアクセスできる(便利!)
case class Todo(id: Option[Long] = None, content: String)
- 以下のcase classをつくっておくと、getId()クラスをつくらなくても、Todo.id でアクセスできる(便利!)
apply, unapply が実装されるので、*の実装が楽
def * = id.? ~ content <>(Todo.apply , Todo.unapply )
- ~ (チルダ)は、コンビネータメソッド(連結)
Option は、caseクラスなので値がない場合に、None(あればSome(値))を返す。
- そもそも値がある場合のみ処理を行いたい場合は、match式すら必要ありません。Option#foreachでSomeの場合のみ処理を行わせることができます。nullチェック不要
参考
- ref: https://github.com/jmparsons/play-scala-backbone-todo
- Scalaのパターンマッチ入門 - seratch's weblog in Japanese
- Scala的な考え方 - Scalaがとっつきにくいと思っている人へ - ( ꒪⌓꒪) ゆるよろ日記
- Play framework - Scala
- 刺激を求める技術者に捧げるScala講座 - 第17回 Scalaとパーザコンビネータ(基本編):ITpro
- 刺激を求める技術者に捧げるScala講座 - 第18回 Scalaとパーザコンビネータ(実装編):ITpro
- Scalaのパーサーコンビネータをつかってみました - Qiita
- RegexParsersで手軽にScalaのパーサコンビネータを使ってみる - seratch's weblog in Japanese