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)
}
Gateway から呼び出したドライバーの処理をドメインに詰め替えた結果。
このドメインの中のロジックに、さらに Age ドメインを渡して実行する。
Domain に処理を書く
Persons のドメインに書いて終わりではない。
data class Persons(val list: List<Person>) {
fun filterByLessThan(age: Age): Persons {
return Persons(this.list.filter { it.isLessThan(age) })
}
}
Persons は内部で Person (this) 一つ一つをマップして
条件に当てはまるものだけを返している。
その条件を Person のドメインに書いている。
data class Person(val name: Name, val age: Age) {
fun isLessThan(age: Age): Boolean {
return this.age.isLessThan(age)
}
}
Person のドメインでは Person の Age に生えている isLessThan の結果を返している
This で中身の Age インスタンスにアクセスできる。
data class Age(val value: Int) {
fun isLessThan(other: Age): Boolean {
return this.value < other.value
}
}
そして Age の中に比較関数の本体がある。
this.value が Person ドメインに入っている Age の実際の数値。
それに対して引数の比較対象は other.value にしている。
これ(this)と他(other)の比較。そういう意味。
これで Persons ドメインで isLessThan というドメインロジックが機能する。
結果
query でかえられるともっと面白くて実用的かも知れない
@GetMapping("/persons/{age}")
@ResponseBody
fun getPersonsByAge(@PathVariable("age") age: Int): String {
val persons = personsUsecase.getPersonsByAge(Age(age))
Rest で PathVar で Int で受け取って
Usecase に渡すまえに Age に詰めて
fun getPersonsByAge(age: Age):Persons {
val persons = personsGateway.getAllPersons()
return persons.filterByLessThan(age)
}
後は中で呼べば引数からの絞り込みが完成した。使いやすい。
Top comments (0)