From 2e3d8b4292fa80c283970fe333e6d29235097052 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Sun, 1 Aug 2021 15:20:06 +0900 Subject: [PATCH 01/40] =?UTF-8?q?chore=20:=20=EC=9E=90=EB=B0=94=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8172fb73f..fd5481180 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'eclipse' group = 'camp.nextstep' version = '1.0.0' -sourceCompatibility = '1.8' +sourceCompatibility = '11' repositories { mavenCentral() From d4664a6fba0129af76458e2839f483892ecc124f Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 16 Aug 2021 16:16:51 +0900 Subject: [PATCH 02/40] =?UTF-8?q?feat=20:=20Ball=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ball.java | 36 +++++++++++++++++++++ src/test/java/domain/BallTest.java | 52 ++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/domain/Ball.java create mode 100644 src/test/java/domain/BallTest.java diff --git a/src/main/java/domain/Ball.java b/src/main/java/domain/Ball.java new file mode 100644 index 000000000..68adb9032 --- /dev/null +++ b/src/main/java/domain/Ball.java @@ -0,0 +1,36 @@ +package domain; + +public class Ball { + + public static final int MIN_NUMBER = 0; + public static final int MAX_NUMBER = 9; + public static final int MIN_POSITION = 0; + public static final int MAX_POSITION = 3; + + private final int number; + private final int position; + + public Ball(final int number, final int position) { + validate(number, position); + this.number = number; + this.position = position; + } + + private void validate(final int number, final int position) { + if (number <= MIN_NUMBER || number > MAX_NUMBER) { + throw new IllegalArgumentException("1~9 사이의 숫자를 입력해야 합니다"); + } + + if (position <= MIN_POSITION || position > MAX_POSITION) { + throw new IllegalArgumentException("1~3 사이의 위치를 입력해야 합니다"); + } + } + + public boolean hasSameNumber(final Ball other) { + return number == other.number; + } + + public boolean hasSamePosition(final Ball other) { + return position == other.position; + } +} diff --git a/src/test/java/domain/BallTest.java b/src/test/java/domain/BallTest.java new file mode 100644 index 000000000..1e222542a --- /dev/null +++ b/src/test/java/domain/BallTest.java @@ -0,0 +1,52 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class BallTest { + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,2,false"}) + @DisplayName("같은 숫자를 가진 숫자 야구 공일 경우 참, 아닐경우 거짓을 반환한다") + void hasSameNumber(int ballNumber, int otherNumber, boolean expect) { + Ball ball = new Ball(ballNumber, 1); + Ball other = new Ball(otherNumber, 1); + + boolean actual = ball.hasSameNumber(other); + + assertThat(actual).isEqualTo(expect); + } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,2,false"}) + @DisplayName("같은 위치를 가진 숫자 야구 공일 경우 참, 아닐경우 거짓을 반환한다") + void hasSameNumberAndPosition(int ballPosition, int otherPosition, boolean expect) { + Ball ball = new Ball(1, ballPosition); + Ball other = new Ball(1, otherPosition); + + boolean actual = ball.hasSamePosition(other); + + assertThat(actual).isEqualTo(expect); + } + + @ParameterizedTest + @ValueSource(ints = {0, 10}) + @DisplayName("1~9를 제외한 숫자를 입력하면 예외를 발생시킨다") + void create_throw_exception_with_invalid_number(int invalidNumber) { + assertThatIllegalArgumentException().isThrownBy(() -> new Ball(invalidNumber, 1)) + .withMessage("1~9 사이의 숫자를 입력해야 합니다"); + } + + @ParameterizedTest + @ValueSource(ints = {0, 4}) + @DisplayName("1~3을 제외한 위치를 입력하면 예외를 발생시킨다") + void create_throw_exception_with_invalid_position(int invalidPosition) { + assertThatIllegalArgumentException().isThrownBy(() -> new Ball(1, invalidPosition)) + .withMessage("1~3 사이의 위치를 입력해야 합니다"); + } +} From 6405206682954d0a7caa476e75b95f5785073705 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 16 Aug 2021 16:30:34 +0900 Subject: [PATCH 03/40] =?UTF-8?q?feat=20:=20Ball=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=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/java/domain/Ball.java | 8 ++++++-- src/test/java/domain/BallTest.java | 12 ++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/Ball.java b/src/main/java/domain/Ball.java index 68adb9032..af3d9664b 100644 --- a/src/main/java/domain/Ball.java +++ b/src/main/java/domain/Ball.java @@ -10,13 +10,17 @@ public class Ball { private final int number; private final int position; - public Ball(final int number, final int position) { + public static Ball of(final int number, final int position) { validate(number, position); + return new Ball(number, position); + } + + private Ball(final int number, final int position) { this.number = number; this.position = position; } - private void validate(final int number, final int position) { + private static void validate(final int number, final int position) { if (number <= MIN_NUMBER || number > MAX_NUMBER) { throw new IllegalArgumentException("1~9 사이의 숫자를 입력해야 합니다"); } diff --git a/src/test/java/domain/BallTest.java b/src/test/java/domain/BallTest.java index 1e222542a..d1a0a2c09 100644 --- a/src/test/java/domain/BallTest.java +++ b/src/test/java/domain/BallTest.java @@ -14,8 +14,8 @@ class BallTest { @CsvSource(value = {"1,1,true", "1,2,false"}) @DisplayName("같은 숫자를 가진 숫자 야구 공일 경우 참, 아닐경우 거짓을 반환한다") void hasSameNumber(int ballNumber, int otherNumber, boolean expect) { - Ball ball = new Ball(ballNumber, 1); - Ball other = new Ball(otherNumber, 1); + Ball ball = Ball.of(ballNumber, 1); + Ball other = Ball.of(otherNumber, 1); boolean actual = ball.hasSameNumber(other); @@ -26,8 +26,8 @@ void hasSameNumber(int ballNumber, int otherNumber, boolean expect) { @CsvSource(value = {"1,1,true", "1,2,false"}) @DisplayName("같은 위치를 가진 숫자 야구 공일 경우 참, 아닐경우 거짓을 반환한다") void hasSameNumberAndPosition(int ballPosition, int otherPosition, boolean expect) { - Ball ball = new Ball(1, ballPosition); - Ball other = new Ball(1, otherPosition); + Ball ball = Ball.of(1, ballPosition); + Ball other = Ball.of(1, otherPosition); boolean actual = ball.hasSamePosition(other); @@ -38,7 +38,7 @@ void hasSameNumberAndPosition(int ballPosition, int otherPosition, boolean expec @ValueSource(ints = {0, 10}) @DisplayName("1~9를 제외한 숫자를 입력하면 예외를 발생시킨다") void create_throw_exception_with_invalid_number(int invalidNumber) { - assertThatIllegalArgumentException().isThrownBy(() -> new Ball(invalidNumber, 1)) + assertThatIllegalArgumentException().isThrownBy(() -> Ball.of(invalidNumber, 1)) .withMessage("1~9 사이의 숫자를 입력해야 합니다"); } @@ -46,7 +46,7 @@ void create_throw_exception_with_invalid_number(int invalidNumber) { @ValueSource(ints = {0, 4}) @DisplayName("1~3을 제외한 위치를 입력하면 예외를 발생시킨다") void create_throw_exception_with_invalid_position(int invalidPosition) { - assertThatIllegalArgumentException().isThrownBy(() -> new Ball(1, invalidPosition)) + assertThatIllegalArgumentException().isThrownBy(() -> Ball.of(1, invalidPosition)) .withMessage("1~3 사이의 위치를 입력해야 합니다"); } } From 6e98c18dc3343f5acdf42327eb5e044b4a48d9c2 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 16 Aug 2021 17:44:32 +0900 Subject: [PATCH 04/40] =?UTF-8?q?feat=20:=20Balls=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Balls.java | 49 +++++++++++++++++++++++++++++ src/test/java/domain/BallsTest.java | 30 ++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/main/java/domain/Balls.java create mode 100644 src/test/java/domain/BallsTest.java diff --git a/src/main/java/domain/Balls.java b/src/main/java/domain/Balls.java new file mode 100644 index 000000000..61c66a1f3 --- /dev/null +++ b/src/main/java/domain/Balls.java @@ -0,0 +1,49 @@ +package domain; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +public class Balls { + + public static final int START_POSITION = 1; + public static final int MAX_POSITION = 3; + + private final List values; + + private Balls(final List values) { + this.values = values; + } + + public static Balls from(final List numbers) { + validate(numbers); + List balls = changeBallsFrom(numbers); + return new Balls(balls); + } + + private static List changeBallsFrom(final List numbers) { + AtomicInteger position = new AtomicInteger(START_POSITION); + + return numbers.stream() + .map(number -> Ball.of(number, position.getAndIncrement())) + .collect(Collectors.toList()); + } + + private static void validate(List numbers) { + List distinctNumber = extractDistinctNumber(numbers); + + if (distinctNumber.size() != numbers.size()) { + throw new IllegalArgumentException("중복된 수가 존재합니다"); + } + + if (distinctNumber.size() != MAX_POSITION) { + throw new IllegalArgumentException("길이가 3이어야 합니다"); + } + } + + private static List extractDistinctNumber(final List numbers) { + return numbers.stream() + .distinct() + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/domain/BallsTest.java b/src/test/java/domain/BallsTest.java new file mode 100644 index 000000000..0aaa3a0c8 --- /dev/null +++ b/src/test/java/domain/BallsTest.java @@ -0,0 +1,30 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class BallsTest { + + @Test + @DisplayName("숫자 야구 공의 길이가 3이 아니라면 예외를 발생시킨다") + void create_throws_exception_with_invalid_length() { + List numbers = Arrays.asList(1, 2, 3, 9); + + assertThatIllegalArgumentException().isThrownBy(() -> Balls.from(numbers)) + .withMessage("길이가 3이어야 합니다"); + } + + @Test + @DisplayName("숫자 야구공의 숫자에 중복이 존재하면 예외를 발생시킨다") + void create_throws_exception_with_duplicate_numbers() { + List numbers = Arrays.asList(1, 2, 2); + + assertThatIllegalArgumentException().isThrownBy(() -> Balls.from(numbers)) + .withMessage("중복된 수가 존재합니다"); + } +} From 095f01212572cfe9e7c3d42c6567065e2711f404 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 16 Aug 2021 18:27:33 +0900 Subject: [PATCH 05/40] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=EC=99=80=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=EB=A5=BC=20=EB=B9=84=EA=B5=90=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Balls.java | 18 ++++++++++++++++++ src/test/java/domain/BallsTest.java | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/main/java/domain/Balls.java b/src/main/java/domain/Balls.java index 61c66a1f3..5aef347bf 100644 --- a/src/main/java/domain/Balls.java +++ b/src/main/java/domain/Balls.java @@ -46,4 +46,22 @@ private static List extractDistinctNumber(final List numbers) .distinct() .collect(Collectors.toList()); } + + public int countSameNumberWithSamePosition(Balls others) { + return (int) others.values + .stream() + .flatMap(other -> values.stream() + .filter(value -> value.hasSameNumber(other)) + .filter(value -> value.hasSamePosition(other))) + .count(); + } + + public int countSameNumberWithDifferentPosition(final Balls others) { + return (int) others.values + .stream() + .flatMap(other -> values.stream() + .filter(value -> value.hasSameNumber(other)) + .filter(value -> !value.hasSamePosition(other))) + .count(); + } } diff --git a/src/test/java/domain/BallsTest.java b/src/test/java/domain/BallsTest.java index 0aaa3a0c8..baf937066 100644 --- a/src/test/java/domain/BallsTest.java +++ b/src/test/java/domain/BallsTest.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; class BallsTest { @@ -27,4 +28,26 @@ void create_throws_exception_with_duplicate_numbers() { assertThatIllegalArgumentException().isThrownBy(() -> Balls.from(numbers)) .withMessage("중복된 수가 존재합니다"); } + + @Test + @DisplayName("다른 숫자 야구와 비교하여 같은 숫자와 같은 위치에 있는 숫자 야구의 개수를 반환한다") + void countSameNumberWithSamePosition() { + Balls balls = Balls.from(Arrays.asList(1, 2, 3)); + Balls others = Balls.from(Arrays.asList(3, 2, 1)); + + int count = balls.countSameNumberWithSamePosition(others); + + assertThat(count).isEqualTo(1); + } + + @Test + @DisplayName("다른 숫자 야구와 비교하여 같은 숫자와 다른 위치에 있는 숫자 야구의 개수를 반환한다") + void countSameNumberWithDifferentPosition() { + Balls balls = Balls.from(Arrays.asList(1, 2, 3)); + Balls others = Balls.from(Arrays.asList(3, 2, 1)); + + int count = balls.countSameNumberWithDifferentPosition(others); + + assertThat(count).isEqualTo(2); + } } From 9dd497a3e6933ea00d8a6a2d811977313b47fca0 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 12:11:04 +0900 Subject: [PATCH 06/40] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20DTO=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/UserInputDto.java | 42 +++++++++++++++++++++++++ src/test/java/dto/UserInputDtoTest.java | 28 +++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/dto/UserInputDto.java create mode 100644 src/test/java/dto/UserInputDtoTest.java diff --git a/src/main/java/dto/UserInputDto.java b/src/main/java/dto/UserInputDto.java new file mode 100644 index 000000000..1a467fefe --- /dev/null +++ b/src/main/java/dto/UserInputDto.java @@ -0,0 +1,42 @@ +package dto; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class UserInputDto { + private List numbers; + + + private UserInputDto(List numbers) { + this.numbers = numbers; + } + + public static UserInputDto from(final String[] userInputTokens) { + validate(userInputTokens); + List numbers = extractNumbersFrom(userInputTokens); + return new UserInputDto(numbers); + } + + private static List extractNumbersFrom(final String[] userInputTokens) { + return Arrays.stream(userInputTokens) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + private static void validate(final String[] userInputTokens) { + if (hasNonDigitNumber(userInputTokens)) { + throw new IllegalArgumentException("숫자 이외의 문자가 포함되어 있습니다"); + } + } + + private static boolean hasNonDigitNumber(final String[] userInputTokens) { + return Arrays.stream(userInputTokens) + .anyMatch(userInputToken -> userInputToken.chars() + .anyMatch(token -> !Character.isDigit(token))); + } + + public List numbers() { + return numbers; + } +} diff --git a/src/test/java/dto/UserInputDtoTest.java b/src/test/java/dto/UserInputDtoTest.java new file mode 100644 index 000000000..f56b4a642 --- /dev/null +++ b/src/test/java/dto/UserInputDtoTest.java @@ -0,0 +1,28 @@ +package dto; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class UserInputDtoTest { + + @Test + @DisplayName("사용자의 입력을 받아 값을 반환한다") + void numbers() { + String[] userInputToken = new String[]{"1", "2", "3"}; + + UserInputDto userInputDto = UserInputDto.from(userInputToken); + + assertThat(userInputDto.numbers()).containsExactly(1, 2, 3); + } + @Test + @DisplayName("사용자의 입력 중에서 숫자가 아닌 수가 포함되어 있을 경우 예외를 발생시킨다") + void create_throws_exception_include_not_digit_token() { + String[] userInputToken = new String[]{"한", "/", " "}; + + assertThatIllegalArgumentException().isThrownBy(() -> UserInputDto.from(userInputToken)) + .withMessage("숫자 이외의 문자가 포함되어 있습니다"); + } +} From 78e36d0a09002e3d683226e8b2f9ab674161ab20 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 12:56:22 +0900 Subject: [PATCH 07/40] =?UTF-8?q?feat=20:=20Dto=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/dto/{UserInputDto.java => RoundInputDto.java} | 8 ++++---- .../dto/{UserInputDtoTest.java => RoundInputDtoTest.java} | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/dto/{UserInputDto.java => RoundInputDto.java} (84%) rename src/test/java/dto/{UserInputDtoTest.java => RoundInputDtoTest.java} (80%) diff --git a/src/main/java/dto/UserInputDto.java b/src/main/java/dto/RoundInputDto.java similarity index 84% rename from src/main/java/dto/UserInputDto.java rename to src/main/java/dto/RoundInputDto.java index 1a467fefe..192f65708 100644 --- a/src/main/java/dto/UserInputDto.java +++ b/src/main/java/dto/RoundInputDto.java @@ -4,18 +4,18 @@ import java.util.List; import java.util.stream.Collectors; -public class UserInputDto { +public class RoundInputDto { private List numbers; - private UserInputDto(List numbers) { + private RoundInputDto(List numbers) { this.numbers = numbers; } - public static UserInputDto from(final String[] userInputTokens) { + public static RoundInputDto from(final String[] userInputTokens) { validate(userInputTokens); List numbers = extractNumbersFrom(userInputTokens); - return new UserInputDto(numbers); + return new RoundInputDto(numbers); } private static List extractNumbersFrom(final String[] userInputTokens) { diff --git a/src/test/java/dto/UserInputDtoTest.java b/src/test/java/dto/RoundInputDtoTest.java similarity index 80% rename from src/test/java/dto/UserInputDtoTest.java rename to src/test/java/dto/RoundInputDtoTest.java index f56b4a642..bf6558a38 100644 --- a/src/test/java/dto/UserInputDtoTest.java +++ b/src/test/java/dto/RoundInputDtoTest.java @@ -6,14 +6,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -class UserInputDtoTest { +class RoundInputDtoTest { @Test @DisplayName("사용자의 입력을 받아 값을 반환한다") void numbers() { String[] userInputToken = new String[]{"1", "2", "3"}; - UserInputDto userInputDto = UserInputDto.from(userInputToken); + RoundInputDto userInputDto = RoundInputDto.from(userInputToken); assertThat(userInputDto.numbers()).containsExactly(1, 2, 3); } @@ -22,7 +22,7 @@ void numbers() { void create_throws_exception_include_not_digit_token() { String[] userInputToken = new String[]{"한", "/", " "}; - assertThatIllegalArgumentException().isThrownBy(() -> UserInputDto.from(userInputToken)) + assertThatIllegalArgumentException().isThrownBy(() -> RoundInputDto.from(userInputToken)) .withMessage("숫자 이외의 문자가 포함되어 있습니다"); } } From 75cc6cd1e7afbf48d896c690fcd518773e35b8d6 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 13:17:50 +0900 Subject: [PATCH 08/40] =?UTF-8?q?feat=20:=20RoundOutputDto=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/RoundOutputDto.java | 37 +++++++++++++++++++++++ src/test/java/dto/RoundOutputDtoTest.java | 24 +++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/java/dto/RoundOutputDto.java create mode 100644 src/test/java/dto/RoundOutputDtoTest.java diff --git a/src/main/java/dto/RoundOutputDto.java b/src/main/java/dto/RoundOutputDto.java new file mode 100644 index 000000000..b28664561 --- /dev/null +++ b/src/main/java/dto/RoundOutputDto.java @@ -0,0 +1,37 @@ +package dto; + +public class RoundOutputDto { + + private static final int ZERO = 0; + + private final int strike; + private final int ball; + private final boolean isThreeOut; + + public RoundOutputDto(final int strike, final int ball, final boolean isThreeOut) { + this.strike = strike; + this.ball = ball; + this.isThreeOut = isThreeOut; + } + + public static RoundOutputDto of(final int strike, final int ball) { + boolean isThreeOut = areStrikesAndBallsZero(strike, ball); + return new RoundOutputDto(strike, ball, isThreeOut); + } + + private static boolean areStrikesAndBallsZero(final int strike, final int ball) { + return strike == ZERO && ball == ZERO; + } + + public int ball() { + return ball; + } + + public int strike() { + return strike; + } + + public boolean isThreeOut() { + return isThreeOut; + } +} diff --git a/src/test/java/dto/RoundOutputDtoTest.java b/src/test/java/dto/RoundOutputDtoTest.java new file mode 100644 index 000000000..7ef08cac3 --- /dev/null +++ b/src/test/java/dto/RoundOutputDtoTest.java @@ -0,0 +1,24 @@ +package dto; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +class RoundOutputDtoTest { + + @ParameterizedTest + @CsvSource(value = {"1,1,false", "0,0,true"}) + @DisplayName("스트라이크, 볼의 개수를 입력 받아 스트라이크, 볼, 낫싱 여부를 반환한다") + void create(final int strike, final int ball, boolean expectedThreeOut) { + RoundOutputDto roundOutputDto = RoundOutputDto.of(strike, ball); + + assertAll( + () -> assertThat(roundOutputDto.strike()).isEqualTo(strike), + () -> assertThat(roundOutputDto.ball()).isEqualTo(ball), + () -> assertThat(roundOutputDto.isThreeOut()).isEqualTo(expectedThreeOut) + ); + } +} From 638f9c575578131dd7b6e3f4167613cb0845b4e6 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 13:24:53 +0900 Subject: [PATCH 09/40] =?UTF-8?q?refactor=20:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/RoundInputDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dto/RoundInputDto.java b/src/main/java/dto/RoundInputDto.java index 192f65708..1deebe182 100644 --- a/src/main/java/dto/RoundInputDto.java +++ b/src/main/java/dto/RoundInputDto.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; public class RoundInputDto { - private List numbers; + private final List numbers; private RoundInputDto(List numbers) { From 5d7a0ad6f840c451d32fa0cdc98312e31257c88f Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:02:51 +0900 Subject: [PATCH 10/40] =?UTF-8?q?feat=20:=20Round=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Round.java | 35 +++++++++++++++++ src/test/java/domain/RoundTest.java | 58 +++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 src/main/java/domain/Round.java create mode 100644 src/test/java/domain/RoundTest.java diff --git a/src/main/java/domain/Round.java b/src/main/java/domain/Round.java new file mode 100644 index 000000000..e0fa2f01f --- /dev/null +++ b/src/main/java/domain/Round.java @@ -0,0 +1,35 @@ +package domain; + +import dto.RoundOutputDto; + +public class Round { + public static final int ENOUGH_STRIKE_INCLUSIVE = 3; + private Balls balls; + private boolean isOver; + + public Round(final Balls balls, final boolean isOver) { + this.balls = balls; + this.isOver = isOver; + } + + public static Round from(Balls balls) { + return new Round(balls, false); + } + + public RoundOutputDto countResult(Balls userInput) { + int strike = balls.countSameNumberWithSamePosition(userInput); + int ball = balls.countSameNumberWithDifferentPosition(userInput); + areEnoughStrikes(strike); + return RoundOutputDto.of(strike, ball); + } + + private void areEnoughStrikes(final int strike) { + if (strike == ENOUGH_STRIKE_INCLUSIVE) { + isOver = true; + } + } + + public boolean isOver() { + return isOver; + } +} diff --git a/src/test/java/domain/RoundTest.java b/src/test/java/domain/RoundTest.java new file mode 100644 index 000000000..8ef317afe --- /dev/null +++ b/src/test/java/domain/RoundTest.java @@ -0,0 +1,58 @@ +package domain; + +import dto.RoundOutputDto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class RoundTest { + + @Test + @DisplayName("스트라이크, 볼, 쓰리아웃 여부를 반환한다") + void countResult() { + List numbers = Arrays.asList(1, 2, 3); + Balls balls = Balls.from(numbers); + Round round = Round.from(balls); + List userNumbers = Arrays.asList(2, 1, 3); + Balls userBalls = Balls.from(userNumbers); + + RoundOutputDto roundOutputDto = round.countResult(userBalls); + + assertAll( + () -> assertThat(roundOutputDto.strike()).isEqualTo(1), + () -> assertThat(roundOutputDto.ball()).isEqualTo(2) + ); + } + + @ParameterizedTest + @MethodSource("ballParameterProvider") + @DisplayName("라운드의 종료 여부를 반환한다") + void isOver(List numbers, boolean expect) { + Balls balls = Balls.from(numbers); + Round round = Round.from(balls); + List userNumbers = Arrays.asList(1, 2, 3); + Balls userBalls = Balls.from(userNumbers); + round.countResult(userBalls); + + boolean actual = round.isOver(); + + assertThat(actual).isEqualTo(expect); + } + + static Stream ballParameterProvider() { + return Stream.of( + arguments(Arrays.asList(1, 2, 3), true), + arguments(Arrays.asList(7, 8, 9), false) + ); + } +} From 5b409113acd23b6ef59634615ec35f4d296be78a Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:05:33 +0900 Subject: [PATCH 11/40] =?UTF-8?q?feat=20:=20GameStatus=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/GameStatus.java | 21 ++++++++++++++++++ src/test/java/domain/GameStatusTest.java | 28 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/main/java/domain/GameStatus.java create mode 100644 src/test/java/domain/GameStatusTest.java diff --git a/src/main/java/domain/GameStatus.java b/src/main/java/domain/GameStatus.java new file mode 100644 index 000000000..75784d6ce --- /dev/null +++ b/src/main/java/domain/GameStatus.java @@ -0,0 +1,21 @@ +package domain; + +import java.util.Arrays; + +public enum GameStatus { + PLAY(1), + OVER(2); + + private final int status; + + GameStatus(final int status) { + this.status = status; + } + + public static GameStatus from(final int status) { + return Arrays.stream(GameStatus.values()) + .filter(value -> value.status == status) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("잘못된 게임의 상태입니다")); + } +} diff --git a/src/test/java/domain/GameStatusTest.java b/src/test/java/domain/GameStatusTest.java new file mode 100644 index 000000000..b7f5d01c7 --- /dev/null +++ b/src/test/java/domain/GameStatusTest.java @@ -0,0 +1,28 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class GameStatusTest { + + @ParameterizedTest + @CsvSource(value = {"PLAY,1", "OVER,2"}) + @DisplayName("게임의 상태를 반환한다") + void status(GameStatus gameStatus, int status) { + assertThat(gameStatus).isEqualTo(GameStatus.from(status)); + } + + @Test + @DisplayName("올바르지 않은 게임 상태는 예외를 발생시킨다") + void from_throw_exception_with_invalid_status() { + int invalidStatus = 3; + + assertThatIllegalArgumentException().isThrownBy(() -> GameStatus.from(invalidStatus)) + .withMessage("잘못된 게임의 상태입니다"); + } +} From 7c335bc7529a16a5bc3be6be51e2c317a7fff5b5 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:23:31 +0900 Subject: [PATCH 12/40] =?UTF-8?q?feat=20:=20RoundInputView,=20RoundOutputV?= =?UTF-8?q?iew=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/RoundInputView.java | 22 +++++++++++ src/main/java/view/RoundOutputView.java | 51 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/main/java/view/RoundInputView.java create mode 100644 src/main/java/view/RoundOutputView.java diff --git a/src/main/java/view/RoundInputView.java b/src/main/java/view/RoundInputView.java new file mode 100644 index 000000000..d8461ddb1 --- /dev/null +++ b/src/main/java/view/RoundInputView.java @@ -0,0 +1,22 @@ +package view; + +import dto.RoundInputDto; + +import java.util.Scanner; + +import static java.lang.System.out; + +public class RoundInputView { + private static final Scanner SCANNER = new Scanner(System.in); + public static final String DELIMETER = ""; + + private RoundInputView() { + } + + public static RoundInputDto roundUserInput() { + out.print("숫자를 입력해 주세요 : "); + String userInput = SCANNER.nextLine(); + String[] userInputToken = userInput.split(DELIMETER); + return RoundInputDto.from(userInputToken); + } +} diff --git a/src/main/java/view/RoundOutputView.java b/src/main/java/view/RoundOutputView.java new file mode 100644 index 000000000..e8bc2ab9d --- /dev/null +++ b/src/main/java/view/RoundOutputView.java @@ -0,0 +1,51 @@ +package view; + +import dto.RoundOutputDto; + +import static java.lang.System.out; + +public class RoundOutputView { + + private static final int ZERO = 0; + private static final String EMPTY = ""; + + private RoundOutputView() { + } + + public static void roundOutput(RoundOutputDto roundOutputDto) { + String ball = parseBallOutput(roundOutputDto.ball()); + String strike = parseStrikeOutput(roundOutputDto.strike()); + String threeOut = parseThreeOutOutput(roundOutputDto.isThreeOut()); + String result = trimFrom(ball, strike, threeOut); + out.println(result); + } + + private static String trimFrom(final String ball, final String strike, final String threeOut) { + return (ball + strike + threeOut).trim(); + } + + private static String parseBallOutput(final int ball) { + if (ball != ZERO) { + return ball + "볼 "; + } + + return EMPTY; + } + + private static String parseStrikeOutput(final int strike) { + if (strike != ZERO) { + return strike + "스트라이크 "; + } + + return EMPTY; + } + + private static String parseThreeOutOutput(final boolean threeOut) { + if(threeOut) { + return "낫싱"; + } + + return EMPTY; + } + +} From 852b6d707919eefd3d2e0038c4b73a5582878696 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:27:47 +0900 Subject: [PATCH 13/40] =?UTF-8?q?feat=20:=20RandomUtils=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/utils/RandomUtils.java | 15 +++++++++++++++ src/test/java/utils/RandomUtilsTest.java | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/main/java/utils/RandomUtils.java create mode 100644 src/test/java/utils/RandomUtilsTest.java diff --git a/src/main/java/utils/RandomUtils.java b/src/main/java/utils/RandomUtils.java new file mode 100644 index 000000000..0b7752340 --- /dev/null +++ b/src/main/java/utils/RandomUtils.java @@ -0,0 +1,15 @@ +package utils; + +import java.util.Random; + +public class RandomUtils { + private static final Random random = new Random(); + + private RandomUtils() { + + } + + public static int generateRandomNumber(final int startInclusive, final int endInclusive) { + return startInclusive + random.nextInt(endInclusive - startInclusive + 1); + } +} diff --git a/src/test/java/utils/RandomUtilsTest.java b/src/test/java/utils/RandomUtilsTest.java new file mode 100644 index 000000000..088197b6b --- /dev/null +++ b/src/test/java/utils/RandomUtilsTest.java @@ -0,0 +1,19 @@ +package utils; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static utils.RandomUtils.generateRandomNumber; + +class RandomUtilsTest { + + @Test + void generate() { + int startInclusive = 1; + int endInclusive = 9; + + int actual = generateRandomNumber(startInclusive, endInclusive); + + assertThat(actual).isBetween(startInclusive, endInclusive); + } +} From ca1ce3f4461290cf11fb8da58f293ee3823763ab Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:32:25 +0900 Subject: [PATCH 14/40] =?UTF-8?q?feat=20:=20RoundController=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RoundController.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/controller/RoundController.java diff --git a/src/main/java/controller/RoundController.java b/src/main/java/controller/RoundController.java new file mode 100644 index 000000000..7ba2d0c71 --- /dev/null +++ b/src/main/java/controller/RoundController.java @@ -0,0 +1,52 @@ +package controller; + +import domain.Balls; +import domain.Round; +import dto.RoundInputDto; +import dto.RoundOutputDto; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static utils.RandomUtils.generateRandomNumber; +import static view.RoundOutputView.roundOutput; +import static view.RoundInputView.roundUserInput; + +public class RoundController { + + public static final int BASEBALL_LENGTH = 3; + + private Round round; + + private RoundController(Round round) { + this.round = round; + } + + public static RoundController getInstance() { + List numbers = initializeRandomBalls(); + Balls balls = Balls.from(numbers); + Round round = Round.from(balls); + return new RoundController(round); + } + + private static List initializeRandomBalls() { + Set set = new HashSet<>(); + while (set.size() < BASEBALL_LENGTH) { + int systemNumber = generateRandomNumber(1, 9); + set.add(systemNumber); + } + return new ArrayList<>(set); + } + + public void run() { + while (!round.isOver()) { + RoundInputDto roundInputDto = roundUserInput(); + List userNumbers = roundInputDto.numbers(); + Balls userBalls = Balls.from(userNumbers); + RoundOutputDto roundOutputDto = round.countResult(userBalls); + roundOutput(roundOutputDto); + } + } +} From 437ac9f0750c8379815a814a056c33650ab2e355 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:33:16 +0900 Subject: [PATCH 15/40] =?UTF-8?q?feat=20:=20GameView=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/GameView.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/view/GameView.java diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java new file mode 100644 index 000000000..4c5694066 --- /dev/null +++ b/src/main/java/view/GameView.java @@ -0,0 +1,21 @@ +package view; + +import domain.GameStatus; + +import java.util.Scanner; + +import static java.lang.System.out; + +public class GameView { + + private static final Scanner SCANNER = new Scanner(System.in); + + private GameView() { + } + + public static GameStatus gameInput() { + out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + int status = SCANNER.nextInt(); + return GameStatus.from(status); + } +} From 2c18d862ca05747d29b0b9489f94804b1ae1f6aa Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:34:30 +0900 Subject: [PATCH 16/40] =?UTF-8?q?feat=20:=20GameController=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 8 +++++++ src/main/java/controller/GameController.java | 25 ++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/controller/GameController.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 000000000..b838ea56a --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,8 @@ +import controller.GameController; + +public class Main { + public static void main(String[] args) { + GameController gameController = GameController.getInstance(); + gameController.run(); + } +} diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 000000000..2151b9632 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,25 @@ +package controller; + +import domain.GameStatus; + +import static view.GameView.gameInput; + +public class GameController { + private GameStatus gameStatus; + + private GameController(GameStatus gameStatus) { + this.gameStatus = gameStatus; + } + + public static GameController getInstance() { + return new GameController(GameStatus.PLAY); + } + + public void run() { + while (gameStatus == GameStatus.PLAY) { + RoundController roundController = RoundController.getInstance(); + roundController.run(); + gameStatus = gameInput(); + } + } +} From 0266c7e5c37234480cc0bbe71f1d5825f41881b3 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 17 Aug 2021 16:37:14 +0900 Subject: [PATCH 17/40] =?UTF-8?q?refactor=20:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=EC=8B=9C=20=EC=B6=9C=EB=A0=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RoundController.java | 2 ++ src/main/java/view/RoundOutputView.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/controller/RoundController.java b/src/main/java/controller/RoundController.java index 7ba2d0c71..b1a367617 100644 --- a/src/main/java/controller/RoundController.java +++ b/src/main/java/controller/RoundController.java @@ -13,6 +13,7 @@ import static utils.RandomUtils.generateRandomNumber; import static view.RoundOutputView.roundOutput; import static view.RoundInputView.roundUserInput; +import static view.RoundOutputView.roundOverOutput; public class RoundController { @@ -48,5 +49,6 @@ public void run() { RoundOutputDto roundOutputDto = round.countResult(userBalls); roundOutput(roundOutputDto); } + roundOverOutput(); } } diff --git a/src/main/java/view/RoundOutputView.java b/src/main/java/view/RoundOutputView.java index e8bc2ab9d..acae31775 100644 --- a/src/main/java/view/RoundOutputView.java +++ b/src/main/java/view/RoundOutputView.java @@ -20,6 +20,10 @@ public static void roundOutput(RoundOutputDto roundOutputDto) { out.println(result); } + public static void roundOverOutput() { + out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } + private static String trimFrom(final String ball, final String strike, final String threeOut) { return (ball + strike + threeOut).trim(); } From 79051c87ee7a205c1811847673304e976560b7ec Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 31 Aug 2021 14:41:19 +0900 Subject: [PATCH 18/40] =?UTF-8?q?refactor=20:=20View=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 18 +++++- src/main/java/controller/GameController.java | 18 +++--- src/main/java/controller/RoundController.java | 51 +++++++++------- src/main/java/view/GameConsoleView.java | 24 ++++++++ src/main/java/view/GameView.java | 18 +----- src/main/java/view/RoundInputConsoleView.java | 25 ++++++++ src/main/java/view/RoundInputView.java | 19 +----- .../java/view/RoundOutputConsoleView.java | 58 +++++++++++++++++++ src/main/java/view/RoundOutputView.java | 52 +---------------- 9 files changed, 171 insertions(+), 112 deletions(-) create mode 100644 src/main/java/view/GameConsoleView.java create mode 100644 src/main/java/view/RoundInputConsoleView.java create mode 100644 src/main/java/view/RoundOutputConsoleView.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index b838ea56a..3b4227f3e 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,8 +1,24 @@ import controller.GameController; +import controller.RoundController; +import domain.GameStatus; +import view.GameView; +import view.GameConsoleView; +import view.RoundInputConsoleView; +import view.RoundInputView; +import view.RoundOutputConsoleView; +import view.RoundOutputView; + +import java.util.Scanner; public class Main { public static void main(String[] args) { - GameController gameController = GameController.getInstance(); + final Scanner scanner = new Scanner(System.in); + final RoundInputView roundInputView = RoundInputConsoleView.from(scanner); + final GameView gameView = GameConsoleView.from(scanner); + final RoundOutputView roundOutputView = RoundOutputConsoleView.getInstance(); + final RoundController roundController = RoundController.of(roundInputView, roundOutputView); + final GameController gameController = GameController.of(roundController, gameView, GameStatus.PLAY); gameController.run(); + scanner.close(); } } diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java index 2151b9632..57537db60 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/controller/GameController.java @@ -1,25 +1,29 @@ package controller; import domain.GameStatus; - -import static view.GameView.gameInput; +import view.GameView; public class GameController { + + private final GameView gameView; + private final RoundController roundController; + private GameStatus gameStatus; - private GameController(GameStatus gameStatus) { + public GameController(final RoundController roundController, final GameView gameView, final GameStatus gameStatus) { + this.roundController = roundController; + this.gameView = gameView; this.gameStatus = gameStatus; } - public static GameController getInstance() { - return new GameController(GameStatus.PLAY); + public static GameController of(final RoundController roundController, final GameView gameView, final GameStatus gameStatus) { + return new GameController(roundController, gameView, gameStatus); } public void run() { while (gameStatus == GameStatus.PLAY) { - RoundController roundController = RoundController.getInstance(); roundController.run(); - gameStatus = gameInput(); + gameStatus = gameView.gameInput(); } } } diff --git a/src/main/java/controller/RoundController.java b/src/main/java/controller/RoundController.java index b1a367617..f63144075 100644 --- a/src/main/java/controller/RoundController.java +++ b/src/main/java/controller/RoundController.java @@ -4,36 +4,53 @@ import domain.Round; import dto.RoundInputDto; import dto.RoundOutputDto; +import view.RoundInputView; +import view.RoundOutputView; import java.util.ArrayList; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import static utils.RandomUtils.generateRandomNumber; -import static view.RoundOutputView.roundOutput; -import static view.RoundInputView.roundUserInput; -import static view.RoundOutputView.roundOverOutput; public class RoundController { public static final int BASEBALL_LENGTH = 3; - private Round round; + private final RoundInputView roundInputView; + private final RoundOutputView roundOutputView; - private RoundController(Round round) { - this.round = round; + + private RoundController(final RoundInputView roundInputView, final RoundOutputView roundOutputView) { + this.roundInputView = roundInputView; + this.roundOutputView = roundOutputView; + } + + public static RoundController of(final RoundInputView roundInputView, final RoundOutputView roundOutputView) { + return new RoundController(roundInputView, roundOutputView); + } + + public void run() { + Round round = nextRound(); + while (!round.isOver()) { + RoundInputDto roundInputDto = roundInputView.roundUserInput(); + List userNumbers = roundInputDto.numbers(); + Balls userBalls = Balls.from(userNumbers); + RoundOutputDto roundOutputDto = round.countResult(userBalls); + roundOutputView.roundOutput(roundOutputDto); + } + roundOutputView.roundOverOutput(); } - public static RoundController getInstance() { + private Round nextRound() { List numbers = initializeRandomBalls(); Balls balls = Balls.from(numbers); - Round round = Round.from(balls); - return new RoundController(round); + return Round.from(balls); } - private static List initializeRandomBalls() { - Set set = new HashSet<>(); + private List initializeRandomBalls() { + Set set = new LinkedHashSet<>(); while (set.size() < BASEBALL_LENGTH) { int systemNumber = generateRandomNumber(1, 9); set.add(systemNumber); @@ -41,14 +58,4 @@ private static List initializeRandomBalls() { return new ArrayList<>(set); } - public void run() { - while (!round.isOver()) { - RoundInputDto roundInputDto = roundUserInput(); - List userNumbers = roundInputDto.numbers(); - Balls userBalls = Balls.from(userNumbers); - RoundOutputDto roundOutputDto = round.countResult(userBalls); - roundOutput(roundOutputDto); - } - roundOverOutput(); - } } diff --git a/src/main/java/view/GameConsoleView.java b/src/main/java/view/GameConsoleView.java new file mode 100644 index 000000000..935f82bbd --- /dev/null +++ b/src/main/java/view/GameConsoleView.java @@ -0,0 +1,24 @@ +package view; + +import domain.GameStatus; + +import java.util.Scanner; + +public class GameConsoleView implements GameView { + + private final Scanner scanner; + + private GameConsoleView(final Scanner scanner) { + this.scanner = scanner; + } + + public static GameConsoleView from(final Scanner scanner) { + return new GameConsoleView(scanner); + } + + public GameStatus gameInput() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + int status = scanner.nextInt(); + return GameStatus.from(status); + } +} diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 4c5694066..fb844fdb2 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -2,20 +2,6 @@ import domain.GameStatus; -import java.util.Scanner; - -import static java.lang.System.out; - -public class GameView { - - private static final Scanner SCANNER = new Scanner(System.in); - - private GameView() { - } - - public static GameStatus gameInput() { - out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - int status = SCANNER.nextInt(); - return GameStatus.from(status); - } +public interface GameView { + GameStatus gameInput(); } diff --git a/src/main/java/view/RoundInputConsoleView.java b/src/main/java/view/RoundInputConsoleView.java new file mode 100644 index 000000000..1391a7fee --- /dev/null +++ b/src/main/java/view/RoundInputConsoleView.java @@ -0,0 +1,25 @@ +package view; + +import dto.RoundInputDto; + +import java.util.Scanner; + +public class RoundInputConsoleView implements RoundInputView { + public static final String DELIMITER = ""; + private final Scanner scanner; + + private RoundInputConsoleView(final Scanner scanner) { + this.scanner = scanner; + } + + public static RoundInputView from(final Scanner scanner) { + return new RoundInputConsoleView(scanner); + } + + public RoundInputDto roundUserInput() { + System.out.print("숫자를 입력해 주세요 : "); + String userInput = scanner.nextLine(); + String[] userInputToken = userInput.split(DELIMITER); + return RoundInputDto.from(userInputToken); + } +} diff --git a/src/main/java/view/RoundInputView.java b/src/main/java/view/RoundInputView.java index d8461ddb1..bb56df572 100644 --- a/src/main/java/view/RoundInputView.java +++ b/src/main/java/view/RoundInputView.java @@ -2,21 +2,6 @@ import dto.RoundInputDto; -import java.util.Scanner; - -import static java.lang.System.out; - -public class RoundInputView { - private static final Scanner SCANNER = new Scanner(System.in); - public static final String DELIMETER = ""; - - private RoundInputView() { - } - - public static RoundInputDto roundUserInput() { - out.print("숫자를 입력해 주세요 : "); - String userInput = SCANNER.nextLine(); - String[] userInputToken = userInput.split(DELIMETER); - return RoundInputDto.from(userInputToken); - } +public interface RoundInputView { + RoundInputDto roundUserInput(); } diff --git a/src/main/java/view/RoundOutputConsoleView.java b/src/main/java/view/RoundOutputConsoleView.java new file mode 100644 index 000000000..a76727e9c --- /dev/null +++ b/src/main/java/view/RoundOutputConsoleView.java @@ -0,0 +1,58 @@ +package view; + +import dto.RoundOutputDto; + + +public class RoundOutputConsoleView implements RoundOutputView{ + + private static final int ZERO = 0; + private static final String EMPTY = ""; + + private RoundOutputConsoleView() { + } + + public static RoundOutputView getInstance() { + return new RoundOutputConsoleView(); + } + + public void roundOutput(RoundOutputDto roundOutputDto) { + String ball = parseBallOutput(roundOutputDto.ball()); + String strike = parseStrikeOutput(roundOutputDto.strike()); + String threeOut = parseThreeOutOutput(roundOutputDto.isThreeOut()); + String result = trimFrom(ball, strike, threeOut); + System.out.println(result); + } + + public void roundOverOutput() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } + + private String trimFrom(final String ball, final String strike, final String threeOut) { + return (ball + strike + threeOut).trim(); + } + + private String parseBallOutput(final int ball) { + if (ball != ZERO) { + return ball + "볼 "; + } + + return EMPTY; + } + + private String parseStrikeOutput(final int strike) { + if (strike != ZERO) { + return strike + "스트라이크 "; + } + + return EMPTY; + } + + private String parseThreeOutOutput(final boolean threeOut) { + if(threeOut) { + return "낫싱"; + } + + return EMPTY; + } + +} diff --git a/src/main/java/view/RoundOutputView.java b/src/main/java/view/RoundOutputView.java index acae31775..da473b2ca 100644 --- a/src/main/java/view/RoundOutputView.java +++ b/src/main/java/view/RoundOutputView.java @@ -2,54 +2,8 @@ import dto.RoundOutputDto; -import static java.lang.System.out; - -public class RoundOutputView { - - private static final int ZERO = 0; - private static final String EMPTY = ""; - - private RoundOutputView() { - } - - public static void roundOutput(RoundOutputDto roundOutputDto) { - String ball = parseBallOutput(roundOutputDto.ball()); - String strike = parseStrikeOutput(roundOutputDto.strike()); - String threeOut = parseThreeOutOutput(roundOutputDto.isThreeOut()); - String result = trimFrom(ball, strike, threeOut); - out.println(result); - } - - public static void roundOverOutput() { - out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); - } - - private static String trimFrom(final String ball, final String strike, final String threeOut) { - return (ball + strike + threeOut).trim(); - } - - private static String parseBallOutput(final int ball) { - if (ball != ZERO) { - return ball + "볼 "; - } - - return EMPTY; - } - - private static String parseStrikeOutput(final int strike) { - if (strike != ZERO) { - return strike + "스트라이크 "; - } - - return EMPTY; - } - - private static String parseThreeOutOutput(final boolean threeOut) { - if(threeOut) { - return "낫싱"; - } - - return EMPTY; - } +public interface RoundOutputView { + void roundOutput(RoundOutputDto roundOutputDto); + void roundOverOutput(); } From f68276c1b1a3057d36e162bad3cff7ad913c4811 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 31 Aug 2021 15:28:40 +0900 Subject: [PATCH 19/40] =?UTF-8?q?refactor=20:=20BallNumber=20VO=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/vo/BallNumber.java | 39 +++++++++++++++++++++ src/test/java/domain/vo/BallNumberTest.java | 32 +++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/java/domain/vo/BallNumber.java create mode 100644 src/test/java/domain/vo/BallNumberTest.java diff --git a/src/main/java/domain/vo/BallNumber.java b/src/main/java/domain/vo/BallNumber.java new file mode 100644 index 000000000..2b0f38484 --- /dev/null +++ b/src/main/java/domain/vo/BallNumber.java @@ -0,0 +1,39 @@ +package domain.vo; + +import java.util.Objects; + +public class BallNumber { + + private static final int MIN_BALL_NUMBER = 1; + private static final int MAX_BALL_NUMBER = 9; + + private int number; + + private BallNumber(final int number) { + this.number = number; + } + + public static BallNumber from(final int number) { + validate(number); + return new BallNumber(number); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof BallNumber)) return false; + final BallNumber that = (BallNumber) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } + + private static void validate(final int number) { + if (number < MIN_BALL_NUMBER || number > MAX_BALL_NUMBER) { + throw new IllegalArgumentException("1~9 사이의 숫자를 입력해야 합니다"); + } + } +} diff --git a/src/test/java/domain/vo/BallNumberTest.java b/src/test/java/domain/vo/BallNumberTest.java new file mode 100644 index 000000000..da3ae2a24 --- /dev/null +++ b/src/test/java/domain/vo/BallNumberTest.java @@ -0,0 +1,32 @@ +package domain.vo; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class BallNumberTest { + + @ParameterizedTest + @ValueSource(ints = {0, 10}) + @DisplayName("1~9 이외의 수를 입력받으면 예외를 발생시킨다") + void create_throw_exception_with_invalid_number(int number) { + assertThatIllegalArgumentException().isThrownBy(() -> BallNumber.from(number)) + .withMessage("1~9 사이의 숫자를 입력해야 합니다"); + } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,2,false"}) + @DisplayName("공의 숫자가 같으면 참 다르면 거짓을 반환한다.") + void equals(int number, int other, boolean expected) { + BallNumber ballNumber = BallNumber.from(number); + BallNumber otherNumber = BallNumber.from(other); + + boolean actual = ballNumber.equals(otherNumber); + + assertThat(actual).isEqualTo(expected); + } +} From 510f34595640a2e436f4a7af56df0f4bf6ba7d3e Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Tue, 31 Aug 2021 15:37:06 +0900 Subject: [PATCH 20/40] =?UTF-8?q?refactor=20:=20Position=20VO=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/vo/Position.java | 39 +++++++++++++++++++++++ src/test/java/domain/vo/PositionTest.java | 33 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/main/java/domain/vo/Position.java create mode 100644 src/test/java/domain/vo/PositionTest.java diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/domain/vo/Position.java new file mode 100644 index 000000000..728fdfb63 --- /dev/null +++ b/src/main/java/domain/vo/Position.java @@ -0,0 +1,39 @@ +package domain.vo; + +import java.util.Objects; + +public class Position { + + private static final int MIN_POSITION = 1; + private static final int MAX_POSITION = 3; + + private int value; + + private Position(final int value) { + this.value = value; + } + + public static Position from(final int value) { + validate(value); + return new Position(value); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Position)) return false; + final Position position = (Position) o; + return value == position.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + private static void validate(final int value) { + if (value < MIN_POSITION || value > MAX_POSITION) { + throw new IllegalArgumentException("1~3 사이의 위치를 입력해야 합니다"); + } + } +} diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/domain/vo/PositionTest.java new file mode 100644 index 000000000..a0dad0063 --- /dev/null +++ b/src/test/java/domain/vo/PositionTest.java @@ -0,0 +1,33 @@ +package domain.vo; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class PositionTest { + + + @ParameterizedTest + @ValueSource(ints = {0, 4}) + @DisplayName("1~3 사이의 위치값이 아니면 예외를 발생시킨다") + void create_throw_exception_with_invalid_position(int value) { + assertThatIllegalArgumentException().isThrownBy(() -> Position.from(value)) + .withMessage("1~3 사이의 위치를 입력해야 합니다"); + } + + @ParameterizedTest + @CsvSource(value = {"1,1,true", "1,2,false"}) + @DisplayName("위치가 같으면 참, 다르면 거짓을 반환한다") + void equals(int value, int otherPosition, boolean expected) { + Position position = Position.from(value); + Position other = Position.from(otherPosition); + + boolean actual = position.equals(other); + + assertThat(actual).isEqualTo(expected); + } +} From 1126d1013a57bac36167052745591a531272d4ef Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:02:38 +0900 Subject: [PATCH 21/40] =?UTF-8?q?refactor=20:=20BallStatus=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BallStatus.java | 15 ++++++++++++++ src/test/java/domain/BallStatusTest.java | 25 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/domain/BallStatus.java create mode 100644 src/test/java/domain/BallStatusTest.java diff --git a/src/main/java/domain/BallStatus.java b/src/main/java/domain/BallStatus.java new file mode 100644 index 000000000..20c8a7319 --- /dev/null +++ b/src/main/java/domain/BallStatus.java @@ -0,0 +1,15 @@ +package domain; + +public enum BallStatus { + STRIKE, + BALL, + NOTHING; + + public boolean isStrike() { + return this == STRIKE; + } + + public boolean isBall() { + return this == BALL; + } +} diff --git a/src/test/java/domain/BallStatusTest.java b/src/test/java/domain/BallStatusTest.java new file mode 100644 index 000000000..824ddd927 --- /dev/null +++ b/src/test/java/domain/BallStatusTest.java @@ -0,0 +1,25 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class BallStatusTest { + + @ParameterizedTest + @CsvSource(value = {"STRIKE,true", "BALL,false","NOTHING,false"}) + @DisplayName("숫자 야구의 상태가 스트라이크 여부를 확인한다") + void isStrike(BallStatus ballStatus, boolean expected) { + assertThat(ballStatus.isStrike()).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"STRIKE,false", "BALL,true", "NOTHING,false"}) + @DisplayName("숫자 야구의 상태가 볼 여부를 확인한다") + void isBall(BallStatus ballStatus, boolean expected) { + assertThat(ballStatus.isBall()).isEqualTo(expected); + } + +} From fa9bdf20d62ac30c98573b09bff3834de4239e02 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:05:10 +0900 Subject: [PATCH 22/40] =?UTF-8?q?refactor=20:=20Ball=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=A6=AC=ED=84=B4=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Ball.java | 54 ++++++++++++++++++------------ src/test/java/domain/BallTest.java | 51 +++++++++------------------- 2 files changed, 49 insertions(+), 56 deletions(-) diff --git a/src/main/java/domain/Ball.java b/src/main/java/domain/Ball.java index af3d9664b..5eb3115b1 100644 --- a/src/main/java/domain/Ball.java +++ b/src/main/java/domain/Ball.java @@ -1,40 +1,52 @@ package domain; -public class Ball { +import domain.vo.BallNumber; +import domain.vo.Position; - public static final int MIN_NUMBER = 0; - public static final int MAX_NUMBER = 9; - public static final int MIN_POSITION = 0; - public static final int MAX_POSITION = 3; +import java.util.Objects; - private final int number; - private final int position; +public class Ball { - public static Ball of(final int number, final int position) { - validate(number, position); - return new Ball(number, position); - } + private final BallNumber number; + private final Position position; - private Ball(final int number, final int position) { + public Ball(final BallNumber number, final Position position) { this.number = number; this.position = position; } - private static void validate(final int number, final int position) { - if (number <= MIN_NUMBER || number > MAX_NUMBER) { - throw new IllegalArgumentException("1~9 사이의 숫자를 입력해야 합니다"); + public static Ball of(final int number, final int position) { + BallNumber ballNumber = BallNumber.from(number); + Position ballPosition = Position.from(position); + return new Ball(ballNumber, ballPosition); + } + + public BallStatus compare(final Ball other) { + if (this.equals(other)) { + return BallStatus.STRIKE; } - if (position <= MIN_POSITION || position > MAX_POSITION) { - throw new IllegalArgumentException("1~3 사이의 위치를 입력해야 합니다"); + if (other.hasSameNumber(number)) { + return BallStatus.BALL; } + + return BallStatus.NOTHING; + } + + public boolean hasSameNumber(final BallNumber number) { + return this.number.equals(number); } - public boolean hasSameNumber(final Ball other) { - return number == other.number; + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Ball)) return false; + final Ball ball = (Ball) o; + return number.equals(ball.number) && position.equals(ball.position); } - public boolean hasSamePosition(final Ball other) { - return position == other.position; + @Override + public int hashCode() { + return Objects.hash(number, position); } } diff --git a/src/test/java/domain/BallTest.java b/src/test/java/domain/BallTest.java index d1a0a2c09..b79bc2ec3 100644 --- a/src/test/java/domain/BallTest.java +++ b/src/test/java/domain/BallTest.java @@ -2,51 +2,32 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.junit.jupiter.params.provider.Arguments.arguments; class BallTest { @ParameterizedTest - @CsvSource(value = {"1,1,true", "1,2,false"}) - @DisplayName("같은 숫자를 가진 숫자 야구 공일 경우 참, 아닐경우 거짓을 반환한다") - void hasSameNumber(int ballNumber, int otherNumber, boolean expect) { - Ball ball = Ball.of(ballNumber, 1); - Ball other = Ball.of(otherNumber, 1); - - boolean actual = ball.hasSameNumber(other); - - assertThat(actual).isEqualTo(expect); - } - - @ParameterizedTest - @CsvSource(value = {"1,1,true", "1,2,false"}) - @DisplayName("같은 위치를 가진 숫자 야구 공일 경우 참, 아닐경우 거짓을 반환한다") - void hasSameNumberAndPosition(int ballPosition, int otherPosition, boolean expect) { - Ball ball = Ball.of(1, ballPosition); - Ball other = Ball.of(1, otherPosition); + @MethodSource("compareTestArgument") + @DisplayName("숫자 야구를 비교해서 상태를 반환한다") + void compare(Ball ball, Ball other, BallStatus expected) { - boolean actual = ball.hasSamePosition(other); + BallStatus actual = ball.compare(other); - assertThat(actual).isEqualTo(expect); + assertThat(actual).isEqualTo(expected); } - @ParameterizedTest - @ValueSource(ints = {0, 10}) - @DisplayName("1~9를 제외한 숫자를 입력하면 예외를 발생시킨다") - void create_throw_exception_with_invalid_number(int invalidNumber) { - assertThatIllegalArgumentException().isThrownBy(() -> Ball.of(invalidNumber, 1)) - .withMessage("1~9 사이의 숫자를 입력해야 합니다"); - } - - @ParameterizedTest - @ValueSource(ints = {0, 4}) - @DisplayName("1~3을 제외한 위치를 입력하면 예외를 발생시킨다") - void create_throw_exception_with_invalid_position(int invalidPosition) { - assertThatIllegalArgumentException().isThrownBy(() -> Ball.of(1, invalidPosition)) - .withMessage("1~3 사이의 위치를 입력해야 합니다"); + static Stream compareTestArgument() { + return Stream.of( + arguments(Ball.of(1, 1), Ball.of(2, 2), BallStatus.NOTHING), + arguments(Ball.of(1, 1), Ball.of(1, 2), BallStatus.BALL), + arguments(Ball.of(1, 1), Ball.of(1, 1), BallStatus.STRIKE) + ); } } From 0058a55735253aa6821a3511ead5b8a43009f97a Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:08:51 +0900 Subject: [PATCH 23/40] =?UTF-8?q?refactor=20:=20Balls=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A1=9C=EC=A7=81=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/java/domain/Balls.java | 25 ++++++++++------------ src/test/java/domain/BallsTest.java | 27 +++++++++++++----------- src/test/java/utils/RandomUtilsTest.java | 19 ----------------- 3 files changed, 26 insertions(+), 45 deletions(-) delete mode 100644 src/test/java/utils/RandomUtilsTest.java diff --git a/src/main/java/domain/Balls.java b/src/main/java/domain/Balls.java index 5aef347bf..5828202b5 100644 --- a/src/main/java/domain/Balls.java +++ b/src/main/java/domain/Balls.java @@ -47,21 +47,18 @@ private static List extractDistinctNumber(final List numbers) .collect(Collectors.toList()); } - public int countSameNumberWithSamePosition(Balls others) { - return (int) others.values - .stream() - .flatMap(other -> values.stream() - .filter(value -> value.hasSameNumber(other)) - .filter(value -> value.hasSamePosition(other))) - .count(); + public BallStatuses compare(final Balls other) { + List statuses = values.stream() + .map(other::compareBallStatus) + .collect(Collectors.toList()); + return BallStatuses.from(statuses); } - public int countSameNumberWithDifferentPosition(final Balls others) { - return (int) others.values - .stream() - .flatMap(other -> values.stream() - .filter(value -> value.hasSameNumber(other)) - .filter(value -> !value.hasSamePosition(other))) - .count(); + public BallStatus compareBallStatus(final Ball other) { + return values.stream() + .map(ball -> ball.compare(other)) + .filter(ballStatus -> ballStatus.isStrike() || ballStatus.isBall()) + .findAny() + .orElse(BallStatus.NOTHING); } } diff --git a/src/test/java/domain/BallsTest.java b/src/test/java/domain/BallsTest.java index baf937066..1cb06554c 100644 --- a/src/test/java/domain/BallsTest.java +++ b/src/test/java/domain/BallsTest.java @@ -2,6 +2,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.Arrays; import java.util.List; @@ -29,25 +31,26 @@ void create_throws_exception_with_duplicate_numbers() { .withMessage("중복된 수가 존재합니다"); } - @Test - @DisplayName("다른 숫자 야구와 비교하여 같은 숫자와 같은 위치에 있는 숫자 야구의 개수를 반환한다") - void countSameNumberWithSamePosition() { + @ParameterizedTest + @CsvSource(value = {"1,1,STRIKE", "1,2,BALL", "4,1,NOTHING"}) + @DisplayName("숫자 야구 공들을 입력받아 볼의 상태를 반환한다") + void compareBallStatus(int number, int position, BallStatus expected) { Balls balls = Balls.from(Arrays.asList(1, 2, 3)); - Balls others = Balls.from(Arrays.asList(3, 2, 1)); + Ball other = Ball.of(number, position); - int count = balls.countSameNumberWithSamePosition(others); + BallStatus actual = balls.compareBallStatus(other); - assertThat(count).isEqualTo(1); + assertThat(actual).isEqualTo(expected); } @Test - @DisplayName("다른 숫자 야구와 비교하여 같은 숫자와 다른 위치에 있는 숫자 야구의 개수를 반환한다") - void countSameNumberWithDifferentPosition() { - Balls balls = Balls.from(Arrays.asList(1, 2, 3)); - Balls others = Balls.from(Arrays.asList(3, 2, 1)); + @DisplayName("숫자 야구 공들을 입력받아 볼의 상태들을 반환한다") + void compare() { + Balls balls = Balls.from(List.of(1, 2, 3)); + Balls others = Balls.from(List.of(1, 3, 7)); - int count = balls.countSameNumberWithDifferentPosition(others); + BallStatuses actual = balls.compare(others); - assertThat(count).isEqualTo(2); + assertThat(actual).isNotNull(); } } diff --git a/src/test/java/utils/RandomUtilsTest.java b/src/test/java/utils/RandomUtilsTest.java deleted file mode 100644 index 088197b6b..000000000 --- a/src/test/java/utils/RandomUtilsTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package utils; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static utils.RandomUtils.generateRandomNumber; - -class RandomUtilsTest { - - @Test - void generate() { - int startInclusive = 1; - int endInclusive = 9; - - int actual = generateRandomNumber(startInclusive, endInclusive); - - assertThat(actual).isBetween(startInclusive, endInclusive); - } -} From 60d98f8a9059f0267eb3ca8f18ecaf0b2dae18a6 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:09:27 +0900 Subject: [PATCH 24/40] =?UTF-8?q?refactor=20:=20BallStatus=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=EC=BB=AC=EB=A0=89=EC=85=98=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BallStatuses.java | 37 +++++++++++++ src/test/java/domain/BallStatusesTest.java | 62 ++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/main/java/domain/BallStatuses.java create mode 100644 src/test/java/domain/BallStatusesTest.java diff --git a/src/main/java/domain/BallStatuses.java b/src/main/java/domain/BallStatuses.java new file mode 100644 index 000000000..7127bca62 --- /dev/null +++ b/src/main/java/domain/BallStatuses.java @@ -0,0 +1,37 @@ +package domain; + +import java.util.List; + +public class BallStatuses { + + public static final int BALL_STATUSES_SIZE = 3; + + private List statuses; + + private BallStatuses(final List statuses) { + this.statuses = statuses; + } + + public static BallStatuses from(final List statuses) { + validate(statuses); + return new BallStatuses(statuses); + } + + private static void validate(final List statuses) { + if (statuses.size() != BALL_STATUSES_SIZE) { + throw new IllegalArgumentException("숫자야구 상태의 길이는 3이어야 합니다"); + } + } + + public int countStrike() { + return (int) statuses.stream() + .filter(BallStatus::isStrike) + .count(); + } + + public int countBall() { + return (int) statuses.stream() + .filter(BallStatus::isBall) + .count(); + } +} diff --git a/src/test/java/domain/BallStatusesTest.java b/src/test/java/domain/BallStatusesTest.java new file mode 100644 index 000000000..1df89df68 --- /dev/null +++ b/src/test/java/domain/BallStatusesTest.java @@ -0,0 +1,62 @@ +package domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.junit.jupiter.params.provider.Arguments.arguments; + +class BallStatusesTest { + + private BallStatuses ballStatuses; + + @BeforeEach + void setUp() { + List statuses = List.of(BallStatus.STRIKE, BallStatus.BALL, BallStatus.NOTHING); + ballStatuses = BallStatuses.from(statuses); + } + + @Test + @DisplayName("스트라이크의 개수를 반환한다") + void countStrike() { + int expected = 1; + + int actual = ballStatuses.countStrike(); + + assertThat(actual).isEqualTo(expected); + } + + + @Test + @DisplayName("스트라이크의 개수를 반환한다") + void countBall() { + int expected = 1; + + int actual = ballStatuses.countBall(); + + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("invalidBallStatusesArgument") + @DisplayName("숫자야구공들의 길이가 3이 아니면 예외를 발생시킨다") + void create_throw_exception_with_invalid_ball_statuses_size(List invalidStatuses) { + assertThatIllegalArgumentException().isThrownBy(() -> BallStatuses.from(invalidStatuses)) + .withMessage("숫자야구 상태의 길이는 3이어야 합니다"); + } + + static Stream invalidBallStatusesArgument() { + return Stream.of( + arguments(List.of(BallStatus.STRIKE, BallStatus.BALL)), + arguments(List.of(BallStatus.STRIKE, BallStatus.STRIKE, BallStatus.BALL, BallStatus.NOTHING)) + ); + } +} From 4835be70fa5743e63ccb84e81418fc55cd33a624 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:11:09 +0900 Subject: [PATCH 25/40] =?UTF-8?q?refactor=20:=20RoundInputDto=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/RoundInputDto.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/dto/RoundInputDto.java b/src/main/java/dto/RoundInputDto.java index 1deebe182..db6213afd 100644 --- a/src/main/java/dto/RoundInputDto.java +++ b/src/main/java/dto/RoundInputDto.java @@ -32,8 +32,13 @@ private static void validate(final String[] userInputTokens) { private static boolean hasNonDigitNumber(final String[] userInputTokens) { return Arrays.stream(userInputTokens) - .anyMatch(userInputToken -> userInputToken.chars() - .anyMatch(token -> !Character.isDigit(token))); + .anyMatch(RoundInputDto::containsNonDigitNumber); + } + + private static boolean containsNonDigitNumber(final String userInputToken) { + return userInputToken.equals("") || + userInputToken.chars() + .anyMatch(token -> !Character.isDigit(token)); } public List numbers() { From 30b244fb9d199890c06695390f5af21c275b8694 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:12:13 +0900 Subject: [PATCH 26/40] =?UTF-8?q?refactor=20:=20=EB=82=9C=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=A0=84=EB=9E=B5=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Generation.java | 5 ++++ .../java/domain/RandomNumberGeneration.java | 25 +++++++++++++++++++ .../java/domain/GenerateRandomNumberTest.java | 21 ++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/main/java/domain/Generation.java create mode 100644 src/main/java/domain/RandomNumberGeneration.java create mode 100644 src/test/java/domain/GenerateRandomNumberTest.java diff --git a/src/main/java/domain/Generation.java b/src/main/java/domain/Generation.java new file mode 100644 index 000000000..0fe73bdbb --- /dev/null +++ b/src/main/java/domain/Generation.java @@ -0,0 +1,5 @@ +package domain; + +public interface Generation { + int generate(); +} diff --git a/src/main/java/domain/RandomNumberGeneration.java b/src/main/java/domain/RandomNumberGeneration.java new file mode 100644 index 000000000..22e024f90 --- /dev/null +++ b/src/main/java/domain/RandomNumberGeneration.java @@ -0,0 +1,25 @@ +package domain; + +import java.util.Random; + +public class RandomNumberGeneration implements Generation { + + private static final int START_INCLUSIVE = 1; + private static final int END_INCLUSIVE = 9; + + private final Random random; + + public RandomNumberGeneration(final Random random) { + this.random = random; + } + + + public static Generation from(final Random random) { + return new RandomNumberGeneration(random); + } + + @Override + public int generate() { + return START_INCLUSIVE + random.nextInt(START_INCLUSIVE + END_INCLUSIVE - START_INCLUSIVE); + } +} diff --git a/src/test/java/domain/GenerateRandomNumberTest.java b/src/test/java/domain/GenerateRandomNumberTest.java new file mode 100644 index 000000000..66be953ff --- /dev/null +++ b/src/test/java/domain/GenerateRandomNumberTest.java @@ -0,0 +1,21 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Random; + +import static org.assertj.core.api.Assertions.assertThat; + +class GenerateRandomNumberTest { + + @Test + @DisplayName("1~9 사이의 난수를 생성한다") + void generate() { + Generation generation = RandomNumberGeneration.from(new Random()); + + int actual = generation.generate(); + + assertThat(actual).isStrictlyBetween(0, 10); + } +} From aba63705710e31e5cb3b67c55108cb7a7dc5d2b5 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:13:25 +0900 Subject: [PATCH 27/40] =?UTF-8?q?refactor=20:=20Round=20BallStatus=20?= =?UTF-8?q?=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Round.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/Round.java b/src/main/java/domain/Round.java index e0fa2f01f..58dad4dc8 100644 --- a/src/main/java/domain/Round.java +++ b/src/main/java/domain/Round.java @@ -16,9 +16,10 @@ public static Round from(Balls balls) { return new Round(balls, false); } - public RoundOutputDto countResult(Balls userInput) { - int strike = balls.countSameNumberWithSamePosition(userInput); - int ball = balls.countSameNumberWithDifferentPosition(userInput); + public RoundOutputDto countResult(Balls userBalls) { + BallStatuses ballStatuses = balls.compare(userBalls); + int strike = ballStatuses.countStrike(); + int ball = ballStatuses.countBall(); areEnoughStrikes(strike); return RoundOutputDto.of(strike, ball); } From ea315f28f4e3d1f265794543353284358f05d69f Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:14:33 +0900 Subject: [PATCH 28/40] =?UTF-8?q?refactor=20:=20GameStatus=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/GameStatus.java | 12 ++++++------ src/main/java/view/GameConsoleView.java | 2 +- src/test/java/domain/GameStatusTest.java | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/GameStatus.java b/src/main/java/domain/GameStatus.java index 75784d6ce..6d794bb06 100644 --- a/src/main/java/domain/GameStatus.java +++ b/src/main/java/domain/GameStatus.java @@ -3,18 +3,18 @@ import java.util.Arrays; public enum GameStatus { - PLAY(1), - OVER(2); + PLAY("1"), + OVER("2"); - private final int status; + private final String status; - GameStatus(final int status) { + GameStatus(final String status) { this.status = status; } - public static GameStatus from(final int status) { + public static GameStatus from(final String status) { return Arrays.stream(GameStatus.values()) - .filter(value -> value.status == status) + .filter(value -> value.status.equals(status)) .findAny() .orElseThrow(() -> new IllegalArgumentException("잘못된 게임의 상태입니다")); } diff --git a/src/main/java/view/GameConsoleView.java b/src/main/java/view/GameConsoleView.java index 935f82bbd..5220a8bb6 100644 --- a/src/main/java/view/GameConsoleView.java +++ b/src/main/java/view/GameConsoleView.java @@ -18,7 +18,7 @@ public static GameConsoleView from(final Scanner scanner) { public GameStatus gameInput() { System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - int status = scanner.nextInt(); + String status = scanner.nextLine(); return GameStatus.from(status); } } diff --git a/src/test/java/domain/GameStatusTest.java b/src/test/java/domain/GameStatusTest.java index b7f5d01c7..919af720c 100644 --- a/src/test/java/domain/GameStatusTest.java +++ b/src/test/java/domain/GameStatusTest.java @@ -13,14 +13,14 @@ class GameStatusTest { @ParameterizedTest @CsvSource(value = {"PLAY,1", "OVER,2"}) @DisplayName("게임의 상태를 반환한다") - void status(GameStatus gameStatus, int status) { + void status(GameStatus gameStatus, String status) { assertThat(gameStatus).isEqualTo(GameStatus.from(status)); } @Test @DisplayName("올바르지 않은 게임 상태는 예외를 발생시킨다") void from_throw_exception_with_invalid_status() { - int invalidStatus = 3; + String invalidStatus = "3"; assertThatIllegalArgumentException().isThrownBy(() -> GameStatus.from(invalidStatus)) .withMessage("잘못된 게임의 상태입니다"); From 70ba8b89544a14eededb54654574677b7e7c40c7 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:15:16 +0900 Subject: [PATCH 29/40] =?UTF-8?q?refactor=20:=20Util=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=EC=A0=84=EB=9E=B5?= =?UTF-8?q?=20=ED=8C=A8=ED=84=B4=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RoundController.java | 15 +++++++++------ src/main/java/utils/RandomUtils.java | 15 --------------- 2 files changed, 9 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/utils/RandomUtils.java diff --git a/src/main/java/controller/RoundController.java b/src/main/java/controller/RoundController.java index f63144075..0d326c063 100644 --- a/src/main/java/controller/RoundController.java +++ b/src/main/java/controller/RoundController.java @@ -1,6 +1,7 @@ package controller; import domain.Balls; +import domain.Generation; import domain.Round; import dto.RoundInputDto; import dto.RoundOutputDto; @@ -12,23 +13,25 @@ import java.util.List; import java.util.Set; -import static utils.RandomUtils.generateRandomNumber; - public class RoundController { public static final int BASEBALL_LENGTH = 3; private final RoundInputView roundInputView; private final RoundOutputView roundOutputView; + private final Generation generation; - private RoundController(final RoundInputView roundInputView, final RoundOutputView roundOutputView) { + private RoundController(final RoundInputView roundInputView, final RoundOutputView roundOutputView, + final Generation generation) { this.roundInputView = roundInputView; this.roundOutputView = roundOutputView; + this.generation = generation; } - public static RoundController of(final RoundInputView roundInputView, final RoundOutputView roundOutputView) { - return new RoundController(roundInputView, roundOutputView); + public static RoundController of(final RoundInputView roundInputView, final RoundOutputView roundOutputView, + final Generation generation) { + return new RoundController(roundInputView, roundOutputView, generation); } public void run() { @@ -52,7 +55,7 @@ private Round nextRound() { private List initializeRandomBalls() { Set set = new LinkedHashSet<>(); while (set.size() < BASEBALL_LENGTH) { - int systemNumber = generateRandomNumber(1, 9); + int systemNumber = generation.generate(); set.add(systemNumber); } return new ArrayList<>(set); diff --git a/src/main/java/utils/RandomUtils.java b/src/main/java/utils/RandomUtils.java deleted file mode 100644 index 0b7752340..000000000 --- a/src/main/java/utils/RandomUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package utils; - -import java.util.Random; - -public class RandomUtils { - private static final Random random = new Random(); - - private RandomUtils() { - - } - - public static int generateRandomNumber(final int startInclusive, final int endInclusive) { - return startInclusive + random.nextInt(endInclusive - startInclusive + 1); - } -} From 9e5fd66111632347985a3e2a5c5777fdbb86515b Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:15:47 +0900 Subject: [PATCH 30/40] =?UTF-8?q?refactor=20:=20Main=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 3b4227f3e..e696c9c05 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,6 +1,8 @@ import controller.GameController; import controller.RoundController; import domain.GameStatus; +import domain.Generation; +import domain.RandomNumberGeneration; import view.GameView; import view.GameConsoleView; import view.RoundInputConsoleView; @@ -8,16 +10,19 @@ import view.RoundOutputConsoleView; import view.RoundOutputView; +import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { - final Scanner scanner = new Scanner(System.in); - final RoundInputView roundInputView = RoundInputConsoleView.from(scanner); - final GameView gameView = GameConsoleView.from(scanner); - final RoundOutputView roundOutputView = RoundOutputConsoleView.getInstance(); - final RoundController roundController = RoundController.of(roundInputView, roundOutputView); - final GameController gameController = GameController.of(roundController, gameView, GameStatus.PLAY); + Scanner scanner = new Scanner(System.in); + RoundInputView roundInputView = RoundInputConsoleView.from(scanner); + GameView gameView = GameConsoleView.from(scanner); + RoundOutputView roundOutputView = RoundOutputConsoleView.getInstance(); + Random random = new Random(); + Generation generation = new RandomNumberGeneration(random); + RoundController roundController = RoundController.of(roundInputView, roundOutputView, generation); + GameController gameController = GameController.of(roundController, gameView, GameStatus.PLAY); gameController.run(); scanner.close(); } From 5c89623c4ec7756a715eff55a2fa90dc52334190 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:18:28 +0900 Subject: [PATCH 31/40] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/{ => baseball}/.gitkeep | 0 src/main/java/{ => baseball}/Main.java | 24 ++++++++++--------- .../controller/GameController.java | 6 ++--- .../controller/RoundController.java | 16 ++++++------- src/main/java/{ => baseball}/domain/Ball.java | 6 ++--- .../{ => baseball}/domain/BallStatus.java | 2 +- .../{ => baseball}/domain/BallStatuses.java | 2 +- .../java/{ => baseball}/domain/Balls.java | 2 +- .../{ => baseball}/domain/GameStatus.java | 2 +- .../{ => baseball}/domain/Generation.java | 2 +- .../domain/RandomNumberGeneration.java | 2 +- .../java/{ => baseball}/domain/Round.java | 4 ++-- .../{ => baseball}/domain/vo/BallNumber.java | 2 +- .../{ => baseball}/domain/vo/Position.java | 2 +- .../{ => baseball}/dto/RoundInputDto.java | 2 +- .../{ => baseball}/dto/RoundOutputDto.java | 2 +- .../{ => baseball}/view/GameConsoleView.java | 4 ++-- .../java/{ => baseball}/view/GameView.java | 4 ++-- .../view/RoundInputConsoleView.java | 4 ++-- .../{ => baseball}/view/RoundInputView.java | 4 ++-- .../view/RoundOutputConsoleView.java | 4 ++-- .../{ => baseball}/view/RoundOutputView.java | 4 ++-- .../{ => baseball}/domain/BallStatusTest.java | 2 +- .../domain/BallStatusesTest.java | 2 +- .../java/{ => baseball}/domain/BallTest.java | 3 +-- .../java/{ => baseball}/domain/BallsTest.java | 2 +- .../{ => baseball}/domain/GameStatusTest.java | 2 +- .../domain/GenerateRandomNumberTest.java | 2 +- .../java/{ => baseball}/domain/RoundTest.java | 4 ++-- .../domain/vo/BallNumberTest.java | 2 +- .../domain/vo/PositionTest.java | 2 +- .../{ => baseball}/dto/RoundInputDtoTest.java | 2 +- .../dto/RoundOutputDtoTest.java | 2 +- 33 files changed, 63 insertions(+), 62 deletions(-) rename src/main/java/{ => baseball}/.gitkeep (100%) rename src/main/java/{ => baseball}/Main.java (62%) rename src/main/java/{ => baseball}/controller/GameController.java (89%) rename src/main/java/{ => baseball}/controller/RoundController.java (87%) rename src/main/java/{ => baseball}/domain/Ball.java (92%) rename src/main/java/{ => baseball}/domain/BallStatus.java (88%) rename src/main/java/{ => baseball}/domain/BallStatuses.java (97%) rename src/main/java/{ => baseball}/domain/Balls.java (98%) rename src/main/java/{ => baseball}/domain/GameStatus.java (95%) rename src/main/java/{ => baseball}/domain/Generation.java (67%) rename src/main/java/{ => baseball}/domain/RandomNumberGeneration.java (95%) rename src/main/java/{ => baseball}/domain/Round.java (93%) rename src/main/java/{ => baseball}/domain/vo/BallNumber.java (97%) rename src/main/java/{ => baseball}/domain/vo/Position.java (97%) rename src/main/java/{ => baseball}/dto/RoundInputDto.java (98%) rename src/main/java/{ => baseball}/dto/RoundOutputDto.java (97%) rename src/main/java/{ => baseball}/view/GameConsoleView.java (90%) rename src/main/java/{ => baseball}/view/GameView.java (50%) rename src/main/java/{ => baseball}/view/RoundInputConsoleView.java (92%) rename src/main/java/{ => baseball}/view/RoundInputView.java (56%) rename src/main/java/{ => baseball}/view/RoundOutputConsoleView.java (96%) rename src/main/java/{ => baseball}/view/RoundOutputView.java (67%) rename src/test/java/{ => baseball}/domain/BallStatusTest.java (97%) rename src/test/java/{ => baseball}/domain/BallStatusesTest.java (98%) rename src/test/java/{ => baseball}/domain/BallTest.java (93%) rename src/test/java/{ => baseball}/domain/BallsTest.java (98%) rename src/test/java/{ => baseball}/domain/GameStatusTest.java (97%) rename src/test/java/{ => baseball}/domain/GenerateRandomNumberTest.java (94%) rename src/test/java/{ => baseball}/domain/RoundTest.java (96%) rename src/test/java/{ => baseball}/domain/vo/BallNumberTest.java (97%) rename src/test/java/{ => baseball}/domain/vo/PositionTest.java (97%) rename src/test/java/{ => baseball}/dto/RoundInputDtoTest.java (97%) rename src/test/java/{ => baseball}/dto/RoundOutputDtoTest.java (97%) diff --git a/src/main/java/.gitkeep b/src/main/java/baseball/.gitkeep similarity index 100% rename from src/main/java/.gitkeep rename to src/main/java/baseball/.gitkeep diff --git a/src/main/java/Main.java b/src/main/java/baseball/Main.java similarity index 62% rename from src/main/java/Main.java rename to src/main/java/baseball/Main.java index e696c9c05..d8e7a8add 100644 --- a/src/main/java/Main.java +++ b/src/main/java/baseball/Main.java @@ -1,14 +1,16 @@ -import controller.GameController; -import controller.RoundController; -import domain.GameStatus; -import domain.Generation; -import domain.RandomNumberGeneration; -import view.GameView; -import view.GameConsoleView; -import view.RoundInputConsoleView; -import view.RoundInputView; -import view.RoundOutputConsoleView; -import view.RoundOutputView; +package baseball; + +import baseball.controller.GameController; +import baseball.controller.RoundController; +import baseball.domain.GameStatus; +import baseball.domain.Generation; +import baseball.domain.RandomNumberGeneration; +import baseball.view.GameView; +import baseball.view.GameConsoleView; +import baseball.view.RoundInputConsoleView; +import baseball.view.RoundInputView; +import baseball.view.RoundOutputConsoleView; +import baseball.view.RoundOutputView; import java.util.Random; import java.util.Scanner; diff --git a/src/main/java/controller/GameController.java b/src/main/java/baseball/controller/GameController.java similarity index 89% rename from src/main/java/controller/GameController.java rename to src/main/java/baseball/controller/GameController.java index 57537db60..b8cc9f6e5 100644 --- a/src/main/java/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -1,7 +1,7 @@ -package controller; +package baseball.controller; -import domain.GameStatus; -import view.GameView; +import baseball.domain.GameStatus; +import baseball.view.GameView; public class GameController { diff --git a/src/main/java/controller/RoundController.java b/src/main/java/baseball/controller/RoundController.java similarity index 87% rename from src/main/java/controller/RoundController.java rename to src/main/java/baseball/controller/RoundController.java index 0d326c063..be2c1c6b1 100644 --- a/src/main/java/controller/RoundController.java +++ b/src/main/java/baseball/controller/RoundController.java @@ -1,12 +1,12 @@ -package controller; +package baseball.controller; -import domain.Balls; -import domain.Generation; -import domain.Round; -import dto.RoundInputDto; -import dto.RoundOutputDto; -import view.RoundInputView; -import view.RoundOutputView; +import baseball.domain.Balls; +import baseball.domain.Generation; +import baseball.domain.Round; +import baseball.dto.RoundInputDto; +import baseball.dto.RoundOutputDto; +import baseball.view.RoundInputView; +import baseball.view.RoundOutputView; import java.util.ArrayList; import java.util.LinkedHashSet; diff --git a/src/main/java/domain/Ball.java b/src/main/java/baseball/domain/Ball.java similarity index 92% rename from src/main/java/domain/Ball.java rename to src/main/java/baseball/domain/Ball.java index 5eb3115b1..ba613679c 100644 --- a/src/main/java/domain/Ball.java +++ b/src/main/java/baseball/domain/Ball.java @@ -1,7 +1,7 @@ -package domain; +package baseball.domain; -import domain.vo.BallNumber; -import domain.vo.Position; +import baseball.domain.vo.BallNumber; +import baseball.domain.vo.Position; import java.util.Objects; diff --git a/src/main/java/domain/BallStatus.java b/src/main/java/baseball/domain/BallStatus.java similarity index 88% rename from src/main/java/domain/BallStatus.java rename to src/main/java/baseball/domain/BallStatus.java index 20c8a7319..251879f1a 100644 --- a/src/main/java/domain/BallStatus.java +++ b/src/main/java/baseball/domain/BallStatus.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; public enum BallStatus { STRIKE, diff --git a/src/main/java/domain/BallStatuses.java b/src/main/java/baseball/domain/BallStatuses.java similarity index 97% rename from src/main/java/domain/BallStatuses.java rename to src/main/java/baseball/domain/BallStatuses.java index 7127bca62..5249a29c0 100644 --- a/src/main/java/domain/BallStatuses.java +++ b/src/main/java/baseball/domain/BallStatuses.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import java.util.List; diff --git a/src/main/java/domain/Balls.java b/src/main/java/baseball/domain/Balls.java similarity index 98% rename from src/main/java/domain/Balls.java rename to src/main/java/baseball/domain/Balls.java index 5828202b5..3d6e6265e 100644 --- a/src/main/java/domain/Balls.java +++ b/src/main/java/baseball/domain/Balls.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/domain/GameStatus.java b/src/main/java/baseball/domain/GameStatus.java similarity index 95% rename from src/main/java/domain/GameStatus.java rename to src/main/java/baseball/domain/GameStatus.java index 6d794bb06..630f8f85c 100644 --- a/src/main/java/domain/GameStatus.java +++ b/src/main/java/baseball/domain/GameStatus.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import java.util.Arrays; diff --git a/src/main/java/domain/Generation.java b/src/main/java/baseball/domain/Generation.java similarity index 67% rename from src/main/java/domain/Generation.java rename to src/main/java/baseball/domain/Generation.java index 0fe73bdbb..3ee3b048a 100644 --- a/src/main/java/domain/Generation.java +++ b/src/main/java/baseball/domain/Generation.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; public interface Generation { int generate(); diff --git a/src/main/java/domain/RandomNumberGeneration.java b/src/main/java/baseball/domain/RandomNumberGeneration.java similarity index 95% rename from src/main/java/domain/RandomNumberGeneration.java rename to src/main/java/baseball/domain/RandomNumberGeneration.java index 22e024f90..03bce148b 100644 --- a/src/main/java/domain/RandomNumberGeneration.java +++ b/src/main/java/baseball/domain/RandomNumberGeneration.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import java.util.Random; diff --git a/src/main/java/domain/Round.java b/src/main/java/baseball/domain/Round.java similarity index 93% rename from src/main/java/domain/Round.java rename to src/main/java/baseball/domain/Round.java index 58dad4dc8..cecf5e9cd 100644 --- a/src/main/java/domain/Round.java +++ b/src/main/java/baseball/domain/Round.java @@ -1,6 +1,6 @@ -package domain; +package baseball.domain; -import dto.RoundOutputDto; +import baseball.dto.RoundOutputDto; public class Round { public static final int ENOUGH_STRIKE_INCLUSIVE = 3; diff --git a/src/main/java/domain/vo/BallNumber.java b/src/main/java/baseball/domain/vo/BallNumber.java similarity index 97% rename from src/main/java/domain/vo/BallNumber.java rename to src/main/java/baseball/domain/vo/BallNumber.java index 2b0f38484..59800114f 100644 --- a/src/main/java/domain/vo/BallNumber.java +++ b/src/main/java/baseball/domain/vo/BallNumber.java @@ -1,4 +1,4 @@ -package domain.vo; +package baseball.domain.vo; import java.util.Objects; diff --git a/src/main/java/domain/vo/Position.java b/src/main/java/baseball/domain/vo/Position.java similarity index 97% rename from src/main/java/domain/vo/Position.java rename to src/main/java/baseball/domain/vo/Position.java index 728fdfb63..9ea900152 100644 --- a/src/main/java/domain/vo/Position.java +++ b/src/main/java/baseball/domain/vo/Position.java @@ -1,4 +1,4 @@ -package domain.vo; +package baseball.domain.vo; import java.util.Objects; diff --git a/src/main/java/dto/RoundInputDto.java b/src/main/java/baseball/dto/RoundInputDto.java similarity index 98% rename from src/main/java/dto/RoundInputDto.java rename to src/main/java/baseball/dto/RoundInputDto.java index db6213afd..82ae12f21 100644 --- a/src/main/java/dto/RoundInputDto.java +++ b/src/main/java/baseball/dto/RoundInputDto.java @@ -1,4 +1,4 @@ -package dto; +package baseball.dto; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/dto/RoundOutputDto.java b/src/main/java/baseball/dto/RoundOutputDto.java similarity index 97% rename from src/main/java/dto/RoundOutputDto.java rename to src/main/java/baseball/dto/RoundOutputDto.java index b28664561..9a59df804 100644 --- a/src/main/java/dto/RoundOutputDto.java +++ b/src/main/java/baseball/dto/RoundOutputDto.java @@ -1,4 +1,4 @@ -package dto; +package baseball.dto; public class RoundOutputDto { diff --git a/src/main/java/view/GameConsoleView.java b/src/main/java/baseball/view/GameConsoleView.java similarity index 90% rename from src/main/java/view/GameConsoleView.java rename to src/main/java/baseball/view/GameConsoleView.java index 5220a8bb6..626b5bd98 100644 --- a/src/main/java/view/GameConsoleView.java +++ b/src/main/java/baseball/view/GameConsoleView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import domain.GameStatus; +import baseball.domain.GameStatus; import java.util.Scanner; diff --git a/src/main/java/view/GameView.java b/src/main/java/baseball/view/GameView.java similarity index 50% rename from src/main/java/view/GameView.java rename to src/main/java/baseball/view/GameView.java index fb844fdb2..3cfba24bb 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/baseball/view/GameView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import domain.GameStatus; +import baseball.domain.GameStatus; public interface GameView { GameStatus gameInput(); diff --git a/src/main/java/view/RoundInputConsoleView.java b/src/main/java/baseball/view/RoundInputConsoleView.java similarity index 92% rename from src/main/java/view/RoundInputConsoleView.java rename to src/main/java/baseball/view/RoundInputConsoleView.java index 1391a7fee..14a74a6ee 100644 --- a/src/main/java/view/RoundInputConsoleView.java +++ b/src/main/java/baseball/view/RoundInputConsoleView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import dto.RoundInputDto; +import baseball.dto.RoundInputDto; import java.util.Scanner; diff --git a/src/main/java/view/RoundInputView.java b/src/main/java/baseball/view/RoundInputView.java similarity index 56% rename from src/main/java/view/RoundInputView.java rename to src/main/java/baseball/view/RoundInputView.java index bb56df572..db9327783 100644 --- a/src/main/java/view/RoundInputView.java +++ b/src/main/java/baseball/view/RoundInputView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import dto.RoundInputDto; +import baseball.dto.RoundInputDto; public interface RoundInputView { RoundInputDto roundUserInput(); diff --git a/src/main/java/view/RoundOutputConsoleView.java b/src/main/java/baseball/view/RoundOutputConsoleView.java similarity index 96% rename from src/main/java/view/RoundOutputConsoleView.java rename to src/main/java/baseball/view/RoundOutputConsoleView.java index a76727e9c..5fb51f3ce 100644 --- a/src/main/java/view/RoundOutputConsoleView.java +++ b/src/main/java/baseball/view/RoundOutputConsoleView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import dto.RoundOutputDto; +import baseball.dto.RoundOutputDto; public class RoundOutputConsoleView implements RoundOutputView{ diff --git a/src/main/java/view/RoundOutputView.java b/src/main/java/baseball/view/RoundOutputView.java similarity index 67% rename from src/main/java/view/RoundOutputView.java rename to src/main/java/baseball/view/RoundOutputView.java index da473b2ca..60dc9cc23 100644 --- a/src/main/java/view/RoundOutputView.java +++ b/src/main/java/baseball/view/RoundOutputView.java @@ -1,6 +1,6 @@ -package view; +package baseball.view; -import dto.RoundOutputDto; +import baseball.dto.RoundOutputDto; public interface RoundOutputView { void roundOutput(RoundOutputDto roundOutputDto); diff --git a/src/test/java/domain/BallStatusTest.java b/src/test/java/baseball/domain/BallStatusTest.java similarity index 97% rename from src/test/java/domain/BallStatusTest.java rename to src/test/java/baseball/domain/BallStatusTest.java index 824ddd927..b3441b972 100644 --- a/src/test/java/domain/BallStatusTest.java +++ b/src/test/java/baseball/domain/BallStatusTest.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/domain/BallStatusesTest.java b/src/test/java/baseball/domain/BallStatusesTest.java similarity index 98% rename from src/test/java/domain/BallStatusesTest.java rename to src/test/java/baseball/domain/BallStatusesTest.java index 1df89df68..e45f505ca 100644 --- a/src/test/java/domain/BallStatusesTest.java +++ b/src/test/java/baseball/domain/BallStatusesTest.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/domain/BallTest.java b/src/test/java/baseball/domain/BallTest.java similarity index 93% rename from src/test/java/domain/BallTest.java rename to src/test/java/baseball/domain/BallTest.java index b79bc2ec3..7b87c9306 100644 --- a/src/test/java/domain/BallTest.java +++ b/src/test/java/baseball/domain/BallTest.java @@ -1,9 +1,8 @@ -package domain; +package baseball.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; import java.util.stream.Stream; diff --git a/src/test/java/domain/BallsTest.java b/src/test/java/baseball/domain/BallsTest.java similarity index 98% rename from src/test/java/domain/BallsTest.java rename to src/test/java/baseball/domain/BallsTest.java index 1cb06554c..dd3247422 100644 --- a/src/test/java/domain/BallsTest.java +++ b/src/test/java/baseball/domain/BallsTest.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/GameStatusTest.java b/src/test/java/baseball/domain/GameStatusTest.java similarity index 97% rename from src/test/java/domain/GameStatusTest.java rename to src/test/java/baseball/domain/GameStatusTest.java index 919af720c..8d8d1d40b 100644 --- a/src/test/java/domain/GameStatusTest.java +++ b/src/test/java/baseball/domain/GameStatusTest.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/GenerateRandomNumberTest.java b/src/test/java/baseball/domain/GenerateRandomNumberTest.java similarity index 94% rename from src/test/java/domain/GenerateRandomNumberTest.java rename to src/test/java/baseball/domain/GenerateRandomNumberTest.java index 66be953ff..57fa7a17b 100644 --- a/src/test/java/domain/GenerateRandomNumberTest.java +++ b/src/test/java/baseball/domain/GenerateRandomNumberTest.java @@ -1,4 +1,4 @@ -package domain; +package baseball.domain; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/RoundTest.java b/src/test/java/baseball/domain/RoundTest.java similarity index 96% rename from src/test/java/domain/RoundTest.java rename to src/test/java/baseball/domain/RoundTest.java index 8ef317afe..3cb70dce8 100644 --- a/src/test/java/domain/RoundTest.java +++ b/src/test/java/baseball/domain/RoundTest.java @@ -1,6 +1,6 @@ -package domain; +package baseball.domain; -import dto.RoundOutputDto; +import baseball.dto.RoundOutputDto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/domain/vo/BallNumberTest.java b/src/test/java/baseball/domain/vo/BallNumberTest.java similarity index 97% rename from src/test/java/domain/vo/BallNumberTest.java rename to src/test/java/baseball/domain/vo/BallNumberTest.java index da3ae2a24..12bd0da25 100644 --- a/src/test/java/domain/vo/BallNumberTest.java +++ b/src/test/java/baseball/domain/vo/BallNumberTest.java @@ -1,4 +1,4 @@ -package domain.vo; +package baseball.domain.vo; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/domain/vo/PositionTest.java b/src/test/java/baseball/domain/vo/PositionTest.java similarity index 97% rename from src/test/java/domain/vo/PositionTest.java rename to src/test/java/baseball/domain/vo/PositionTest.java index a0dad0063..75553d026 100644 --- a/src/test/java/domain/vo/PositionTest.java +++ b/src/test/java/baseball/domain/vo/PositionTest.java @@ -1,4 +1,4 @@ -package domain.vo; +package baseball.domain.vo; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/dto/RoundInputDtoTest.java b/src/test/java/baseball/dto/RoundInputDtoTest.java similarity index 97% rename from src/test/java/dto/RoundInputDtoTest.java rename to src/test/java/baseball/dto/RoundInputDtoTest.java index bf6558a38..a038a7f4a 100644 --- a/src/test/java/dto/RoundInputDtoTest.java +++ b/src/test/java/baseball/dto/RoundInputDtoTest.java @@ -1,4 +1,4 @@ -package dto; +package baseball.dto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/dto/RoundOutputDtoTest.java b/src/test/java/baseball/dto/RoundOutputDtoTest.java similarity index 97% rename from src/test/java/dto/RoundOutputDtoTest.java rename to src/test/java/baseball/dto/RoundOutputDtoTest.java index 7ef08cac3..173ed7936 100644 --- a/src/test/java/dto/RoundOutputDtoTest.java +++ b/src/test/java/baseball/dto/RoundOutputDtoTest.java @@ -1,4 +1,4 @@ -package dto; +package baseball.dto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; From bda0bd7c47ec7c501b10a43ef523e3803450732c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Wed, 1 Sep 2021 01:27:39 +0900 Subject: [PATCH 32/40] =?UTF-8?q?refactor=20:=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=EC=8B=9C=20Set=20=EC=9E=90=EB=A3=8C=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Balls.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/domain/Balls.java b/src/main/java/baseball/domain/Balls.java index 3d6e6265e..67a6ade0b 100644 --- a/src/main/java/baseball/domain/Balls.java +++ b/src/main/java/baseball/domain/Balls.java @@ -1,6 +1,9 @@ package baseball.domain; +import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -42,9 +45,8 @@ private static void validate(List numbers) { } private static List extractDistinctNumber(final List numbers) { - return numbers.stream() - .distinct() - .collect(Collectors.toList()); + Set set = new LinkedHashSet<>(numbers); + return new ArrayList<>(set); } public BallStatuses compare(final Balls other) { From cc706a76272041bac91d11213d6fe6c8d8c83d5b Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 6 Sep 2021 15:10:48 +0900 Subject: [PATCH 33/40] =?UTF-8?q?refactor=20:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/BallStatuses.java | 2 +- src/main/java/baseball/domain/Generation.java | 1 + src/main/java/baseball/domain/Round.java | 3 ++- src/main/java/baseball/domain/vo/BallNumber.java | 2 +- src/main/java/baseball/domain/vo/Position.java | 2 +- src/main/java/baseball/dto/RoundInputDto.java | 2 +- src/main/java/baseball/view/GameView.java | 1 + src/main/java/baseball/view/RoundInputView.java | 1 + src/main/java/baseball/view/RoundOutputView.java | 1 + 9 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/domain/BallStatuses.java b/src/main/java/baseball/domain/BallStatuses.java index 5249a29c0..62539f94a 100644 --- a/src/main/java/baseball/domain/BallStatuses.java +++ b/src/main/java/baseball/domain/BallStatuses.java @@ -6,7 +6,7 @@ public class BallStatuses { public static final int BALL_STATUSES_SIZE = 3; - private List statuses; + private final List statuses; private BallStatuses(final List statuses) { this.statuses = statuses; diff --git a/src/main/java/baseball/domain/Generation.java b/src/main/java/baseball/domain/Generation.java index 3ee3b048a..e8f537856 100644 --- a/src/main/java/baseball/domain/Generation.java +++ b/src/main/java/baseball/domain/Generation.java @@ -1,5 +1,6 @@ package baseball.domain; public interface Generation { + int generate(); } diff --git a/src/main/java/baseball/domain/Round.java b/src/main/java/baseball/domain/Round.java index cecf5e9cd..a77bfa0f3 100644 --- a/src/main/java/baseball/domain/Round.java +++ b/src/main/java/baseball/domain/Round.java @@ -4,7 +4,8 @@ public class Round { public static final int ENOUGH_STRIKE_INCLUSIVE = 3; - private Balls balls; + + private final Balls balls; private boolean isOver; public Round(final Balls balls, final boolean isOver) { diff --git a/src/main/java/baseball/domain/vo/BallNumber.java b/src/main/java/baseball/domain/vo/BallNumber.java index 59800114f..dc6e32c8f 100644 --- a/src/main/java/baseball/domain/vo/BallNumber.java +++ b/src/main/java/baseball/domain/vo/BallNumber.java @@ -7,7 +7,7 @@ public class BallNumber { private static final int MIN_BALL_NUMBER = 1; private static final int MAX_BALL_NUMBER = 9; - private int number; + private final int number; private BallNumber(final int number) { this.number = number; diff --git a/src/main/java/baseball/domain/vo/Position.java b/src/main/java/baseball/domain/vo/Position.java index 9ea900152..526a29369 100644 --- a/src/main/java/baseball/domain/vo/Position.java +++ b/src/main/java/baseball/domain/vo/Position.java @@ -7,7 +7,7 @@ public class Position { private static final int MIN_POSITION = 1; private static final int MAX_POSITION = 3; - private int value; + private final int value; private Position(final int value) { this.value = value; diff --git a/src/main/java/baseball/dto/RoundInputDto.java b/src/main/java/baseball/dto/RoundInputDto.java index 82ae12f21..730d1be76 100644 --- a/src/main/java/baseball/dto/RoundInputDto.java +++ b/src/main/java/baseball/dto/RoundInputDto.java @@ -5,8 +5,8 @@ import java.util.stream.Collectors; public class RoundInputDto { - private final List numbers; + private final List numbers; private RoundInputDto(List numbers) { this.numbers = numbers; diff --git a/src/main/java/baseball/view/GameView.java b/src/main/java/baseball/view/GameView.java index 3cfba24bb..46531f268 100644 --- a/src/main/java/baseball/view/GameView.java +++ b/src/main/java/baseball/view/GameView.java @@ -3,5 +3,6 @@ import baseball.domain.GameStatus; public interface GameView { + GameStatus gameInput(); } diff --git a/src/main/java/baseball/view/RoundInputView.java b/src/main/java/baseball/view/RoundInputView.java index db9327783..dd47b25bd 100644 --- a/src/main/java/baseball/view/RoundInputView.java +++ b/src/main/java/baseball/view/RoundInputView.java @@ -3,5 +3,6 @@ import baseball.dto.RoundInputDto; public interface RoundInputView { + RoundInputDto roundUserInput(); } diff --git a/src/main/java/baseball/view/RoundOutputView.java b/src/main/java/baseball/view/RoundOutputView.java index 60dc9cc23..80f0fbc1f 100644 --- a/src/main/java/baseball/view/RoundOutputView.java +++ b/src/main/java/baseball/view/RoundOutputView.java @@ -3,6 +3,7 @@ import baseball.dto.RoundOutputDto; public interface RoundOutputView { + void roundOutput(RoundOutputDto roundOutputDto); void roundOverOutput(); From 1212900e83db3881ec563f4dd5d63c2251dc120f Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 6 Sep 2021 15:17:51 +0900 Subject: [PATCH 34/40] =?UTF-8?q?style=20:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Ball.java | 2 +- src/main/java/baseball/domain/vo/BallNumber.java | 12 ++++++------ src/main/java/baseball/domain/vo/Position.java | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/baseball/domain/Ball.java b/src/main/java/baseball/domain/Ball.java index ba613679c..ccb65cc09 100644 --- a/src/main/java/baseball/domain/Ball.java +++ b/src/main/java/baseball/domain/Ball.java @@ -33,7 +33,7 @@ public BallStatus compare(final Ball other) { return BallStatus.NOTHING; } - public boolean hasSameNumber(final BallNumber number) { + private boolean hasSameNumber(final BallNumber number) { return this.number.equals(number); } diff --git a/src/main/java/baseball/domain/vo/BallNumber.java b/src/main/java/baseball/domain/vo/BallNumber.java index dc6e32c8f..6fe9b81cc 100644 --- a/src/main/java/baseball/domain/vo/BallNumber.java +++ b/src/main/java/baseball/domain/vo/BallNumber.java @@ -18,6 +18,12 @@ public static BallNumber from(final int number) { return new BallNumber(number); } + private static void validate(final int number) { + if (number < MIN_BALL_NUMBER || number > MAX_BALL_NUMBER) { + throw new IllegalArgumentException("1~9 사이의 숫자를 입력해야 합니다"); + } + } + @Override public boolean equals(final Object o) { if (this == o) return true; @@ -30,10 +36,4 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(number); } - - private static void validate(final int number) { - if (number < MIN_BALL_NUMBER || number > MAX_BALL_NUMBER) { - throw new IllegalArgumentException("1~9 사이의 숫자를 입력해야 합니다"); - } - } } diff --git a/src/main/java/baseball/domain/vo/Position.java b/src/main/java/baseball/domain/vo/Position.java index 526a29369..a39e985ee 100644 --- a/src/main/java/baseball/domain/vo/Position.java +++ b/src/main/java/baseball/domain/vo/Position.java @@ -18,6 +18,12 @@ public static Position from(final int value) { return new Position(value); } + private static void validate(final int value) { + if (value < MIN_POSITION || value > MAX_POSITION) { + throw new IllegalArgumentException("1~3 사이의 위치를 입력해야 합니다"); + } + } + @Override public boolean equals(final Object o) { if (this == o) return true; @@ -30,10 +36,4 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(value); } - - private static void validate(final int value) { - if (value < MIN_POSITION || value > MAX_POSITION) { - throw new IllegalArgumentException("1~3 사이의 위치를 입력해야 합니다"); - } - } } From 677c907236f48d8b6b925cd7e8c3856f7239612b Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 6 Sep 2021 15:18:48 +0900 Subject: [PATCH 35/40] =?UTF-8?q?refactor=20:=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=A0=91=EA=B7=BC=20=EC=A0=9C=EC=96=B4=EC=9E=90=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Ball.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/domain/Ball.java b/src/main/java/baseball/domain/Ball.java index ccb65cc09..b33d65f31 100644 --- a/src/main/java/baseball/domain/Ball.java +++ b/src/main/java/baseball/domain/Ball.java @@ -10,7 +10,7 @@ public class Ball { private final BallNumber number; private final Position position; - public Ball(final BallNumber number, final Position position) { + private Ball(final BallNumber number, final Position position) { this.number = number; this.position = position; } From 5f0b905a606a3f1aa5502f6fc63b3c1517e50eb9 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 6 Sep 2021 15:50:10 +0900 Subject: [PATCH 36/40] =?UTF-8?q?refactor=20:=20=EC=99=B8=EB=B6=80?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EC=83=81=EC=88=98=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/RoundController.java | 2 +- src/main/java/baseball/domain/BallStatuses.java | 2 +- src/main/java/baseball/domain/Balls.java | 4 ++-- src/main/java/baseball/domain/Round.java | 2 +- src/main/java/baseball/view/RoundInputConsoleView.java | 4 +++- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/baseball/controller/RoundController.java b/src/main/java/baseball/controller/RoundController.java index be2c1c6b1..bcb6427fd 100644 --- a/src/main/java/baseball/controller/RoundController.java +++ b/src/main/java/baseball/controller/RoundController.java @@ -15,7 +15,7 @@ public class RoundController { - public static final int BASEBALL_LENGTH = 3; + private static final int BASEBALL_LENGTH = 3; private final RoundInputView roundInputView; private final RoundOutputView roundOutputView; diff --git a/src/main/java/baseball/domain/BallStatuses.java b/src/main/java/baseball/domain/BallStatuses.java index 62539f94a..460207999 100644 --- a/src/main/java/baseball/domain/BallStatuses.java +++ b/src/main/java/baseball/domain/BallStatuses.java @@ -4,7 +4,7 @@ public class BallStatuses { - public static final int BALL_STATUSES_SIZE = 3; + private static final int BALL_STATUSES_SIZE = 3; private final List statuses; diff --git a/src/main/java/baseball/domain/Balls.java b/src/main/java/baseball/domain/Balls.java index 67a6ade0b..aa92ba9bb 100644 --- a/src/main/java/baseball/domain/Balls.java +++ b/src/main/java/baseball/domain/Balls.java @@ -9,8 +9,8 @@ public class Balls { - public static final int START_POSITION = 1; - public static final int MAX_POSITION = 3; + private static final int START_POSITION = 1; + private static final int MAX_POSITION = 3; private final List values; diff --git a/src/main/java/baseball/domain/Round.java b/src/main/java/baseball/domain/Round.java index a77bfa0f3..c144f5094 100644 --- a/src/main/java/baseball/domain/Round.java +++ b/src/main/java/baseball/domain/Round.java @@ -3,7 +3,7 @@ import baseball.dto.RoundOutputDto; public class Round { - public static final int ENOUGH_STRIKE_INCLUSIVE = 3; + private static final int ENOUGH_STRIKE_INCLUSIVE = 3; private final Balls balls; private boolean isOver; diff --git a/src/main/java/baseball/view/RoundInputConsoleView.java b/src/main/java/baseball/view/RoundInputConsoleView.java index 14a74a6ee..27043cfae 100644 --- a/src/main/java/baseball/view/RoundInputConsoleView.java +++ b/src/main/java/baseball/view/RoundInputConsoleView.java @@ -5,7 +5,9 @@ import java.util.Scanner; public class RoundInputConsoleView implements RoundInputView { - public static final String DELIMITER = ""; + + private static final String DELIMITER = ""; + private final Scanner scanner; private RoundInputConsoleView(final Scanner scanner) { From 650891f764d34a5224c9f33a736fd1fdaa265eae Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 6 Sep 2021 15:50:42 +0900 Subject: [PATCH 37/40] =?UTF-8?q?refactor=20:=20=EC=9E=AC=EC=A0=95?= =?UTF-8?q?=EC=9D=98=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20@Ov?= =?UTF-8?q?erride=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/GameConsoleView.java | 1 + src/main/java/baseball/view/RoundInputConsoleView.java | 1 + src/main/java/baseball/view/RoundOutputConsoleView.java | 2 ++ 3 files changed, 4 insertions(+) diff --git a/src/main/java/baseball/view/GameConsoleView.java b/src/main/java/baseball/view/GameConsoleView.java index 626b5bd98..b5c05689b 100644 --- a/src/main/java/baseball/view/GameConsoleView.java +++ b/src/main/java/baseball/view/GameConsoleView.java @@ -16,6 +16,7 @@ public static GameConsoleView from(final Scanner scanner) { return new GameConsoleView(scanner); } + @Override public GameStatus gameInput() { System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); String status = scanner.nextLine(); diff --git a/src/main/java/baseball/view/RoundInputConsoleView.java b/src/main/java/baseball/view/RoundInputConsoleView.java index 27043cfae..8576544c6 100644 --- a/src/main/java/baseball/view/RoundInputConsoleView.java +++ b/src/main/java/baseball/view/RoundInputConsoleView.java @@ -18,6 +18,7 @@ public static RoundInputView from(final Scanner scanner) { return new RoundInputConsoleView(scanner); } + @Override public RoundInputDto roundUserInput() { System.out.print("숫자를 입력해 주세요 : "); String userInput = scanner.nextLine(); diff --git a/src/main/java/baseball/view/RoundOutputConsoleView.java b/src/main/java/baseball/view/RoundOutputConsoleView.java index 5fb51f3ce..633e749ef 100644 --- a/src/main/java/baseball/view/RoundOutputConsoleView.java +++ b/src/main/java/baseball/view/RoundOutputConsoleView.java @@ -15,6 +15,7 @@ public static RoundOutputView getInstance() { return new RoundOutputConsoleView(); } + @Override public void roundOutput(RoundOutputDto roundOutputDto) { String ball = parseBallOutput(roundOutputDto.ball()); String strike = parseStrikeOutput(roundOutputDto.strike()); @@ -23,6 +24,7 @@ public void roundOutput(RoundOutputDto roundOutputDto) { System.out.println(result); } + @Override public void roundOverOutput() { System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); } From a6ae1801de0fb30ad7db52d464f6dc1228004da7 Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Mon, 6 Sep 2021 16:53:40 +0900 Subject: [PATCH 38/40] =?UTF-8?q?refactor=20:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EB=B6=88=EB=B3=80=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Main.java | 5 ++--- .../baseball/controller/GameController.java | 11 +++++------ .../baseball/controller/RoundController.java | 8 ++++++-- src/main/java/baseball/domain/Round.java | 18 +++++------------- src/test/java/baseball/domain/RoundTest.java | 4 ++-- 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/main/java/baseball/Main.java b/src/main/java/baseball/Main.java index d8e7a8add..88c0eb85f 100644 --- a/src/main/java/baseball/Main.java +++ b/src/main/java/baseball/Main.java @@ -2,11 +2,10 @@ import baseball.controller.GameController; import baseball.controller.RoundController; -import baseball.domain.GameStatus; import baseball.domain.Generation; import baseball.domain.RandomNumberGeneration; -import baseball.view.GameView; import baseball.view.GameConsoleView; +import baseball.view.GameView; import baseball.view.RoundInputConsoleView; import baseball.view.RoundInputView; import baseball.view.RoundOutputConsoleView; @@ -24,7 +23,7 @@ public static void main(String[] args) { Random random = new Random(); Generation generation = new RandomNumberGeneration(random); RoundController roundController = RoundController.of(roundInputView, roundOutputView, generation); - GameController gameController = GameController.of(roundController, gameView, GameStatus.PLAY); + GameController gameController = GameController.of(roundController, gameView); gameController.run(); scanner.close(); } diff --git a/src/main/java/baseball/controller/GameController.java b/src/main/java/baseball/controller/GameController.java index b8cc9f6e5..5d11ed0e0 100644 --- a/src/main/java/baseball/controller/GameController.java +++ b/src/main/java/baseball/controller/GameController.java @@ -8,19 +8,18 @@ public class GameController { private final GameView gameView; private final RoundController roundController; - private GameStatus gameStatus; - - public GameController(final RoundController roundController, final GameView gameView, final GameStatus gameStatus) { + public GameController(final RoundController roundController, final GameView gameView) { this.roundController = roundController; this.gameView = gameView; - this.gameStatus = gameStatus; } - public static GameController of(final RoundController roundController, final GameView gameView, final GameStatus gameStatus) { - return new GameController(roundController, gameView, gameStatus); + public static GameController of(final RoundController roundController, final GameView gameView) { + return new GameController(roundController, gameView); } public void run() { + GameStatus gameStatus = GameStatus.PLAY; + while (gameStatus == GameStatus.PLAY) { roundController.run(); gameStatus = gameView.gameInput(); diff --git a/src/main/java/baseball/controller/RoundController.java b/src/main/java/baseball/controller/RoundController.java index bcb6427fd..3d6b3af70 100644 --- a/src/main/java/baseball/controller/RoundController.java +++ b/src/main/java/baseball/controller/RoundController.java @@ -16,12 +16,12 @@ public class RoundController { private static final int BASEBALL_LENGTH = 3; + private static final int INITIAL_STRIKE_VALUE = 0; private final RoundInputView roundInputView; private final RoundOutputView roundOutputView; private final Generation generation; - private RoundController(final RoundInputView roundInputView, final RoundOutputView roundOutputView, final Generation generation) { this.roundInputView = roundInputView; @@ -36,13 +36,17 @@ public static RoundController of(final RoundInputView roundInputView, final Roun public void run() { Round round = nextRound(); - while (!round.isOver()) { + int strike = INITIAL_STRIKE_VALUE; + + while (!round.hasEnough(strike)) { RoundInputDto roundInputDto = roundInputView.roundUserInput(); List userNumbers = roundInputDto.numbers(); Balls userBalls = Balls.from(userNumbers); RoundOutputDto roundOutputDto = round.countResult(userBalls); + strike = roundOutputDto.strike(); roundOutputView.roundOutput(roundOutputDto); } + roundOutputView.roundOverOutput(); } diff --git a/src/main/java/baseball/domain/Round.java b/src/main/java/baseball/domain/Round.java index c144f5094..74726e888 100644 --- a/src/main/java/baseball/domain/Round.java +++ b/src/main/java/baseball/domain/Round.java @@ -3,35 +3,27 @@ import baseball.dto.RoundOutputDto; public class Round { + private static final int ENOUGH_STRIKE_INCLUSIVE = 3; private final Balls balls; - private boolean isOver; - public Round(final Balls balls, final boolean isOver) { + public Round(final Balls balls) { this.balls = balls; - this.isOver = isOver; } public static Round from(Balls balls) { - return new Round(balls, false); + return new Round(balls); } public RoundOutputDto countResult(Balls userBalls) { BallStatuses ballStatuses = balls.compare(userBalls); int strike = ballStatuses.countStrike(); int ball = ballStatuses.countBall(); - areEnoughStrikes(strike); return RoundOutputDto.of(strike, ball); } - private void areEnoughStrikes(final int strike) { - if (strike == ENOUGH_STRIKE_INCLUSIVE) { - isOver = true; - } - } - - public boolean isOver() { - return isOver; + public boolean hasEnough(final int strike) { + return strike == ENOUGH_STRIKE_INCLUSIVE; } } diff --git a/src/test/java/baseball/domain/RoundTest.java b/src/test/java/baseball/domain/RoundTest.java index 3cb70dce8..b292cc174 100644 --- a/src/test/java/baseball/domain/RoundTest.java +++ b/src/test/java/baseball/domain/RoundTest.java @@ -42,9 +42,9 @@ void isOver(List numbers, boolean expect) { Round round = Round.from(balls); List userNumbers = Arrays.asList(1, 2, 3); Balls userBalls = Balls.from(userNumbers); - round.countResult(userBalls); + RoundOutputDto roundOutputDto = round.countResult(userBalls); - boolean actual = round.isOver(); + boolean actual = round.hasEnough(roundOutputDto.strike()); assertThat(actual).isEqualTo(expect); } From 728b2fd989c37cc602496b9c54b6462fa0a80d2c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 16 Sep 2021 15:51:15 +0900 Subject: [PATCH 39/40] =?UTF-8?q?refactor=20:=20Balls=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=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/java/baseball/domain/Balls.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/domain/Balls.java b/src/main/java/baseball/domain/Balls.java index aa92ba9bb..25c03f6b3 100644 --- a/src/main/java/baseball/domain/Balls.java +++ b/src/main/java/baseball/domain/Balls.java @@ -1,6 +1,7 @@ package baseball.domain; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -18,13 +19,13 @@ private Balls(final List values) { this.values = values; } - public static Balls from(final List numbers) { + public static Balls from(final Collection numbers) { validate(numbers); List balls = changeBallsFrom(numbers); return new Balls(balls); } - private static List changeBallsFrom(final List numbers) { + private static List changeBallsFrom(final Collection numbers) { AtomicInteger position = new AtomicInteger(START_POSITION); return numbers.stream() @@ -32,7 +33,7 @@ private static List changeBallsFrom(final List numbers) { .collect(Collectors.toList()); } - private static void validate(List numbers) { + private static void validate(Collection numbers) { List distinctNumber = extractDistinctNumber(numbers); if (distinctNumber.size() != numbers.size()) { @@ -44,7 +45,7 @@ private static void validate(List numbers) { } } - private static List extractDistinctNumber(final List numbers) { + private static List extractDistinctNumber(final Collection numbers) { Set set = new LinkedHashSet<>(numbers); return new ArrayList<>(set); } From 2e86f14f61ed98cc0c6deea05f85a925b014f27c Mon Sep 17 00:00:00 2001 From: sdrs6921 Date: Thu, 16 Sep 2021 15:51:51 +0900 Subject: [PATCH 40/40] =?UTF-8?q?refactor=20:=20Controller=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20Round=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/RoundController.java | 29 +++---------------- src/main/java/baseball/domain/Round.java | 23 +++++++++++++-- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/main/java/baseball/controller/RoundController.java b/src/main/java/baseball/controller/RoundController.java index 3d6b3af70..69d30ca5e 100644 --- a/src/main/java/baseball/controller/RoundController.java +++ b/src/main/java/baseball/controller/RoundController.java @@ -8,16 +8,10 @@ import baseball.view.RoundInputView; import baseball.view.RoundOutputView; -import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; public class RoundController { - private static final int BASEBALL_LENGTH = 3; - private static final int INITIAL_STRIKE_VALUE = 0; - private final RoundInputView roundInputView; private final RoundOutputView roundOutputView; private final Generation generation; @@ -35,34 +29,19 @@ public static RoundController of(final RoundInputView roundInputView, final Roun } public void run() { - Round round = nextRound(); - int strike = INITIAL_STRIKE_VALUE; + Round round = Round.nextRound(generation); + int strike; - while (!round.hasEnough(strike)) { + do { RoundInputDto roundInputDto = roundInputView.roundUserInput(); List userNumbers = roundInputDto.numbers(); Balls userBalls = Balls.from(userNumbers); RoundOutputDto roundOutputDto = round.countResult(userBalls); strike = roundOutputDto.strike(); roundOutputView.roundOutput(roundOutputDto); - } + } while (!round.hasEnough(strike)); roundOutputView.roundOverOutput(); } - private Round nextRound() { - List numbers = initializeRandomBalls(); - Balls balls = Balls.from(numbers); - return Round.from(balls); - } - - private List initializeRandomBalls() { - Set set = new LinkedHashSet<>(); - while (set.size() < BASEBALL_LENGTH) { - int systemNumber = generation.generate(); - set.add(systemNumber); - } - return new ArrayList<>(set); - } - } diff --git a/src/main/java/baseball/domain/Round.java b/src/main/java/baseball/domain/Round.java index 74726e888..3be9f1c77 100644 --- a/src/main/java/baseball/domain/Round.java +++ b/src/main/java/baseball/domain/Round.java @@ -2,20 +2,39 @@ import baseball.dto.RoundOutputDto; +import java.util.LinkedHashSet; +import java.util.Set; + public class Round { private static final int ENOUGH_STRIKE_INCLUSIVE = 3; + private static final int BASEBALL_LENGTH = 3; private final Balls balls; - public Round(final Balls balls) { + private Round(final Balls balls) { this.balls = balls; } public static Round from(Balls balls) { return new Round(balls); } - + + public static Round nextRound(final Generation generation) { + Set numbers = generateNumbers(generation); + Balls balls = Balls.from(numbers); + return new Round(balls); + } + + private static Set generateNumbers(final Generation generation) { + Set set = new LinkedHashSet<>(); + while (set.size() < BASEBALL_LENGTH) { + int systemNumber = generation.generate(); + set.add(systemNumber); + } + return set; + } + public RoundOutputDto countResult(Balls userBalls) { BallStatuses ballStatuses = balls.compare(userBalls); int strike = ballStatuses.countStrike();