読者です 読者をやめる 読者になる 読者になる

Kotlinの単一式関数は責務を制約する時に便利

単一式関数とは、通常のreturnで返却する式↓を

fun method(type: Type) : Int {
  return when(type) {
    Type.TypeA -> 0
    Type.TypeB -> 1
  }
}

代入式で省いて書ける↓

fun method(type: Type) = when(type) {
  Type.TypeA -> 0
  Type.TypeB -> 1
}

といったもの。英語ではSingle-Expression functions。 kotlinlang.org

この書き方で何が変わるんだ、シンプルになるとは言いつつもそこまで変わってない。returnしてもいいじゃないかと思っていたけど一つ使い所を思いついた。 余分な処理を挟んでほしくない箇所に制限を掛ける、例えばMapper。

余分な処理を挟んでほしくない場合にすごい便利

Mapperでは↓のように実装すると思う。名前の通り責務は変換するだけ。

fun map(type: Type) : OtherType {
  return OtherType(type.name)
}

↑このコードで問題なのは、returnの前に何か処理が書けるということ。 引数のtypeではなく、DB内のtypeを読み込んでOtherTypeにmapする。と言ったことが出来てしまう。

fun map(type: Type) = OtherType(type.name)

↑単一式によって処理を挟める隙間が消えた。コードを挟むには単一式を変更して中括弧が必要になる。

あんまり変わってない?

言うほど確かに変わってない。でも小さな制約だけどコードレビュー時に役に立つと思う。 単一式では責務が限定的で分かりやすい。単一式から通常の関数に書き換えられたということは注意するコードの可能性があると思う。

引数のtypeではなく、DB内のtypeを読み込んでOtherTypeにmapするなんてする?

実際にそういうコードを見てしまったので今回の案を思いついた。 責務を限定してエラーで表現してくれるのは良いと思う。