ScalaMatsuri 2016 A1 Refactoring in Scala
ScalaMatsuri 2016は大盛況のうちに幕を閉じました。私もスタッフとして参加しておりました。
さて、ScalaMatsuri2016のA会場で行われた、基調講演たるがくぞさんのセッションの内容を簡単にまとめたので共有します。
【値オブジェクトに使える値の型4選】
- Type Alias(簡単、意味が明確にできる。だが型安全でない)
- Tagged Type(型安全だ。しかし数値型だとboxing/unboxingが発生してしまう)
- Value Class(boxing/unboxing発生しない。しかし定義するのが面倒)
- Phantom Type(http://gakuzzzz.github.io/slides/refactoring_in_scala/#27)
【Phantom Typeはちょっとコツがいる。導入のための手順は以下のとおり】
- DBの取り扱い可能な値型との相互変換が問題となる
- したがってPrismまたはIsoを導入する(相互変換のためのパターン)
- DB側でPrismの扱いを定義する
- それぞれの値オブジェクトでPrismを継承する
- ボイラープレートだ
- experimentalだがmacroを使えればボイラープレートがなくなる
といったトークがあり、(独断と偏見で)まとめると以下の表のようになります
|
Type Alias
|
Tagged Type
|
Value Class
|
Phantom Type
|
Phantom Type & Prism & macro
|
導入コスト
|
◎:他のロジックに影響ない
|
◯
|
×:定義が面倒
|
△
|
△:macroはまだExperimental
|
型安全
|
×
|
◯
|
◯
|
◯
|
◯
|
コンテナ型へのキャスト
|
×
|
◯
|
×
|
◯
|
◯
|
追加のメソッド定義
|
×
|
×
|
◯
|
◯
|
◯
|
boxing/unboxing
|
◯
|
×:AnyValだとアカン
|
◯
|
◯
|
◯
|
レイヤー境界での変換が不要(DBなどとの互換性)
|
◯
|
×
|
×
|
×
|
◯
|
こんなにわかりやすい発表資料もなかなかないと思います。
急いで作ったのでミスあると思いますが、その際はどうぞお知らせください。-> https://twitter.com/NoriakiHoriuchi
comments powered by Disqus