diff --git a/src/main/kotlin/racingcar/RacingCar.kt b/src/main/kotlin/racingcar/RacingCar.kt index 30cb43cbce..2d12239bbd 100644 --- a/src/main/kotlin/racingcar/RacingCar.kt +++ b/src/main/kotlin/racingcar/RacingCar.kt @@ -1,33 +1,19 @@ package racingcar import racingcar.domain.Cars -import racingcar.domain.Winners import racingcar.util.RandomNumberGenerator +import racingcar.view.InputView +import racingcar.view.OutputView fun main() { - println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).") - val usernames: String = readln() - println("시도할 횟수는 몇 회인가요?") - val round: Int = readln().toInt() + val usernames = InputView.carNames() + val round = InputView.roundCount() - val cars = Cars.usernames(usernames) + val cars = Cars.from(usernames) repeat(round) { - cars.race(RandomNumberGenerator()) - gameResult(cars) + cars.race(RandomNumberGenerator) + OutputView.gameResult(cars) } - gameWinner(cars) -} - -private fun gameResult(cars: Cars) { - cars.cars().forEach { - println(it.username() + " : " + it.position().viewPosition()) - } - println() -} - -private fun gameWinner(cars: Cars) { - val winners = Winners(cars) - val winnersName = winners.getWinnerNames().joinToString(",") - println(winnersName + "가 최종 우승했습니다.") + OutputView.gameWinner(cars) } diff --git a/src/main/kotlin/racingcar/domain/Car.kt b/src/main/kotlin/racingcar/domain/Car.kt index bbb3b6e4a5..6af8ddea98 100644 --- a/src/main/kotlin/racingcar/domain/Car.kt +++ b/src/main/kotlin/racingcar/domain/Car.kt @@ -1,18 +1,10 @@ package racingcar.domain -class Car(private var position: Position, private val username: String) { +class Car(var position: Position, val username: String) { fun move(number: Int) { this.position = position.move(number) } - fun position(): Position { - return this.position - } - - fun username(): String { - return this.username - } - companion object { fun init(username: String): Car { return Car(Position.init(), username) diff --git a/src/main/kotlin/racingcar/domain/Cars.kt b/src/main/kotlin/racingcar/domain/Cars.kt index 0348b2ba41..f1f40f4dac 100644 --- a/src/main/kotlin/racingcar/domain/Cars.kt +++ b/src/main/kotlin/racingcar/domain/Cars.kt @@ -4,7 +4,7 @@ import racingcar.util.NumberGenerator private const val USERNAME_SPLIT_CONDITION = "," -class Cars(private val cars: List) { +class Cars(val cars: List) { fun race(generator: NumberGenerator) { for (car in cars) { val number = generator.generate() @@ -13,19 +13,11 @@ class Cars(private val cars: List) { } fun positions(): List { - val positions: MutableList = ArrayList() - for (car in cars) { - positions.add(car.position()) - } - return positions - } - - fun cars(): List { - return cars + return cars.map { it.position } } companion object { - fun usernames(usernames: String): Cars { + fun from(usernames: String): Cars { return Cars(usernames.split(USERNAME_SPLIT_CONDITION).map { username -> Car.init(username) }) } } diff --git a/src/main/kotlin/racingcar/domain/Position.kt b/src/main/kotlin/racingcar/domain/Position.kt index d0ed940812..ab1ef9558c 100644 --- a/src/main/kotlin/racingcar/domain/Position.kt +++ b/src/main/kotlin/racingcar/domain/Position.kt @@ -10,7 +10,7 @@ private const val MOVE_POSITION_CONDITION = 4 private const val POSITION_VIEW = "-" @JvmInline -value class Position(private val position: Int) { +value class Position(val position: Int) { fun move(number: Int): Position { if (number < MOVE_START_NUMBER || number > MOVE_END_NUMBER) { throw IllegalArgumentException("Only numbers between 0 and 9 can be entered. input number:$number") @@ -27,10 +27,6 @@ value class Position(private val position: Int) { return POSITION_VIEW.repeat(max(DEFAULT_NUMBER, position)) } - fun position(): Int { - return this.position - } - companion object { fun init(): Position { return Position(DEFAULT_NUMBER) diff --git a/src/main/kotlin/racingcar/domain/Winners.kt b/src/main/kotlin/racingcar/domain/Winners.kt index 5b2c188801..6a6a96ae1d 100644 --- a/src/main/kotlin/racingcar/domain/Winners.kt +++ b/src/main/kotlin/racingcar/domain/Winners.kt @@ -5,14 +5,14 @@ class Winners(cars: Cars) { init { val highestPosition: Position = - cars.positions().maxByOrNull { it.position() } ?: Position(0) + cars.positions().maxByOrNull { it.position } ?: Position.init() winners = - cars.cars() - .filter { it.position() == highestPosition } + cars.cars + .filter { it.position == highestPosition } .map { it } } fun getWinnerNames(): List { - return winners.map { it.username() } + return winners.map { it.username } } } diff --git a/src/main/kotlin/racingcar/util/RandomNumberGenerator.kt b/src/main/kotlin/racingcar/util/RandomNumberGenerator.kt index a8c1ea644c..59fbb2c7bf 100644 --- a/src/main/kotlin/racingcar/util/RandomNumberGenerator.kt +++ b/src/main/kotlin/racingcar/util/RandomNumberGenerator.kt @@ -4,7 +4,7 @@ import kotlin.random.Random private const val RANDOM_MAX_NUMBER = 10 -class RandomNumberGenerator : NumberGenerator { +object RandomNumberGenerator : NumberGenerator { override fun generate(): Int { return Random.nextInt(RANDOM_MAX_NUMBER) } diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt new file mode 100644 index 0000000000..62aec3c67b --- /dev/null +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -0,0 +1,13 @@ +package racingcar.view + +object InputView { + fun carNames(): String { + println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).") + return readln() + } + + fun roundCount(): Int { + println("시도할 횟수는 몇 회인가요?") + return readln().toIntOrNull() ?: throw IllegalArgumentException("숫자를 입력해 주세요.") + } +} diff --git a/src/main/kotlin/racingcar/view/OutputView.kt b/src/main/kotlin/racingcar/view/OutputView.kt new file mode 100644 index 0000000000..063501bfe3 --- /dev/null +++ b/src/main/kotlin/racingcar/view/OutputView.kt @@ -0,0 +1,19 @@ +package racingcar.view + +import racingcar.domain.Cars +import racingcar.domain.Winners + +object OutputView { + fun gameResult(cars: Cars) { + cars.cars.forEach { + println(it.username + " : " + it.position.viewPosition()) + } + println() + } + + fun gameWinner(cars: Cars) { + val winners = Winners(cars) + val winnersName = winners.getWinnerNames().joinToString(",") + println(winnersName + "가 최종 우승했습니다.") + } +} diff --git a/src/test/kotlin/racingcar/domain/CarTest.kt b/src/test/kotlin/racingcar/domain/CarTest.kt index fcb3edf104..db5be4f4fd 100644 --- a/src/test/kotlin/racingcar/domain/CarTest.kt +++ b/src/test/kotlin/racingcar/domain/CarTest.kt @@ -13,7 +13,7 @@ class CarTest { car.move(number) - assertThat(car.position()).isEqualTo(Position(1)) + assertThat(car.position).isEqualTo(Position(1)) } @ParameterizedTest @@ -23,7 +23,7 @@ class CarTest { car.move(number) - assertThat(car.position()).isEqualTo(Position(0)) + assertThat(car.position).isEqualTo(Position(0)) } @ParameterizedTest diff --git a/src/test/kotlin/racingcar/domain/CarsTest.kt b/src/test/kotlin/racingcar/domain/CarsTest.kt index f070c6a391..0a59c9bfb3 100644 --- a/src/test/kotlin/racingcar/domain/CarsTest.kt +++ b/src/test/kotlin/racingcar/domain/CarsTest.kt @@ -7,13 +7,13 @@ import racingcar.TestNumberGenerator class CarsTest { @Test fun `자동차들을 생성한다`() { - val cars = Cars.usernames("pobi,crong,honux") + val cars = Cars.from("pobi,crong,honux") assertThat(cars).isNotNull() } @Test fun `자동차 경주 시 4이상의 숫자는 전진한다`() { - val cars = Cars.usernames("pobi,crong,honux") + val cars = Cars.from("pobi,crong,honux") cars.race(TestNumberGenerator(4)) @@ -22,7 +22,7 @@ class CarsTest { @Test fun `자동차 경주 시작 시 4미만의 숫자는 멈춰 있는다`() { - val cars = Cars.usernames("pobi,crong,honux") + val cars = Cars.from("pobi,crong,honux") cars.race(TestNumberGenerator(3))