DEV Community

kaede
kaede

Posted on

Kotlin Springboot -- Part 9 Domain に中身の比較のドメインロジックを生やして活用する

why

ドメインロジックの理解のため。
Person 全てではなく、Age が 10 未満の Person のみを返す機能を実装したかったから。


なぜ Gateway などには書かないか

Gateway は単に Driver の結果を Domain に詰め替える為の場所であるべきだから。


なぜ Usecase にロジックを書かないか。

Usecase は単にビジネスロジックを書く場所であり、
ここをみたらビジネスの都合で何をしているのかわかってほしい。
だから細かい実装の内容は書くべきではない。


Usecase に処理の呼び出しを書く

  fun getU10Persons():Persons {
    val persons = personsGateway.getAllPersons()
    val age = Age(10)
    return persons.filterByLessThan(age)
  }
Enter fullscreen mode Exit fullscreen mode

Gateway から呼び出したドライバーの処理をドメインに詰め替えた結果。

このドメインの中のロジックに、さらに Age ドメインを渡して実行する。


Domain に処理を書く

Persons のドメインに書いて終わりではない。

data class Persons(val list: List<Person>) {
  fun filterByLessThan(age: Age): Persons {
    return Persons(this.list.filter { it.isLessThan(age) })
  }
}
Enter fullscreen mode Exit fullscreen mode

Persons は内部で Person (this) 一つ一つをマップして
条件に当てはまるものだけを返している。
その条件を Person のドメインに書いている。

data class Person(val name: Name, val age: Age) {
  fun isLessThan(age: Age): Boolean {
    return this.age.isLessThan(age)
  }
}
Enter fullscreen mode Exit fullscreen mode

Person のドメインでは Person の Age に生えている isLessThan の結果を返している

This で中身の Age インスタンスにアクセスできる。

data class Age(val value: Int) {
  fun isLessThan(other: Age): Boolean {
    return this.value < other.value
  }
}
Enter fullscreen mode Exit fullscreen mode

そして Age の中に比較関数の本体がある。

this.value が Person ドメインに入っている Age の実際の数値。

それに対して引数の比較対象は other.value にしている。

これ(this)と他(other)の比較。そういう意味。

これで Persons ドメインで isLessThan というドメインロジックが機能する。


結果

Image description

Image description

query でかえられるともっと面白くて実用的かも知れない

  @GetMapping("/persons/{age}")
  @ResponseBody
  fun getPersonsByAge(@PathVariable("age") age: Int): String {

    val persons = personsUsecase.getPersonsByAge(Age(age))
Enter fullscreen mode Exit fullscreen mode

Rest で PathVar で Int で受け取って
Usecase に渡すまえに Age に詰めて

  fun getPersonsByAge(age: Age):Persons {
    val persons = personsGateway.getAllPersons()
    return persons.filterByLessThan(age)
  }
Enter fullscreen mode Exit fullscreen mode

後は中で呼べば引数からの絞り込みが完成した。使いやすい。

Image description

Top comments (0)