DEV Community

kaede
kaede

Posted on

Kotlin Springboot -- Part 4 Domain で Value Object を定義して Driver->Gateway->Usecase と連れ込んでいく

Domain

data class Persons(val list: List<Person>)
data class Person(val name: Name, val age: Age)
data class Name(val value: String)
data class Age(val value: Int)
Enter fullscreen mode Exit fullscreen mode

オブジェクト指向らしく、全てのプロパティをデータクラスで定義する。
細かいデータクラスを Person, Persons でまとめていく

https://blog.applibot.co.jp/2018/03/22/inheritance-for-dataclass-kotlin/

data class は getter/setter などをはやしてくれるもの


Driver

ここから先は全ての層ごとにひとつのクラスで書く

class PersonDriver() {
  companion object {
    private val data:Persons = Persons(listOf(
      (Person(Name("taro"), Age(12))),
      (Person(Name("hanako"), Age(10))),
    ))
    fun findAll():Persons {
      return data
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

コンパニオンオブジェクトで書くとクラス外部から参照できる。
ドメインをつかってデータを定義して
全てを返す関数の findAll を作る


Gateway

class PersonsGateway() {
  companion object {
    fun getAllPersons():Persons {
      return PersonDriver.findAll()
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Driver の findAll を呼ぶ


Usecase

class PersonsUsecase() {
  companion object {
    fun getAllPersons():Persons {
      return PersonsGateway.getAllPersons()
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Gateway の getAllPersons を呼ぶ
同名で定義するので処理はない。
CA の理解のための形式的なもの。


REST

@Controller
class PersonHandler {
  @GetMapping("/persons")
  fun getAllPersons(model:Model): String {
    val persons: Persons = PersonsUsecase.getAllPersons()
    model["title"] = persons.toString()
    return "index"
  }
}
Enter fullscreen mode Exit fullscreen mode

Usecase から呼び出して /persons へのマッピングに当てる


Web

みれる

Image description

Top comments (0)