Last active
February 15, 2019 10:55
-
-
Save yanzm/507f866832f46896e3a1454853b33170 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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