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)