From 27381df9de806ad7384e098fd63e5f27aa060357 Mon Sep 17 00:00:00 2001 From: saerang Date: Sun, 24 Nov 2024 17:30:58 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor(step5):=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=B6=94=EB=A1=A0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20input=20,?= =?UTF-8?q?output=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/RacingCar.kt | 26 +++++--------------- src/main/kotlin/racingcar/domain/Car.kt | 10 +------- src/main/kotlin/racingcar/domain/Cars.kt | 4 +-- src/main/kotlin/racingcar/domain/Winners.kt | 6 ++--- src/main/kotlin/racingcar/view/InputView.kt | 13 ++++++++++ src/main/kotlin/racingcar/view/OutputView.kt | 19 ++++++++++++++ src/test/kotlin/racingcar/domain/CarTest.kt | 4 +-- 7 files changed, 46 insertions(+), 36 deletions(-) create mode 100644 src/main/kotlin/racingcar/view/InputView.kt create mode 100644 src/main/kotlin/racingcar/view/OutputView.kt diff --git a/src/main/kotlin/racingcar/RacingCar.kt b/src/main/kotlin/racingcar/RacingCar.kt index 30cb43cbce..8706c4ea55 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) repeat(round) { cars.race(RandomNumberGenerator()) - gameResult(cars) + 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..9c1f559037 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() @@ -15,7 +15,7 @@ class Cars(private val cars: List) { fun positions(): List { val positions: MutableList = ArrayList() for (car in cars) { - positions.add(car.position()) + positions.add(car.position) } return positions } diff --git a/src/main/kotlin/racingcar/domain/Winners.kt b/src/main/kotlin/racingcar/domain/Winners.kt index 5b2c188801..9ed2973943 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 } + .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/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt new file mode 100644 index 0000000000..de4600dbeb --- /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().toInt() + } +} 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 From a221c19ca3230a622d8a3ea676ed85dd503f2a75 Mon Sep 17 00:00:00 2001 From: saerang Date: Sun, 24 Nov 2024 17:37:19 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor(step5):=20private=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/domain/Cars.kt | 4 ---- src/main/kotlin/racingcar/domain/Position.kt | 6 +----- src/main/kotlin/racingcar/domain/Winners.kt | 4 ++-- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/racingcar/domain/Cars.kt b/src/main/kotlin/racingcar/domain/Cars.kt index 9c1f559037..748fc30ea7 100644 --- a/src/main/kotlin/racingcar/domain/Cars.kt +++ b/src/main/kotlin/racingcar/domain/Cars.kt @@ -20,10 +20,6 @@ class Cars(val cars: List) { return positions } - fun cars(): List { - return cars - } - companion object { fun usernames(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 9ed2973943..6a6a96ae1d 100644 --- a/src/main/kotlin/racingcar/domain/Winners.kt +++ b/src/main/kotlin/racingcar/domain/Winners.kt @@ -5,9 +5,9 @@ class Winners(cars: Cars) { init { val highestPosition: Position = - cars.positions().maxByOrNull { it.position() } ?: Position.init() + cars.positions().maxByOrNull { it.position } ?: Position.init() winners = - cars.cars() + cars.cars .filter { it.position == highestPosition } .map { it } } From ac109d90e6f273ed239db7247949b3bd7da88e47 Mon Sep 17 00:00:00 2001 From: saerang Date: Tue, 26 Nov 2024 23:38:22 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor(step5):=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/view/InputView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt index de4600dbeb..62aec3c67b 100644 --- a/src/main/kotlin/racingcar/view/InputView.kt +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -8,6 +8,6 @@ object InputView { fun roundCount(): Int { println("시도할 횟수는 몇 회인가요?") - return readln().toInt() + return readln().toIntOrNull() ?: throw IllegalArgumentException("숫자를 입력해 주세요.") } } From cb0a730d09e6a28d4d7992b0e30c2e30d9fe4fab Mon Sep 17 00:00:00 2001 From: saerang Date: Tue, 26 Nov 2024 23:40:39 +0900 Subject: [PATCH 4/6] =?UTF-8?q?refactor(step5):=20=EC=A0=95=EC=A0=81?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/RacingCar.kt | 2 +- src/main/kotlin/racingcar/domain/Cars.kt | 2 +- src/test/kotlin/racingcar/domain/CarsTest.kt | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/racingcar/RacingCar.kt b/src/main/kotlin/racingcar/RacingCar.kt index 8706c4ea55..8b5968e4da 100644 --- a/src/main/kotlin/racingcar/RacingCar.kt +++ b/src/main/kotlin/racingcar/RacingCar.kt @@ -9,7 +9,7 @@ fun main() { val usernames = InputView.carNames() val round = InputView.roundCount() - val cars = Cars.usernames(usernames) + val cars = Cars.from(usernames) repeat(round) { cars.race(RandomNumberGenerator()) OutputView.gameResult(cars) diff --git a/src/main/kotlin/racingcar/domain/Cars.kt b/src/main/kotlin/racingcar/domain/Cars.kt index 748fc30ea7..17fa317604 100644 --- a/src/main/kotlin/racingcar/domain/Cars.kt +++ b/src/main/kotlin/racingcar/domain/Cars.kt @@ -21,7 +21,7 @@ class Cars(val cars: List) { } 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/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)) From b7b7742ebba2b3d08d39a15f6439cc99721b79fa Mon Sep 17 00:00:00 2001 From: saerang Date: Tue, 26 Nov 2024 23:43:53 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor(step5):=20for=20=EB=AC=B8=20map?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/domain/Cars.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/kotlin/racingcar/domain/Cars.kt b/src/main/kotlin/racingcar/domain/Cars.kt index 17fa317604..f1f40f4dac 100644 --- a/src/main/kotlin/racingcar/domain/Cars.kt +++ b/src/main/kotlin/racingcar/domain/Cars.kt @@ -13,11 +13,7 @@ class Cars(val cars: List) { } fun positions(): List { - val positions: MutableList = ArrayList() - for (car in cars) { - positions.add(car.position) - } - return positions + return cars.map { it.position } } companion object { From 065749b4905a802412c2adf1f0e3c14eb537bb91 Mon Sep 17 00:00:00 2001 From: saerang Date: Tue, 26 Nov 2024 23:48:39 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor(step5):=20object=20class=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/RacingCar.kt | 2 +- src/main/kotlin/racingcar/util/RandomNumberGenerator.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/racingcar/RacingCar.kt b/src/main/kotlin/racingcar/RacingCar.kt index 8b5968e4da..2d12239bbd 100644 --- a/src/main/kotlin/racingcar/RacingCar.kt +++ b/src/main/kotlin/racingcar/RacingCar.kt @@ -11,7 +11,7 @@ fun main() { val cars = Cars.from(usernames) repeat(round) { - cars.race(RandomNumberGenerator()) + cars.race(RandomNumberGenerator) OutputView.gameResult(cars) } 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) }