From fe78ba7db8a8b6bdce46e6134836d1625dc70360 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sat, 5 Apr 2025 23:33:14 +0900 Subject: [PATCH 01/32] =?UTF-8?q?feat:=20RacingCar=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/RacingCar.java | 23 +++++++++++++++++++ .../java/racingcar/domain/RacingCarTest.java | 18 +++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/racingcar/domain/RacingCar.java create mode 100644 src/test/java/racingcar/domain/RacingCarTest.java diff --git a/src/main/java/racingcar/domain/RacingCar.java b/src/main/java/racingcar/domain/RacingCar.java new file mode 100644 index 0000000..37956ae --- /dev/null +++ b/src/main/java/racingcar/domain/RacingCar.java @@ -0,0 +1,23 @@ +package racingcar.domain; + +public class RacingCar { + + + private final String name; + + public RacingCar(String name) { + this.name = name; + } + + public void validateName() { + if (name.length() > 5) { + throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); + } + } + public String getName() { + return name; + } + public void move() { + + } +} diff --git a/src/test/java/racingcar/domain/RacingCarTest.java b/src/test/java/racingcar/domain/RacingCarTest.java new file mode 100644 index 0000000..a2441bb --- /dev/null +++ b/src/test/java/racingcar/domain/RacingCarTest.java @@ -0,0 +1,18 @@ +package racingcar.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RacingCarTest { + + + @Test + void validateName() { + RacingCar ddd = new RacingCar("ddd"); + ddd.validateName(); + String name = ddd.getName(); + Assertions.assertThat(name).isEqualTo("ddd"); + } +} \ No newline at end of file From a0ded4575f024da7379c84e68cf93a9d8084464e Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 00:25:29 +0900 Subject: [PATCH 02/32] =?UTF-8?q?feat:=20RacingMachine=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=83=9D=EC=84=B1=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 boolean 반환값으로 RacingCar 에서 움직이도록 했습니다. --- .../domain/{ => model}/RacingCar.java | 15 +++++++++++---- .../racingcar/domain/model/RacingMachine.java | 13 +++++++++++++ .../racingcar/domain/rule/MoveStrategy.java | 5 +++++ .../java/racingcar/domain/RacingCarTest.java | 19 +++++++++++++++---- 4 files changed, 44 insertions(+), 8 deletions(-) rename src/main/java/racingcar/domain/{ => model}/RacingCar.java (58%) create mode 100644 src/main/java/racingcar/domain/model/RacingMachine.java create mode 100644 src/main/java/racingcar/domain/rule/MoveStrategy.java diff --git a/src/main/java/racingcar/domain/RacingCar.java b/src/main/java/racingcar/domain/model/RacingCar.java similarity index 58% rename from src/main/java/racingcar/domain/RacingCar.java rename to src/main/java/racingcar/domain/model/RacingCar.java index 37956ae..e2aede2 100644 --- a/src/main/java/racingcar/domain/RacingCar.java +++ b/src/main/java/racingcar/domain/model/RacingCar.java @@ -1,9 +1,8 @@ -package racingcar.domain; +package racingcar.domain.model; public class RacingCar { - - private final String name; + private String winning = null; public RacingCar(String name) { this.name = name; @@ -14,10 +13,18 @@ public void validateName() { throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); } } + + public void move(RacingMachine racingMachine) { + if (racingMachine.isMoveable()) { + winning += "-"; + } + } + public String getName() { return name; } - public void move() { + public String getWinning() { + return winning; } } diff --git a/src/main/java/racingcar/domain/model/RacingMachine.java b/src/main/java/racingcar/domain/model/RacingMachine.java new file mode 100644 index 0000000..e2886f0 --- /dev/null +++ b/src/main/java/racingcar/domain/model/RacingMachine.java @@ -0,0 +1,13 @@ +package racingcar.domain.model; + +import racingcar.domain.rule.MoveStrategy; + +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; + +public class RacingMachine implements MoveStrategy { + + @Override + public boolean isMoveable() { + return pickNumberInRange(0,9) >= 4; + } +} diff --git a/src/main/java/racingcar/domain/rule/MoveStrategy.java b/src/main/java/racingcar/domain/rule/MoveStrategy.java new file mode 100644 index 0000000..14a18b5 --- /dev/null +++ b/src/main/java/racingcar/domain/rule/MoveStrategy.java @@ -0,0 +1,5 @@ +package racingcar.domain.rule; + +public interface MoveStrategy { + boolean isMoveable(); +} diff --git a/src/test/java/racingcar/domain/RacingCarTest.java b/src/test/java/racingcar/domain/RacingCarTest.java index a2441bb..4e031c5 100644 --- a/src/test/java/racingcar/domain/RacingCarTest.java +++ b/src/test/java/racingcar/domain/RacingCarTest.java @@ -2,17 +2,28 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; +import racingcar.domain.model.RacingCar; +import racingcar.domain.model.RacingMachine; +import racingcar.domain.rule.MoveStrategy; class RacingCarTest { - + RacingCar ddd = new RacingCar("ddd"); + RacingMachine racingMachine = new RacingMachine(); @Test void validateName() { - RacingCar ddd = new RacingCar("ddd"); ddd.validateName(); String name = ddd.getName(); Assertions.assertThat(name).isEqualTo("ddd"); } + + @Test + void move() { + boolean moveable = racingMachine.isMoveable(); + if (moveable) { + Assertions.assertThat(ddd.getWinning()).isEqualTo("-"); + } else { + Assertions.assertThat(ddd.getWinning()).isEqualTo(null); + } + } } \ No newline at end of file From 29b975bdf2e949e4d7b497d9db4041e6f006bf96 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 02:09:47 +0900 Subject: [PATCH 03/32] =?UTF-8?q?feat:=20RacingCars=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 일급 컬렉션을 사용하기 위해 RacingCars 클래스 생성했습니다. --- build.gradle | 2 +- .../racingcar/domain/InitialController.java | 5 +++ .../racingcar/domain/model/RacingCar.java | 21 ++++++++----- .../racingcar/domain/model/RacingCars.java | 31 +++++++++++++++++++ .../racingcar/domain/model/RacingMachine.java | 6 ++-- .../racingcar/domain/rule/MoveStrategy.java | 5 --- .../java/racingcar/domain/RacingCarTest.java | 9 +----- 7 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 src/main/java/racingcar/domain/InitialController.java create mode 100644 src/main/java/racingcar/domain/model/RacingCars.java delete mode 100644 src/main/java/racingcar/domain/rule/MoveStrategy.java diff --git a/build.gradle b/build.gradle index a89989b..15f3352 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ dependencies { java { toolchain { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(17) } } diff --git a/src/main/java/racingcar/domain/InitialController.java b/src/main/java/racingcar/domain/InitialController.java new file mode 100644 index 0000000..c539fc8 --- /dev/null +++ b/src/main/java/racingcar/domain/InitialController.java @@ -0,0 +1,5 @@ +package racingcar.domain; + +public class InitialController { + +} diff --git a/src/main/java/racingcar/domain/model/RacingCar.java b/src/main/java/racingcar/domain/model/RacingCar.java index e2aede2..db99a2e 100644 --- a/src/main/java/racingcar/domain/model/RacingCar.java +++ b/src/main/java/racingcar/domain/model/RacingCar.java @@ -2,29 +2,34 @@ public class RacingCar { private final String name; - private String winning = null; + private int position; public RacingCar(String name) { + validateNameLength(); + validateNameEmpty(); this.name = name; + this.position = 0; } - public void validateName() { + private void validateNameLength() { if (name.length() > 5) { throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); } } - public void move(RacingMachine racingMachine) { - if (racingMachine.isMoveable()) { - winning += "-"; + private void validateNameEmpty() { + if (name == null) { + throw new IllegalArgumentException("이름이 존재하지 않습니다."); } } + public void move() { + position ++; + } + public String getName() { return name; } - public String getWinning() { - return winning; - } + } diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java new file mode 100644 index 0000000..2169337 --- /dev/null +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -0,0 +1,31 @@ +package racingcar.domain.model; + +import java.util.List; + +public class RacingCars { + private List racingCars; + + private RacingCars(List carNames) { + this.racingCars = carNames; + validateNameListEmpty(); + validateDuplicateName(); + + } + + public static RacingCars create(List userInput) { + return new RacingCars(userInput); + } + + private void validateDuplicateName() { + if (racingCars.size() != racingCars.stream().distinct().count()) { + throw new IllegalArgumentException("중복된 이름이 존재합니다."); + } + } + + private void validateNameListEmpty() { + if (racingCars.isEmpty()) { + throw new IllegalArgumentException("이름 목록이 비어있습니다."); + } + } + +} diff --git a/src/main/java/racingcar/domain/model/RacingMachine.java b/src/main/java/racingcar/domain/model/RacingMachine.java index e2886f0..f247d12 100644 --- a/src/main/java/racingcar/domain/model/RacingMachine.java +++ b/src/main/java/racingcar/domain/model/RacingMachine.java @@ -1,13 +1,11 @@ package racingcar.domain.model; -import racingcar.domain.rule.MoveStrategy; - import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; -public class RacingMachine implements MoveStrategy { +public class RacingMachine { - @Override public boolean isMoveable() { return pickNumberInRange(0,9) >= 4; } + } diff --git a/src/main/java/racingcar/domain/rule/MoveStrategy.java b/src/main/java/racingcar/domain/rule/MoveStrategy.java deleted file mode 100644 index 14a18b5..0000000 --- a/src/main/java/racingcar/domain/rule/MoveStrategy.java +++ /dev/null @@ -1,5 +0,0 @@ -package racingcar.domain.rule; - -public interface MoveStrategy { - boolean isMoveable(); -} diff --git a/src/test/java/racingcar/domain/RacingCarTest.java b/src/test/java/racingcar/domain/RacingCarTest.java index 4e031c5..bf40a46 100644 --- a/src/test/java/racingcar/domain/RacingCarTest.java +++ b/src/test/java/racingcar/domain/RacingCarTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.Test; import racingcar.domain.model.RacingCar; import racingcar.domain.model.RacingMachine; -import racingcar.domain.rule.MoveStrategy; class RacingCarTest { RacingCar ddd = new RacingCar("ddd"); @@ -12,18 +11,12 @@ class RacingCarTest { @Test void validateName() { - ddd.validateName(); String name = ddd.getName(); Assertions.assertThat(name).isEqualTo("ddd"); } @Test void move() { - boolean moveable = racingMachine.isMoveable(); - if (moveable) { - Assertions.assertThat(ddd.getWinning()).isEqualTo("-"); - } else { - Assertions.assertThat(ddd.getWinning()).isEqualTo(null); - } + } } \ No newline at end of file From a0ebe7e6eb828462ff871eca506afdccee3f9b16 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 03:20:10 +0900 Subject: [PATCH 04/32] =?UTF-8?q?feat:=20Race=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 레이스 시작 메서드 구현 2. position 구하는 메서드 구현 --- .../java/racingcar/domain/model/Race.java | 35 +++++++++++++++++++ .../racingcar/domain/model/RacingCar.java | 9 ++++- .../racingcar/domain/model/RacingCars.java | 7 +++- .../racingcar/domain/model/RacingMachine.java | 11 ------ .../java/racingcar/domain/RacingCarTest.java | 2 -- 5 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 src/main/java/racingcar/domain/model/Race.java delete mode 100644 src/main/java/racingcar/domain/model/RacingMachine.java diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java new file mode 100644 index 0000000..8a3c7d5 --- /dev/null +++ b/src/main/java/racingcar/domain/model/Race.java @@ -0,0 +1,35 @@ +package racingcar.domain.model; + +import java.util.List; +import java.util.stream.Collectors; + +public class Race { + + private final RacingCars racingCars; + + public Race(RacingCars racingCars) { + this.racingCars = racingCars; + } + + public void startRace() { + for (RacingCar racingCar : racingCars.getRacingCars()) { + racingCar.move(); + } + } + + public List compare() { + return racingCars.getRacingCars().stream().filter(car -> car.getPosition() == getWinningPosition()).toList(); + } + + + + private int getWinningPosition() { + return racingCars.getRacingCars() + .stream() + .mapToInt(RacingCar::getPosition) + .max() + .orElseThrow(() -> new IllegalArgumentException("차량이 없습니다.")); + } + + +} diff --git a/src/main/java/racingcar/domain/model/RacingCar.java b/src/main/java/racingcar/domain/model/RacingCar.java index db99a2e..840e034 100644 --- a/src/main/java/racingcar/domain/model/RacingCar.java +++ b/src/main/java/racingcar/domain/model/RacingCar.java @@ -1,5 +1,7 @@ package racingcar.domain.model; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; + public class RacingCar { private final String name; private int position; @@ -24,7 +26,9 @@ private void validateNameEmpty() { } public void move() { - position ++; + if (pickNumberInRange(0, 9) >= 4) { + position++; + } } public String getName() { @@ -32,4 +36,7 @@ public String getName() { } + public int getPosition() { + return position; + } } diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index 2169337..8e17b83 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -3,7 +3,7 @@ import java.util.List; public class RacingCars { - private List racingCars; + private final List racingCars; private RacingCars(List carNames) { this.racingCars = carNames; @@ -16,6 +16,10 @@ public static RacingCars create(List userInput) { return new RacingCars(userInput); } + public List getRacingCars() { + return racingCars; + } + private void validateDuplicateName() { if (racingCars.size() != racingCars.stream().distinct().count()) { throw new IllegalArgumentException("중복된 이름이 존재합니다."); @@ -28,4 +32,5 @@ private void validateNameListEmpty() { } } + } diff --git a/src/main/java/racingcar/domain/model/RacingMachine.java b/src/main/java/racingcar/domain/model/RacingMachine.java deleted file mode 100644 index f247d12..0000000 --- a/src/main/java/racingcar/domain/model/RacingMachine.java +++ /dev/null @@ -1,11 +0,0 @@ -package racingcar.domain.model; - -import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; - -public class RacingMachine { - - public boolean isMoveable() { - return pickNumberInRange(0,9) >= 4; - } - -} diff --git a/src/test/java/racingcar/domain/RacingCarTest.java b/src/test/java/racingcar/domain/RacingCarTest.java index bf40a46..ca7e175 100644 --- a/src/test/java/racingcar/domain/RacingCarTest.java +++ b/src/test/java/racingcar/domain/RacingCarTest.java @@ -3,11 +3,9 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import racingcar.domain.model.RacingCar; -import racingcar.domain.model.RacingMachine; class RacingCarTest { RacingCar ddd = new RacingCar("ddd"); - RacingMachine racingMachine = new RacingMachine(); @Test void validateName() { From fd71c3614657db1c7f98715733eaac1e0c1cdae3 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 03:36:36 +0900 Subject: [PATCH 05/32] =?UTF-8?q?feat:=20startRace=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 1. 파라메터 추가 2. input으로 들어올 횟수만큼 반복 기능 구현 --- src/main/java/racingcar/domain/model/Race.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java index 8a3c7d5..c1062de 100644 --- a/src/main/java/racingcar/domain/model/Race.java +++ b/src/main/java/racingcar/domain/model/Race.java @@ -1,7 +1,6 @@ package racingcar.domain.model; import java.util.List; -import java.util.stream.Collectors; public class Race { @@ -11,18 +10,18 @@ public Race(RacingCars racingCars) { this.racingCars = racingCars; } - public void startRace() { - for (RacingCar racingCar : racingCars.getRacingCars()) { - racingCar.move(); + public RacingCars startRace(int tryingNumber) { + for (int i = 0; i < tryingNumber; i++) { + racingCars.getRacingCars().forEach(RacingCar::move); } + return racingCars; + //결과 출력할 때 필요. } public List compare() { return racingCars.getRacingCars().stream().filter(car -> car.getPosition() == getWinningPosition()).toList(); } - - private int getWinningPosition() { return racingCars.getRacingCars() .stream() @@ -30,6 +29,4 @@ private int getWinningPosition() { .max() .orElseThrow(() -> new IllegalArgumentException("차량이 없습니다.")); } - - } From 8b6443fd2026856485b82ab025ac1b8dfb00d659 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 03:59:56 +0900 Subject: [PATCH 06/32] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29..009e114 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,20 @@ +- [X] RacingCar 클래스 + - [X] name 길이 검증 메서드 + - [X] name 존재 검증 메서드 + - [ ] name 공백 검증 메서드 + - [X] position move 메서드 +- [X] RacingCar을 리스트로 한 RacingCars 클래스 + - [X] 이름 중복 검증 메서드 + - [X] 이름 목록 Empty 검증 메서드 + - [X] 레이스 참가 레이싱카 생성 팩토리 메서드 //이펙티브 자바 +- [X] 게임을 담당할 Race 클래스 생성 + - [X] 게임 시작 메서드 + - [X] position 비교 메서드 +- [ ] 컨트롤러(컨트롤러 인터페이스화) + - [ ] InitialController 생성 + - [ ] RaceController 생성 + - [ ] ResultController 생성 + - [ ] Config로 상황에 맞는 Contoller 호출되게 설계 +- [ ] view(인터페이스로 나누기 outView 재사용 위해) + - [ ] 출력 되는 것들은 전부 outView 로 + - [ ] 입력받는 것들은 전부 inputView 로 \ No newline at end of file From 79dd22db466464d4f29b1e705a13a0f38795792b Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 04:33:22 +0900 Subject: [PATCH 07/32] =?UTF-8?q?docs:=20=EC=A0=9C=EB=AA=A9=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 --- docs/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/README.md b/docs/README.md index 009e114..16a7d0b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,5 @@ +## 도메인 +### 모델 - [X] RacingCar 클래스 - [X] name 길이 검증 메서드 - [X] name 존재 검증 메서드 @@ -10,11 +12,15 @@ - [X] 게임을 담당할 Race 클래스 생성 - [X] 게임 시작 메서드 - [X] position 비교 메서드 + +## 컨트롤러 - [ ] 컨트롤러(컨트롤러 인터페이스화) - [ ] InitialController 생성 - [ ] RaceController 생성 - [ ] ResultController 생성 - [ ] Config로 상황에 맞는 Contoller 호출되게 설계 + +## View - [ ] view(인터페이스로 나누기 outView 재사용 위해) - [ ] 출력 되는 것들은 전부 outView 로 - [ ] 입력받는 것들은 전부 inputView 로 \ No newline at end of file From 6dcc583c9f3197e6bafe9d267f2211993b23c8d5 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 05:03:52 +0900 Subject: [PATCH 08/32] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=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 --- docs/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/README.md b/docs/README.md index 16a7d0b..88b8a25 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,6 +12,10 @@ - [X] 게임을 담당할 Race 클래스 생성 - [X] 게임 시작 메서드 - [X] position 비교 메서드 +- [ ] 각 라운드 위해 Round 클래스 생성 +- [ ] 레이스 승리 결과 WinningResult 클래스 생성 + - [ ] position 비교 메서드 - Race에서 가져오기 + ## 컨트롤러 - [ ] 컨트롤러(컨트롤러 인터페이스화) From 72bdccbc0e5eabb91c4ffb17fbed33f8dcf62be2 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 16:08:26 +0900 Subject: [PATCH 09/32] =?UTF-8?q?feat:=20Round=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 라운드에 경기 paly 책임 부여 TDA원칙 준수 2. 정적 팩토리 메서드 3. getRoundResult 필요한지 고민.. --- .../java/racingcar/domain/model/Race.java | 8 ++++--- .../racingcar/domain/model/RacingCars.java | 7 +++++- .../java/racingcar/domain/model/Round.java | 23 +++++++++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/main/java/racingcar/domain/model/Round.java diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java index c1062de..bb4bc1c 100644 --- a/src/main/java/racingcar/domain/model/Race.java +++ b/src/main/java/racingcar/domain/model/Race.java @@ -5,17 +5,19 @@ public class Race { private final RacingCars racingCars; + private final Round round; - public Race(RacingCars racingCars) { + public Race(RacingCars racingCars, Round round) { this.racingCars = racingCars; + this.round = round; } public RacingCars startRace(int tryingNumber) { for (int i = 0; i < tryingNumber; i++) { - racingCars.getRacingCars().forEach(RacingCar::move); + Round.createRound(racingCars).play(); } return racingCars; - //결과 출력할 때 필요. + //최종 결과 출력할 때 필요. } public List compare() { diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index 8e17b83..4dd5b40 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -1,5 +1,6 @@ package racingcar.domain.model; +import java.util.Collections; import java.util.List; public class RacingCars { @@ -17,7 +18,11 @@ public static RacingCars create(List userInput) { } public List getRacingCars() { - return racingCars; + return Collections.unmodifiableList(racingCars); + } + + public void moveAll() { + racingCars.forEach(RacingCar::move); } private void validateDuplicateName() { diff --git a/src/main/java/racingcar/domain/model/Round.java b/src/main/java/racingcar/domain/model/Round.java new file mode 100644 index 0000000..53ad02c --- /dev/null +++ b/src/main/java/racingcar/domain/model/Round.java @@ -0,0 +1,23 @@ +package racingcar.domain.model; + +public class Round { + private final RacingCars racingCars; + + private Round(RacingCars racingCars) { + this.racingCars = racingCars; + } + + public static Round createRound(RacingCars racingCars) { + return new Round(racingCars); + } + + public void play() { + racingCars.moveAll(); + } + + public RacingCars getRoundResult() { + return racingCars; + } + + +} From d57b776ad210f18b6f066cab95a66e2c53c067a2 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 16:10:54 +0900 Subject: [PATCH 10/32] =?UTF-8?q?feat:=20WinningRace=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 결과 비교 책임 부여 2. stream Api filter 사용. --- .../java/racingcar/domain/model/Race.java | 10 -------- .../racingcar/domain/model/WinningRace.java | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 src/main/java/racingcar/domain/model/WinningRace.java diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java index bb4bc1c..d424b47 100644 --- a/src/main/java/racingcar/domain/model/Race.java +++ b/src/main/java/racingcar/domain/model/Race.java @@ -20,15 +20,5 @@ public RacingCars startRace(int tryingNumber) { //최종 결과 출력할 때 필요. } - public List compare() { - return racingCars.getRacingCars().stream().filter(car -> car.getPosition() == getWinningPosition()).toList(); - } - private int getWinningPosition() { - return racingCars.getRacingCars() - .stream() - .mapToInt(RacingCar::getPosition) - .max() - .orElseThrow(() -> new IllegalArgumentException("차량이 없습니다.")); - } } diff --git a/src/main/java/racingcar/domain/model/WinningRace.java b/src/main/java/racingcar/domain/model/WinningRace.java new file mode 100644 index 0000000..ad66065 --- /dev/null +++ b/src/main/java/racingcar/domain/model/WinningRace.java @@ -0,0 +1,24 @@ +package racingcar.domain.model; + +import java.util.List; + +public class WinningRace { + private final RacingCars racingCars; + + public WinningRace(RacingCars racingCars) { + this.racingCars = racingCars; + } + + public List compare() { + return racingCars.getRacingCars().stream().filter(car -> car.getPosition() == getWinningPosition()).toList(); + } + + private int getWinningPosition() { + return racingCars.getRacingCars() + .stream() + .mapToInt(RacingCar::getPosition) + .max() + .orElseThrow(() -> new IllegalArgumentException("차량이 없습니다.")); + } + +} From 05489beaa0af9c88952b48568d7416c855a43a25 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 16:20:18 +0900 Subject: [PATCH 11/32] =?UTF-8?q?feat:=20WinningRace=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 우승자들만 모은 리스트 이기 때문에 새로운 RacingCars 객체 생성 --- src/main/java/racingcar/domain/model/WinningRace.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/domain/model/WinningRace.java b/src/main/java/racingcar/domain/model/WinningRace.java index ad66065..bd3897c 100644 --- a/src/main/java/racingcar/domain/model/WinningRace.java +++ b/src/main/java/racingcar/domain/model/WinningRace.java @@ -1,6 +1,7 @@ package racingcar.domain.model; import java.util.List; +import java.util.stream.Collectors; public class WinningRace { private final RacingCars racingCars; @@ -9,8 +10,11 @@ public WinningRace(RacingCars racingCars) { this.racingCars = racingCars; } - public List compare() { - return racingCars.getRacingCars().stream().filter(car -> car.getPosition() == getWinningPosition()).toList(); + public RacingCars compare() { + return RacingCars.create(racingCars.getRacingCars() + .stream() + .filter(car -> car.getPosition() == getWinningPosition()) + .toList()); } private int getWinningPosition() { From b60b7f786989d7544e591016a2c560b0b2587be5 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 16:21:39 +0900 Subject: [PATCH 12/32] =?UTF-8?q?docs:=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 88b8a25..df38ebd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,9 +12,9 @@ - [X] 게임을 담당할 Race 클래스 생성 - [X] 게임 시작 메서드 - [X] position 비교 메서드 -- [ ] 각 라운드 위해 Round 클래스 생성 -- [ ] 레이스 승리 결과 WinningResult 클래스 생성 - - [ ] position 비교 메서드 - Race에서 가져오기 +- [X] 각 라운드 위해 Round 클래스 생성 +- [X] 레이스 승리 결과 WinningResult 클래스 생성 + - [X] position 비교 메서드 - Race에서 가져오기 ## 컨트롤러 From bc8e2f38ab0ef26d956ad894523eba7b41a8dd63 Mon Sep 17 00:00:00 2001 From: baaamk Date: Sun, 6 Apr 2025 16:22:29 +0900 Subject: [PATCH 13/32] =?UTF-8?q?feat:=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Round 에 결과 위임했기 때문에 return 수정 --- src/main/java/racingcar/domain/model/Race.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java index d424b47..ab67ab0 100644 --- a/src/main/java/racingcar/domain/model/Race.java +++ b/src/main/java/racingcar/domain/model/Race.java @@ -12,12 +12,10 @@ public Race(RacingCars racingCars, Round round) { this.round = round; } - public RacingCars startRace(int tryingNumber) { + public void startRace(int tryingNumber) { for (int i = 0; i < tryingNumber; i++) { Round.createRound(racingCars).play(); } - return racingCars; - //최종 결과 출력할 때 필요. } From f64b6ed9debcfc0a8255054e9add1dda7873a3e0 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:48:42 +0900 Subject: [PATCH 14/32] =?UTF-8?q?feat:=20=EC=83=81=EC=88=98=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 에러 메세지 2. 매직 넘버 --- src/main/java/racingcar/global/Constant.java | 9 +++++++++ src/main/java/racingcar/global/ErrorMessage.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/racingcar/global/Constant.java create mode 100644 src/main/java/racingcar/global/ErrorMessage.java diff --git a/src/main/java/racingcar/global/Constant.java b/src/main/java/racingcar/global/Constant.java new file mode 100644 index 0000000..8c1d069 --- /dev/null +++ b/src/main/java/racingcar/global/Constant.java @@ -0,0 +1,9 @@ +package racingcar.global; + +public class Constant { + public static int MIN = 0; + public static int MAX = 9; + public static int MOVE_NUMBER = 4; + public static int START_POSITION = 0; + +} diff --git a/src/main/java/racingcar/global/ErrorMessage.java b/src/main/java/racingcar/global/ErrorMessage.java new file mode 100644 index 0000000..1636484 --- /dev/null +++ b/src/main/java/racingcar/global/ErrorMessage.java @@ -0,0 +1,14 @@ +package racingcar.global; + +public class ErrorMessage { + public static final String EMPTY_INPUT = "빈 값이 들어오면 안됩니다."; + public static final String INVALID_NUMBER_FORMAT = "정수만 입력 가능합니다."; + + public static final String NAME_TOO_LONG = "이름은 5자 이하여야 합니다."; + public static final String NAME_MISSING = "이름이 존재하지 않습니다."; + public static final String DUPLICATE_NAME = "중복된 이름이 존재합니다."; + public static final String EMPTY_NAME_LIST = "이름 목록이 비어있습니다."; + + public static final String NO_CARS_TO_RACE = "경주할 자동차가 없습니다."; + public static final String INVALID_TRY_NUMBER = "시도 숫자는 0보다 커야합니다."; +} From 41720efedc94308f6b457c6bde58cf7c42dfb8b2 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:49:25 +0900 Subject: [PATCH 15/32] =?UTF-8?q?feat:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/AppConfig.java | 22 ++++++ src/main/java/racingcar/Application.java | 8 +- .../java/racingcar/controller/Controller.java | 5 ++ .../racingcar/controller/RaceController.java | 75 +++++++++++++++++++ .../controller/RaceControllerTest.java | 26 +++++++ 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/AppConfig.java create mode 100644 src/main/java/racingcar/controller/Controller.java create mode 100644 src/main/java/racingcar/controller/RaceController.java create mode 100644 src/test/java/racingcar/controller/RaceControllerTest.java diff --git a/src/main/java/racingcar/AppConfig.java b/src/main/java/racingcar/AppConfig.java new file mode 100644 index 0000000..682fd20 --- /dev/null +++ b/src/main/java/racingcar/AppConfig.java @@ -0,0 +1,22 @@ +package racingcar; + +import racingcar.controller.Controller; +import racingcar.controller.RaceController; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +public class AppConfig { + + public Controller controller() { + return new RaceController(inputView(),outputView()); + } + + private InputView inputView() { + return new InputView(); + } + private OutputView outputView() { + return new OutputView(); + } + + +} diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..b88d408 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,13 @@ package racingcar; +import racingcar.controller.Controller; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + AppConfig appConfig = new AppConfig(); + + Controller controller = appConfig.controller(); + + controller.execute(); } } diff --git a/src/main/java/racingcar/controller/Controller.java b/src/main/java/racingcar/controller/Controller.java new file mode 100644 index 0000000..54a3960 --- /dev/null +++ b/src/main/java/racingcar/controller/Controller.java @@ -0,0 +1,5 @@ +package racingcar.controller; + +public interface Controller { + void execute(); +} diff --git a/src/main/java/racingcar/controller/RaceController.java b/src/main/java/racingcar/controller/RaceController.java new file mode 100644 index 0000000..d98f24b --- /dev/null +++ b/src/main/java/racingcar/controller/RaceController.java @@ -0,0 +1,75 @@ +package racingcar.controller; + +import racingcar.domain.model.*; +import racingcar.domain.model.dto.FinalWinnerDTO; +import racingcar.domain.model.dto.RoundResultDTO; +import racingcar.global.ErrorMessage; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class RaceController implements Controller { + + private final InputView inputView; + private final OutputView outputView; + + public RaceController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + @Override + public void execute() { + RacingCars racingCars = inputName(); + Race race = raceProcess(racingCars); + printResult(race); + } + + private void printResult(Race race) { + String finalResult = FinalWinnerDTO.from(race).getWinnersAsString(); + outputView.printWinningResult(finalResult); + } + + private Race raceProcess(RacingCars racingCars) { + outputView.printTryNumberNotice(); + TryNumber tryNumber = validateInputTryNumber(inputView.inputTryNumber()); + Race race = null; + for (int i = 1; i <= tryNumber.getTryNumber(); i++) { + race = Race.create(racingCars, tryNumber); + outputView.printRoundResult(RoundResultDTO.from(race.startRace(),race)); + } + return race; + } + + private RacingCars inputName() { + outputView.printInitialName(); + RacingCars racingCars = RacingCars.create(createRacingCars()); + return racingCars; + } + + + private List createRacingCars() { + return Arrays.stream(inputView.inputName().split(",")) + .map(String::trim) + .map(RacingCar::create) + .collect(Collectors.toList()); + } + + + private TryNumber validateInputTryNumber(String tryNumber) { + try { + if (tryNumber.trim().isEmpty()) { + throw new IllegalArgumentException(ErrorMessage.EMPTY_INPUT); + } + return TryNumber.from(Integer.parseInt(tryNumber)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ErrorMessage.INVALID_NUMBER_FORMAT); + } + + } +} \ No newline at end of file diff --git a/src/test/java/racingcar/controller/RaceControllerTest.java b/src/test/java/racingcar/controller/RaceControllerTest.java new file mode 100644 index 0000000..039a940 --- /dev/null +++ b/src/test/java/racingcar/controller/RaceControllerTest.java @@ -0,0 +1,26 @@ +package racingcar.controller; + +import org.junit.jupiter.api.Test; +import racingcar.domain.model.Race; + +import racingcar.view.InputView; +import racingcar.view.OutputView; + + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class RaceControllerTest { +// void 문자가_입력되면_예외가_발생한다() { +// // given +// Race mockRace = mock(Race.class); +// InputView mockInputView = mock(InputView.class); +// OutputView mockOutputView = mock(OutputView.class); +// when(mockInputView.inputTryNumber()).thenReturn("1"); +// RaceController controller = new RaceController(); +// +// assertThrows(IllegalArgumentException.class, controller::execute); +// } +} \ No newline at end of file From 94149ed2156eb12df1208b07c3e99e795a0a9267 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:49:57 +0900 Subject: [PATCH 16/32] =?UTF-8?q?del:=20=EC=82=AC=EC=9A=A9=20=EC=95=88?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/InitialController.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/main/java/racingcar/domain/InitialController.java diff --git a/src/main/java/racingcar/domain/InitialController.java b/src/main/java/racingcar/domain/InitialController.java deleted file mode 100644 index c539fc8..0000000 --- a/src/main/java/racingcar/domain/InitialController.java +++ /dev/null @@ -1,5 +0,0 @@ -package racingcar.domain; - -public class InitialController { - -} From dabf12d6c895575b74808231e88aa6faf84c0a17 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:50:06 +0900 Subject: [PATCH 17/32] =?UTF-8?q?del:=20=EC=82=AC=EC=9A=A9=20=EC=95=88?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/domain/model/Round.java | 23 --------------- .../racingcar/domain/model/WinningRace.java | 28 ------------------- 2 files changed, 51 deletions(-) delete mode 100644 src/main/java/racingcar/domain/model/Round.java delete mode 100644 src/main/java/racingcar/domain/model/WinningRace.java diff --git a/src/main/java/racingcar/domain/model/Round.java b/src/main/java/racingcar/domain/model/Round.java deleted file mode 100644 index 53ad02c..0000000 --- a/src/main/java/racingcar/domain/model/Round.java +++ /dev/null @@ -1,23 +0,0 @@ -package racingcar.domain.model; - -public class Round { - private final RacingCars racingCars; - - private Round(RacingCars racingCars) { - this.racingCars = racingCars; - } - - public static Round createRound(RacingCars racingCars) { - return new Round(racingCars); - } - - public void play() { - racingCars.moveAll(); - } - - public RacingCars getRoundResult() { - return racingCars; - } - - -} diff --git a/src/main/java/racingcar/domain/model/WinningRace.java b/src/main/java/racingcar/domain/model/WinningRace.java deleted file mode 100644 index bd3897c..0000000 --- a/src/main/java/racingcar/domain/model/WinningRace.java +++ /dev/null @@ -1,28 +0,0 @@ -package racingcar.domain.model; - -import java.util.List; -import java.util.stream.Collectors; - -public class WinningRace { - private final RacingCars racingCars; - - public WinningRace(RacingCars racingCars) { - this.racingCars = racingCars; - } - - public RacingCars compare() { - return RacingCars.create(racingCars.getRacingCars() - .stream() - .filter(car -> car.getPosition() == getWinningPosition()) - .toList()); - } - - private int getWinningPosition() { - return racingCars.getRacingCars() - .stream() - .mapToInt(RacingCar::getPosition) - .max() - .orElseThrow(() -> new IllegalArgumentException("차량이 없습니다.")); - } - -} From 3470ab6a625823a526865ffee46d014006441b68 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:50:19 +0900 Subject: [PATCH 18/32] =?UTF-8?q?feat:=20DTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/dto/FinalWinnerDTO.java | 25 ++++++++++++++++++ .../domain/model/dto/RoundResultDTO.java | 26 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java create mode 100644 src/main/java/racingcar/domain/model/dto/RoundResultDTO.java diff --git a/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java b/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java new file mode 100644 index 0000000..4210d91 --- /dev/null +++ b/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java @@ -0,0 +1,25 @@ +package racingcar.domain.model.dto; + +import racingcar.domain.model.Race; +import racingcar.domain.model.RacingCar; +import racingcar.domain.model.RacingCars; + +import java.util.stream.Collectors; + +public class FinalWinnerDTO { + private final Race race; + + public FinalWinnerDTO(Race race) { + this.race = race; + } + + public static FinalWinnerDTO from(Race race) { + return new FinalWinnerDTO(race); + } + + public String getWinnersAsString() { + return String.join(", ", race.getWinners()); + } + + +} diff --git a/src/main/java/racingcar/domain/model/dto/RoundResultDTO.java b/src/main/java/racingcar/domain/model/dto/RoundResultDTO.java new file mode 100644 index 0000000..6705606 --- /dev/null +++ b/src/main/java/racingcar/domain/model/dto/RoundResultDTO.java @@ -0,0 +1,26 @@ +package racingcar.domain.model.dto; + +import racingcar.domain.model.Race; +import racingcar.domain.model.RacingCars; + +import java.util.Map; + +public class RoundResultDTO { + private final RacingCars racingCars; + private final Race race; + + private RoundResultDTO(RacingCars racingCars, Race race) { + this.racingCars = racingCars; + this.race = race; + } + + + public static RoundResultDTO from(RacingCars racingCars, Race race) { + return new RoundResultDTO(racingCars, race); + } + + + public Map getRacingCars() { + return race.findResult(); + } +} From ec9dcbc44192362264b5ccae5c8ac15643726112 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:50:42 +0900 Subject: [PATCH 19/32] =?UTF-8?q?feat:=20View=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. DTO 사용하도록 유도 --- src/main/java/racingcar/view/InputView.java | 14 +++++++++ src/main/java/racingcar/view/OutputView.java | 30 ++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/racingcar/view/InputView.java create mode 100644 src/main/java/racingcar/view/OutputView.java diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000..499e4aa --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,14 @@ +package racingcar.view; + +import static camp.nextstep.edu.missionutils.Console.readLine; + +public class InputView { + public String inputName() { + return readLine(); + } + + public String inputTryNumber() { + return readLine(); + } + +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 0000000..e1719f7 --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,30 @@ +package racingcar.view; + +import racingcar.domain.model.dto.RoundResultDTO; + +import java.util.Map; + +public class OutputView { + + public void printInitialName() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + } + + + public void printRoundResult(RoundResultDTO roundResultDTO) { + roundResultDTO.getRacingCars().forEach((name, position) -> + System.out.println(name + " : " + "-".repeat(position)) + ); + System.out.println(); + } + + + public void printTryNumberNotice() { + System.out.println("시도할 회수는 몇회인가요?"); + } + + public void printWinningResult(String result) { + System.out.println("최종 우승자 : " + result); + } + +} From b37b905d83a7e33ad6dcfbfeaa4ca6d53ab41e5b Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:51:52 +0900 Subject: [PATCH 20/32] =?UTF-8?q?refactor:=20RacingCars=20=EC=97=90=20?= =?UTF-8?q?=EC=9E=88=EB=8D=98=20=EC=B1=85=EC=9E=84=20Race=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=B4=EB=83=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/racingcar/domain/model/Race.java | 43 ++++++++++++++++--- .../racingcar/domain/model/RacingCar.java | 20 ++++++--- .../racingcar/domain/model/RacingCars.java | 24 ++++++----- .../java/racingcar/domain/RacingCarTest.java | 3 -- 4 files changed, 63 insertions(+), 27 deletions(-) diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java index ab67ab0..3676b1b 100644 --- a/src/main/java/racingcar/domain/model/Race.java +++ b/src/main/java/racingcar/domain/model/Race.java @@ -1,22 +1,51 @@ package racingcar.domain.model; +import racingcar.global.ErrorMessage; + +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class Race { private final RacingCars racingCars; - private final Round round; + private final TryNumber tryNumber; - public Race(RacingCars racingCars, Round round) { + private Race(RacingCars racingCars, TryNumber tryNumber) { this.racingCars = racingCars; - this.round = round; + this.tryNumber = tryNumber; + } + + public static Race create(RacingCars racingCars, TryNumber tryNumber) { + return new Race(racingCars, tryNumber); + } + + public RacingCars startRace() { + return RacingCars.create(racingCars.moveAll()); } - public void startRace(int tryingNumber) { - for (int i = 0; i < tryingNumber; i++) { - Round.createRound(racingCars).play(); - } + public Map findResult() { + return racingCars.getRacingCars().stream() + .collect(Collectors.toMap( + RacingCar::getName, + RacingCar::getPosition + )); } + public List getWinners() { + int winningPosition = findWinningPosition(); + return racingCars.getRacingCars().stream() + .filter(car -> car.getPosition() == winningPosition) + .map(RacingCar::getName) + .toList(); + } + private int findWinningPosition() { + return racingCars.getRacingCars().stream() + .mapToInt(RacingCar::getPosition) + .max() + .orElseThrow(() -> new IllegalStateException(ErrorMessage.NO_CARS_TO_RACE)); + } } + diff --git a/src/main/java/racingcar/domain/model/RacingCar.java b/src/main/java/racingcar/domain/model/RacingCar.java index 840e034..4eccd9b 100644 --- a/src/main/java/racingcar/domain/model/RacingCar.java +++ b/src/main/java/racingcar/domain/model/RacingCar.java @@ -1,32 +1,38 @@ package racingcar.domain.model; +import racingcar.global.Constant; +import racingcar.global.ErrorMessage; + import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; public class RacingCar { private final String name; - private int position; + private int position = Constant.START_POSITION; - public RacingCar(String name) { + private RacingCar(String name) { + this.name = name; validateNameLength(); validateNameEmpty(); - this.name = name; - this.position = 0; + } + + public static RacingCar create(String name) { + return new RacingCar(name); } private void validateNameLength() { if (name.length() > 5) { - throw new IllegalArgumentException("이름은 5자 이하여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NAME_TOO_LONG); } } private void validateNameEmpty() { if (name == null) { - throw new IllegalArgumentException("이름이 존재하지 않습니다."); + throw new IllegalArgumentException(ErrorMessage.NAME_MISSING); } } public void move() { - if (pickNumberInRange(0, 9) >= 4) { + if (pickNumberInRange(Constant.MIN, Constant.MAX) >= Constant.MOVE_NUMBER) { position++; } } diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index 4dd5b40..722b1b2 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -1,13 +1,16 @@ package racingcar.domain.model; -import java.util.Collections; +import racingcar.global.ErrorMessage; + import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class RacingCars { private final List racingCars; - private RacingCars(List carNames) { - this.racingCars = carNames; + private RacingCars(List racingCars) { + this.racingCars = racingCars; validateNameListEmpty(); validateDuplicateName(); @@ -17,25 +20,26 @@ public static RacingCars create(List userInput) { return new RacingCars(userInput); } - public List getRacingCars() { - return Collections.unmodifiableList(racingCars); - } - - public void moveAll() { + public List moveAll() { racingCars.forEach(RacingCar::move); + return racingCars; } + private void validateDuplicateName() { if (racingCars.size() != racingCars.stream().distinct().count()) { - throw new IllegalArgumentException("중복된 이름이 존재합니다."); + throw new IllegalArgumentException(ErrorMessage.DUPLICATE_NAME); } } private void validateNameListEmpty() { if (racingCars.isEmpty()) { - throw new IllegalArgumentException("이름 목록이 비어있습니다."); + throw new IllegalArgumentException(ErrorMessage.EMPTY_NAME_LIST); } } + public List getRacingCars() { + return racingCars; + } } diff --git a/src/test/java/racingcar/domain/RacingCarTest.java b/src/test/java/racingcar/domain/RacingCarTest.java index ca7e175..af3ccee 100644 --- a/src/test/java/racingcar/domain/RacingCarTest.java +++ b/src/test/java/racingcar/domain/RacingCarTest.java @@ -5,12 +5,9 @@ import racingcar.domain.model.RacingCar; class RacingCarTest { - RacingCar ddd = new RacingCar("ddd"); @Test void validateName() { - String name = ddd.getName(); - Assertions.assertThat(name).isEqualTo("ddd"); } @Test From 529e24219bf0ac0a521f6c00c88ef6ce01cd8639 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:52:22 +0900 Subject: [PATCH 21/32] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=B1=85=EC=9E=84=20=EC=9C=84=ED=95=B4=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/domain/model/TryNumber.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/racingcar/domain/model/TryNumber.java diff --git a/src/main/java/racingcar/domain/model/TryNumber.java b/src/main/java/racingcar/domain/model/TryNumber.java new file mode 100644 index 0000000..2bcb6b0 --- /dev/null +++ b/src/main/java/racingcar/domain/model/TryNumber.java @@ -0,0 +1,27 @@ +package racingcar.domain.model; + +import racingcar.global.ErrorMessage; + +public class TryNumber { + + private final int tryNumber; + + private TryNumber(int tryNumber) { + validateTryNumber(tryNumber); + this.tryNumber = tryNumber; + } + + public static TryNumber from(int tryNumber) { + return new TryNumber(tryNumber); + } + + private void validateTryNumber(int tryNumber) { + if (tryNumber <= 0) { + throw new IllegalArgumentException(ErrorMessage.INVALID_TRY_NUMBER); + } + } + + public int getTryNumber() { + return tryNumber; + } +} From f881f8f5f8a8f770e3cd403f76ba47e040d1af8b Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:52:36 +0900 Subject: [PATCH 22/32] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=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 --- docs/README.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index df38ebd..511a891 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ - [X] RacingCar 클래스 - [X] name 길이 검증 메서드 - [X] name 존재 검증 메서드 - - [ ] name 공백 검증 메서드 + - [X] name 공백 검증 메서드 - [X] position move 메서드 - [X] RacingCar을 리스트로 한 RacingCars 클래스 - [X] 이름 중복 검증 메서드 @@ -12,19 +12,14 @@ - [X] 게임을 담당할 Race 클래스 생성 - [X] 게임 시작 메서드 - [X] position 비교 메서드 -- [X] 각 라운드 위해 Round 클래스 생성 -- [X] 레이스 승리 결과 WinningResult 클래스 생성 - - [X] position 비교 메서드 - Race에서 가져오기 + - [X] 이곳에서 경기 결과 나오는게 맞다 판단하여 findResult, getWinner 메서드 생성 +- [X] 게임 시도 숫자 검증할 TryNumber 클래스 ## 컨트롤러 -- [ ] 컨트롤러(컨트롤러 인터페이스화) - - [ ] InitialController 생성 - - [ ] RaceController 생성 - - [ ] ResultController 생성 - - [ ] Config로 상황에 맞는 Contoller 호출되게 설계 - +- [X] 컨트롤러(컨트롤러 인터페이스화) +- ## View -- [ ] view(인터페이스로 나누기 outView 재사용 위해) - - [ ] 출력 되는 것들은 전부 outView 로 - - [ ] 입력받는 것들은 전부 inputView 로 \ No newline at end of file +- [X] view(인터페이스로 나누기 outView 재사용 위해) + - [X] 출력 되는 것들은 전부 outView 로 + - [X] 입력받는 것들은 전부 inputView 로 \ No newline at end of file From 209935b633a253628c152559e57709b72de8def8 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:53:52 +0900 Subject: [PATCH 23/32] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/domain/model/TryNumber.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/domain/model/TryNumber.java b/src/main/java/racingcar/domain/model/TryNumber.java index 2bcb6b0..5f7bbe6 100644 --- a/src/main/java/racingcar/domain/model/TryNumber.java +++ b/src/main/java/racingcar/domain/model/TryNumber.java @@ -1,5 +1,6 @@ package racingcar.domain.model; +import racingcar.global.Constant; import racingcar.global.ErrorMessage; public class TryNumber { @@ -16,7 +17,7 @@ public static TryNumber from(int tryNumber) { } private void validateTryNumber(int tryNumber) { - if (tryNumber <= 0) { + if (tryNumber <= Constant.MIN) { throw new IllegalArgumentException(ErrorMessage.INVALID_TRY_NUMBER); } } From 53b9be5c9a87cee96965c583749ca156cb8b3dc2 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:54:17 +0900 Subject: [PATCH 24/32] =?UTF-8?q?refactor:=20import=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/controller/RaceController.java | 2 -- src/main/java/racingcar/domain/model/Race.java | 1 - src/main/java/racingcar/domain/model/RacingCars.java | 2 -- src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java | 3 --- 4 files changed, 8 deletions(-) diff --git a/src/main/java/racingcar/controller/RaceController.java b/src/main/java/racingcar/controller/RaceController.java index d98f24b..cfb5ee8 100644 --- a/src/main/java/racingcar/controller/RaceController.java +++ b/src/main/java/racingcar/controller/RaceController.java @@ -8,9 +8,7 @@ import racingcar.view.OutputView; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; public class RaceController implements Controller { diff --git a/src/main/java/racingcar/domain/model/Race.java b/src/main/java/racingcar/domain/model/Race.java index 3676b1b..3b6e7e0 100644 --- a/src/main/java/racingcar/domain/model/Race.java +++ b/src/main/java/racingcar/domain/model/Race.java @@ -2,7 +2,6 @@ import racingcar.global.ErrorMessage; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index 722b1b2..68a0887 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -3,8 +3,6 @@ import racingcar.global.ErrorMessage; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; public class RacingCars { private final List racingCars; diff --git a/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java b/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java index 4210d91..a2f3035 100644 --- a/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java +++ b/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java @@ -1,10 +1,7 @@ package racingcar.domain.model.dto; import racingcar.domain.model.Race; -import racingcar.domain.model.RacingCar; -import racingcar.domain.model.RacingCars; -import java.util.stream.Collectors; public class FinalWinnerDTO { private final Race race; From 389d8fa78f5f02ee1d1229c77f6dcd19c9ba0aa4 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:54:59 +0900 Subject: [PATCH 25/32] =?UTF-8?q?refactor:=20inline=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/controller/RaceController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/racingcar/controller/RaceController.java b/src/main/java/racingcar/controller/RaceController.java index cfb5ee8..bd1e022 100644 --- a/src/main/java/racingcar/controller/RaceController.java +++ b/src/main/java/racingcar/controller/RaceController.java @@ -46,8 +46,7 @@ private Race raceProcess(RacingCars racingCars) { private RacingCars inputName() { outputView.printInitialName(); - RacingCars racingCars = RacingCars.create(createRacingCars()); - return racingCars; + return RacingCars.create(createRacingCars()); } From e52178d2e3b397d1000d3580c3351c876da52454 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:55:55 +0900 Subject: [PATCH 26/32] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=EB=84=98?= =?UTF-8?q?=EB=B2=84=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/racingcar/controller/RaceController.java | 3 ++- src/main/java/racingcar/global/Constant.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/controller/RaceController.java b/src/main/java/racingcar/controller/RaceController.java index bd1e022..f6743c8 100644 --- a/src/main/java/racingcar/controller/RaceController.java +++ b/src/main/java/racingcar/controller/RaceController.java @@ -3,6 +3,7 @@ import racingcar.domain.model.*; import racingcar.domain.model.dto.FinalWinnerDTO; import racingcar.domain.model.dto.RoundResultDTO; +import racingcar.global.Constant; import racingcar.global.ErrorMessage; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -37,7 +38,7 @@ private Race raceProcess(RacingCars racingCars) { outputView.printTryNumberNotice(); TryNumber tryNumber = validateInputTryNumber(inputView.inputTryNumber()); Race race = null; - for (int i = 1; i <= tryNumber.getTryNumber(); i++) { + for (int i = Constant.START_ROUND; i <= tryNumber.getTryNumber(); i++) { race = Race.create(racingCars, tryNumber); outputView.printRoundResult(RoundResultDTO.from(race.startRace(),race)); } diff --git a/src/main/java/racingcar/global/Constant.java b/src/main/java/racingcar/global/Constant.java index 8c1d069..030bddd 100644 --- a/src/main/java/racingcar/global/Constant.java +++ b/src/main/java/racingcar/global/Constant.java @@ -1,6 +1,7 @@ package racingcar.global; public class Constant { + public static final int START_ROUND = 1; public static int MIN = 0; public static int MAX = 9; public static int MOVE_NUMBER = 4; From d0c80b01277653d6ad045411ec06ad37387da548 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 02:56:27 +0900 Subject: [PATCH 27/32] =?UTF-8?q?refactor:=20import=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/racingcar/view/OutputView.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index e1719f7..1b4608f 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -2,8 +2,6 @@ import racingcar.domain.model.dto.RoundResultDTO; -import java.util.Map; - public class OutputView { public void printInitialName() { From 89b9cab919b1e2d01bf5ef3ed1a876749b33ab28 Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 03:01:39 +0900 Subject: [PATCH 28/32] =?UTF-8?q?refactor:=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=AA=BB=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=9D=BD=EA=B8=B0=20=EC=A0=84=EC=9A=A9=EC=9C=BC=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/racingcar/domain/model/RacingCars.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index 68a0887..1a81c37 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -3,6 +3,7 @@ import racingcar.global.ErrorMessage; import java.util.List; +import java.util.stream.Collectors; public class RacingCars { private final List racingCars; @@ -38,6 +39,6 @@ private void validateNameListEmpty() { public List getRacingCars() { - return racingCars; + return racingCars.stream().collect(Collectors.toUnmodifiableList()); } } From f2a6a3b20ae4a007617884e9313c49506d50562c Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 03:03:16 +0900 Subject: [PATCH 29/32] =?UTF-8?q?refactor:=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=AA=BB=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=9D=BD=EA=B8=B0=20=EC=A0=84=EC=9A=A9=EC=9C=BC=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 리턴 리스트 변경 불가능하다하여 toUnmodifiableList() 에서 수정 --- src/main/java/racingcar/domain/model/RacingCars.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index 1a81c37..f21f06a 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -39,6 +39,6 @@ private void validateNameListEmpty() { public List getRacingCars() { - return racingCars.stream().collect(Collectors.toUnmodifiableList()); + return racingCars.stream().toList(); } } From f91d958f60a47fa443efb57b75b54c4fda8520ce Mon Sep 17 00:00:00 2001 From: baaamk Date: Wed, 9 Apr 2025 19:11:58 +0900 Subject: [PATCH 30/32] =?UTF-8?q?refactor:=20validate=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=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/racingcar/domain/model/RacingCar.java | 8 ++++---- src/main/java/racingcar/domain/model/RacingCars.java | 10 ++++------ .../racingcar/domain/model/dto/FinalWinnerDTO.java | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/racingcar/domain/model/RacingCar.java b/src/main/java/racingcar/domain/model/RacingCar.java index 4eccd9b..5f8c87e 100644 --- a/src/main/java/racingcar/domain/model/RacingCar.java +++ b/src/main/java/racingcar/domain/model/RacingCar.java @@ -10,22 +10,22 @@ public class RacingCar { private int position = Constant.START_POSITION; private RacingCar(String name) { + validateNameLength(name); + validateNameEmpty(name); this.name = name; - validateNameLength(); - validateNameEmpty(); } public static RacingCar create(String name) { return new RacingCar(name); } - private void validateNameLength() { + private void validateNameLength(String name) { if (name.length() > 5) { throw new IllegalArgumentException(ErrorMessage.NAME_TOO_LONG); } } - private void validateNameEmpty() { + private void validateNameEmpty(String name) { if (name == null) { throw new IllegalArgumentException(ErrorMessage.NAME_MISSING); } diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index f21f06a..a83d126 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -3,16 +3,14 @@ import racingcar.global.ErrorMessage; import java.util.List; -import java.util.stream.Collectors; public class RacingCars { private final List racingCars; private RacingCars(List racingCars) { + validateNameListEmpty(racingCars); + validateDuplicateName(racingCars); this.racingCars = racingCars; - validateNameListEmpty(); - validateDuplicateName(); - } public static RacingCars create(List userInput) { @@ -25,13 +23,13 @@ public List moveAll() { } - private void validateDuplicateName() { + private void validateDuplicateName(List racingCars) { if (racingCars.size() != racingCars.stream().distinct().count()) { throw new IllegalArgumentException(ErrorMessage.DUPLICATE_NAME); } } - private void validateNameListEmpty() { + private void validateNameListEmpty(List racingCars) { if (racingCars.isEmpty()) { throw new IllegalArgumentException(ErrorMessage.EMPTY_NAME_LIST); } diff --git a/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java b/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java index a2f3035..35b6961 100644 --- a/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java +++ b/src/main/java/racingcar/domain/model/dto/FinalWinnerDTO.java @@ -6,7 +6,7 @@ public class FinalWinnerDTO { private final Race race; - public FinalWinnerDTO(Race race) { + private FinalWinnerDTO(Race race) { this.race = race; } From 9317cc2ea0d6c2086f8d935a5d6e933e18e84c0f Mon Sep 17 00:00:00 2001 From: baaamk Date: Thu, 10 Apr 2025 01:05:37 +0900 Subject: [PATCH 31/32] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상수 클래스 삭제 후 상수는 클래스에서 관리하도록 변경 --- src/main/java/racingcar/controller/RaceController.java | 4 ++-- src/main/java/racingcar/domain/model/RacingCar.java | 10 +++++++--- src/main/java/racingcar/domain/model/TryNumber.java | 5 +++-- src/main/java/racingcar/global/Constant.java | 10 ---------- 4 files changed, 12 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/racingcar/global/Constant.java diff --git a/src/main/java/racingcar/controller/RaceController.java b/src/main/java/racingcar/controller/RaceController.java index f6743c8..d69e6b6 100644 --- a/src/main/java/racingcar/controller/RaceController.java +++ b/src/main/java/racingcar/controller/RaceController.java @@ -3,7 +3,6 @@ import racingcar.domain.model.*; import racingcar.domain.model.dto.FinalWinnerDTO; import racingcar.domain.model.dto.RoundResultDTO; -import racingcar.global.Constant; import racingcar.global.ErrorMessage; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -13,6 +12,7 @@ import java.util.stream.Collectors; public class RaceController implements Controller { + public static final int START_ROUND = 1; private final InputView inputView; private final OutputView outputView; @@ -38,7 +38,7 @@ private Race raceProcess(RacingCars racingCars) { outputView.printTryNumberNotice(); TryNumber tryNumber = validateInputTryNumber(inputView.inputTryNumber()); Race race = null; - for (int i = Constant.START_ROUND; i <= tryNumber.getTryNumber(); i++) { + for (int i = START_ROUND; i <= tryNumber.getTryNumber(); i++) { race = Race.create(racingCars, tryNumber); outputView.printRoundResult(RoundResultDTO.from(race.startRace(),race)); } diff --git a/src/main/java/racingcar/domain/model/RacingCar.java b/src/main/java/racingcar/domain/model/RacingCar.java index 5f8c87e..2735290 100644 --- a/src/main/java/racingcar/domain/model/RacingCar.java +++ b/src/main/java/racingcar/domain/model/RacingCar.java @@ -1,13 +1,17 @@ package racingcar.domain.model; -import racingcar.global.Constant; import racingcar.global.ErrorMessage; import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; public class RacingCar { + public static final int MIN = 0; + public static final int MAX = 9; + public static final int MOVE_NUMBER = 4; + public static int START_POSITION = 0; + private final String name; - private int position = Constant.START_POSITION; + private int position = START_POSITION; private RacingCar(String name) { validateNameLength(name); @@ -32,7 +36,7 @@ private void validateNameEmpty(String name) { } public void move() { - if (pickNumberInRange(Constant.MIN, Constant.MAX) >= Constant.MOVE_NUMBER) { + if (pickNumberInRange(MIN, MAX) >= MOVE_NUMBER) { position++; } } diff --git a/src/main/java/racingcar/domain/model/TryNumber.java b/src/main/java/racingcar/domain/model/TryNumber.java index 5f7bbe6..71b1a7f 100644 --- a/src/main/java/racingcar/domain/model/TryNumber.java +++ b/src/main/java/racingcar/domain/model/TryNumber.java @@ -1,9 +1,10 @@ package racingcar.domain.model; -import racingcar.global.Constant; import racingcar.global.ErrorMessage; public class TryNumber { + public static final int MIN = 0; + private final int tryNumber; @@ -17,7 +18,7 @@ public static TryNumber from(int tryNumber) { } private void validateTryNumber(int tryNumber) { - if (tryNumber <= Constant.MIN) { + if (tryNumber <= MIN) { throw new IllegalArgumentException(ErrorMessage.INVALID_TRY_NUMBER); } } diff --git a/src/main/java/racingcar/global/Constant.java b/src/main/java/racingcar/global/Constant.java deleted file mode 100644 index 030bddd..0000000 --- a/src/main/java/racingcar/global/Constant.java +++ /dev/null @@ -1,10 +0,0 @@ -package racingcar.global; - -public class Constant { - public static final int START_ROUND = 1; - public static int MIN = 0; - public static int MAX = 9; - public static int MOVE_NUMBER = 4; - public static int START_POSITION = 0; - -} From e0ed130cd87d14bf6c39ac6e56a694c8cd4cbee4 Mon Sep 17 00:00:00 2001 From: baaamk Date: Thu, 10 Apr 2025 01:14:24 +0900 Subject: [PATCH 32/32] =?UTF-8?q?refactor:=20=EB=B6=88=EB=B3=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 불변 리스트로 초기화 하게 변경. getRacingCars() 반환값도 이미 리스트가 불변이기 때문에 새로 리스트 생성하지 않고 그대로 리스트 반환 --- src/main/java/racingcar/domain/model/RacingCars.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/domain/model/RacingCars.java b/src/main/java/racingcar/domain/model/RacingCars.java index a83d126..79236ee 100644 --- a/src/main/java/racingcar/domain/model/RacingCars.java +++ b/src/main/java/racingcar/domain/model/RacingCars.java @@ -10,7 +10,7 @@ public class RacingCars { private RacingCars(List racingCars) { validateNameListEmpty(racingCars); validateDuplicateName(racingCars); - this.racingCars = racingCars; + this.racingCars = List.copyOf(racingCars); } public static RacingCars create(List userInput) { @@ -37,6 +37,6 @@ private void validateNameListEmpty(List racingCars) { public List getRacingCars() { - return racingCars.stream().toList(); + return racingCars; } }