Skip to content

Instantly share code, notes, and snippets.

@yanzm
Last active February 15, 2019 10:55
Show Gist options
  • Save yanzm/507f866832f46896e3a1454853b33170 to your computer and use it in GitHub Desktop.
Save yanzm/507f866832f46896e3a1454853b33170 to your computer and use it in GitHub Desktop.
//
// https://twitter.com/yanzm/status/1096312798412328970
//
//「3の倍数のときは fizz が返る」
//「5の倍数のときは buzz が返る」
//「3の倍数かつ5の倍数のときは fizzbuzz が返る」
//「3の倍数でも5の倍数でもないときはそのままの数字が返る」
//
// ① Entity または ValueObject(Clean Architecture だと Entities に入る)がもつロジックだと思う
// ② DomainService (これも Clean Architecture だと Entities に入る)だと思う
// ③ UseCase (DDD だと ApplicationService)だと思う
// ④ UseCase (DDD だと ApplicationService)だと思う 2
//
// ① Entity または ValueObject(Clean Architecture だと Entities に入る)がもつロジックだと思う
//
// at domain
//
data class FizzBuzz(private val number: Int) {
fun expression(): String {
val isMul3 = number % 3 == 0
val isMul5 = number % 5 == 0
return when {
isMul3 && isMul5 -> "fizzbuzz"
isMul3 -> "fizz"
isMul5 -> "buzz"
else -> number.toString()
}
}
}
//
// ② DomainService (これも Clean Architecture だと Entities に入る)だと思う
// ③ UseCase (DDD だと ApplicationService)だと思う
// ④ UseCase (DDD だと ApplicationService)だと思う 2
//
// at domain layer
//
class FizzBuzzNumber(private val number: Int) {
val isMul3 = number % 3 == 0
val isMul5 = number % 5 == 0
override fun toString(): String {
return number.toString()
}
}
//
// ② DomainService (これも Clean Architecture だと Entities に入る)だと思う
//
// at domain layer
//
class FizzBuzzService {
fun expression(number: FizzBuzzNumber): String {
return when {
number.isMul3 && number.isMul5 -> "fizzbuzz"
number.isMul3 -> "fizz"
number.isMul5 -> "buzz"
else -> number.toString()
}
}
}
//
// ③ UseCase (DDD だと ApplicationService)だと思う
//
// at application layer
//
class FizzBuzzUseCase {
fun expression(number: FizzBuzzNumber): String {
return when {
number.isMul3 && number.isMul5 -> "fizzbuzz"
number.isMul3 -> "fizz"
number.isMul5 -> "buzz"
else -> number.toString()
}
}
}
//
// ④ UseCase (DDD だと ApplicationService)だと思う 2
//
//
// at domain layer
//
sealed class FizzBuzzState {
abstract val expression: String
}
object Fizz : FizzBuzzState() {
override val expression: String = "fizz"
}
object Buzz : FizzBuzzState() {
override val expression: String = "buzz"
}
object FizzBuzz : FizzBuzzState() {
override val expression: String = "fizzbuzz"
}
data class Normal(private val number: Int) : FizzBuzzState() {
override val expression: String = number.toString()
}
//
// at application layer
//
class FizzBuzzUseCase {
fun expression(number: Int): FizzBuzzState {
val isMul3 = number % 3 == 0
val isMul5 = number % 5 == 0
return when {
isMul3 && isMul5 -> FizzBuzz
isMul3 -> Fizz
isMul5 -> Buzz
else -> Normal(number)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment