KotlinLearning: 03-4 関数

ローカル関数

テストの自動化などの目的で小さなメソッドが推奨される傾向が最近は顕著です。
小さなメソッドを抽出する際は、IDEではExtract Method(メソッドの抽出)というリファクタリング機能を使うことができます。
反面人間にとっては多くの小さなメソッドは可読性が低く、全体として何をしているのかわからないという場合も多々あります。
Kotlinには関数の中に関数を書くという方法で可読性を比較的確保したままメソッドを小さく分割するアプローチがあります。
例えばデータクラスの拡張関数としてバリデーションの実行関数を実装し、その中に具体的なバリデーションを関数として実装することで、コードを人間の読みやすい程度の塊として確保しつつ、重複を排することができます。
ただしネストが深くなることに対しては慎重に考えた方がよいでしょう。

data class User(val id: Int, val name: String, val address: String) {
fun User.executeValidation() {
  fun validate(value: String, fieldName: String) {
    if(value.isEmpty()) {
	  throw IllegalArgumentException("$id: empty $fieldName")
	}
  }
  validate(name, "Name")
  validate(name, "Address")
}
fun checkUser(user: User) {
  user.executeValidation()
}

読みにくくなるため推奨されていませんが、更に入れ子にすることも出来ます。

data class User(val id: Int, val name: String, val address: String) {
fun checkUser(user: User) {
  fun User.executeValidation() {
    fun validate(value: String, fieldName: String) {
      if(value.isEmpty()) {
	    throw IllegalArgumentException("$id: empty $fieldName")
	  }
    }
    validate(name, "Name")
    validate(name, "Address")
  }
  user.executeValidation()
}

Advertisements