From 519fdd772c4cc356900b15a8bf66860bb00d2b67 Mon Sep 17 00:00:00 2001 From: bowook Date: Sat, 14 Sep 2024 19:25:44 +0900 Subject: [PATCH 1/6] First Setting --- src/main/java/racingcar/controller/RacingController.java | 4 ++++ src/main/java/racingcar/view/InputView.java | 4 ++++ src/main/java/racingcar/view/OutputView.java | 4 ++++ 3 files changed, 12 insertions(+) create mode 100644 src/main/java/racingcar/controller/RacingController.java 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/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java new file mode 100644 index 00000000000..57939a02c0e --- /dev/null +++ b/src/main/java/racingcar/controller/RacingController.java @@ -0,0 +1,4 @@ +package racingcar.controller; + +public class RacingController { +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 00000000000..2361ba2f5ab --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,4 @@ +package racingcar.view; + +public class InputView { +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 00000000000..abf938a662c --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,4 @@ +package racingcar.view; + +public class OutputView { +} From 047b5bb5c7b920b2eaae5d39cbf158a039c737ca Mon Sep 17 00:00:00 2001 From: bowook Date: Sat, 14 Sep 2024 20:28:30 +0900 Subject: [PATCH 2/6] Setting Second --- src/main/java/racingcar/Application.java | 4 ++++ .../racingcar/controller/RacingController.java | 18 ++++++++++++++++++ src/main/java/racingcar/domain/Cars.java | 17 +++++++++++++++++ .../java/racingcar/service/CarDivision.java | 10 ++++++++++ .../java/racingcar/service/MoveForward.java | 9 +++++++++ src/main/java/racingcar/view/InputView.java | 15 +++++++++++++++ src/main/java/racingcar/view/OutputView.java | 12 ++++++++++++ 7 files changed, 85 insertions(+) create mode 100644 src/main/java/racingcar/domain/Cars.java create mode 100644 src/main/java/racingcar/service/CarDivision.java create mode 100644 src/main/java/racingcar/service/MoveForward.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7242..aedba613242 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,11 @@ package racingcar; +import racingcar.controller.RacingController; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + RacingController racingController = new RacingController(); + racingController.run(); } } diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 57939a02c0e..4af25f06e8a 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,4 +1,22 @@ package racingcar.controller; +import racingcar.domain.Cars; +import racingcar.view.InputView; +import racingcar.view.OutputView; + public class RacingController { + + private final InputView inputView; + private final OutputView outputView; + private final Cars cars; + + public RacingController() { + this.inputView = new InputView(); + this.outputView = new OutputView(); + this.cars = new Cars(inputView.readRacingCarName()); + } + + public void run() { + inputView.readTrialCount(); + } } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java new file mode 100644 index 00000000000..df83cce8bb7 --- /dev/null +++ b/src/main/java/racingcar/domain/Cars.java @@ -0,0 +1,17 @@ +package racingcar.domain; + +import racingcar.service.CarDivision; + +import java.util.ArrayList; +import java.util.List; + +public class Cars { + public List cars; + + public Cars(String userInputs) { + this.cars = CarDivision.carDivide(userInputs); + } + + + +} diff --git a/src/main/java/racingcar/service/CarDivision.java b/src/main/java/racingcar/service/CarDivision.java new file mode 100644 index 00000000000..4ee058b55d2 --- /dev/null +++ b/src/main/java/racingcar/service/CarDivision.java @@ -0,0 +1,10 @@ +package racingcar.service; + +import java.util.ArrayList; +import java.util.List; + +public class CarDivision { + public static List carDivide(String userInputs) { + return List.of(userInputs.split(",")); + } +} diff --git a/src/main/java/racingcar/service/MoveForward.java b/src/main/java/racingcar/service/MoveForward.java new file mode 100644 index 00000000000..198a932fcf3 --- /dev/null +++ b/src/main/java/racingcar/service/MoveForward.java @@ -0,0 +1,9 @@ +package racingcar.service; + +import camp.nextstep.edu.missionutils.Randoms; + +public class MoveForward { + public static int randomMoveForwards() { + return Randoms.pickNumberInRange(0,9); + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 2361ba2f5ab..61d31723a6b 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -1,4 +1,19 @@ package racingcar.view; +import camp.nextstep.edu.missionutils.Console; + public class InputView { + + public String readRacingCarName() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String name = Console.readLine(); + + return name; + } + + public String readTrialCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String count = Console.readLine(); + return count; + } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index abf938a662c..4b45ffca59e 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,4 +1,16 @@ package racingcar.view; public class OutputView { + + public void executionResultMessage() { + System.out.println("\n실행 결과"); + } + + public void finalWinnerMessage() { + System.out.print("최종 우승자 : "); + } + + public void printMessage(String message) { + System.out.println(message); + } } From 389d1b72e1260ef1e1f39bcecfe34448bc5dd09a Mon Sep 17 00:00:00 2001 From: bowook Date: Sun, 15 Sep 2024 18:05:59 +0900 Subject: [PATCH 3/6] 35% --- .../racingcar/controller/RacingController.java | 15 ++++++++++++--- src/main/java/racingcar/domain/Cars.java | 16 +++++++++------- src/main/java/racingcar/service/MoveForward.java | 13 +++++++++++++ src/main/java/racingcar/view/InputView.java | 9 +++------ src/main/java/racingcar/view/OutputView.java | 9 +++++++-- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 4af25f06e8a..ed58f4a34a7 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,6 +1,8 @@ package racingcar.controller; import racingcar.domain.Cars; +import racingcar.service.CarDivision; +import racingcar.service.MoveForward; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -8,15 +10,22 @@ public class RacingController { private final InputView inputView; private final OutputView outputView; + private final MoveForward moveForward; private final Cars cars; public RacingController() { this.inputView = new InputView(); this.outputView = new OutputView(); - this.cars = new Cars(inputView.readRacingCarName()); + this.cars = new Cars(CarDivision.carDivide(inputView.readRacingCarName())); + this.moveForward = new MoveForward(inputView.readTrialCount()); } - + //가장 많이 간 사람이 이긴거. public void run() { - inputView.readTrialCount(); + outputView.executionResultMessage(); + int count = 0; + while(count != moveForward.getTrialCount()) { + + count += 1; + } } } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index df83cce8bb7..008d029d36d 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -1,17 +1,19 @@ package racingcar.domain; -import racingcar.service.CarDivision; +import racingcar.service.MoveForward; -import java.util.ArrayList; import java.util.List; public class Cars { - public List cars; - - public Cars(String userInputs) { - this.cars = CarDivision.carDivide(userInputs); - } + private final List cars; + public Cars(List cars) { + this.cars = cars; + } + public boolean stopAndGo() { + int number = MoveForward.randomMoveForwards(); + return number >= 4; + } } diff --git a/src/main/java/racingcar/service/MoveForward.java b/src/main/java/racingcar/service/MoveForward.java index 198a932fcf3..3c8d9f9ed8b 100644 --- a/src/main/java/racingcar/service/MoveForward.java +++ b/src/main/java/racingcar/service/MoveForward.java @@ -3,7 +3,20 @@ import camp.nextstep.edu.missionutils.Randoms; public class MoveForward { + + private final int trialCount; + + public MoveForward(int trialCount) { + this.trialCount = trialCount; + } + + public int getTrialCount() { + return trialCount; + } + public static int randomMoveForwards() { return Randoms.pickNumberInRange(0,9); } + + } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 61d31723a6b..66b5b79c18e 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -6,14 +6,11 @@ public class InputView { public String readRacingCarName() { System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); - String name = Console.readLine(); - - return name; + return Console.readLine(); } - public String readTrialCount() { + public int readTrialCount() { System.out.println("시도할 회수는 몇회인가요?"); - String count = Console.readLine(); - return count; + return Integer.parseInt(Console.readLine()); } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 4b45ffca59e..514bd584640 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -10,7 +10,12 @@ public void finalWinnerMessage() { System.out.print("최종 우승자 : "); } - public void printMessage(String message) { - System.out.println(message); + public void dashMessage() { + System.out.println("-"); + } + + public void printMessage(String carName, boolean stopAndGo) { + System.out.println(carName + " : " ); + } } From d2034426f6a7d4db6a85980ad194a3ff889402a0 Mon Sep 17 00:00:00 2001 From: bowook Date: Mon, 16 Sep 2024 20:50:40 +0900 Subject: [PATCH 4/6] Finish without exception handling --- .../controller/RacingController.java | 9 +++-- src/main/java/racingcar/domain/Car.java | 27 ++++++++++++++ src/main/java/racingcar/domain/Cars.java | 37 +++++++++++++++++-- .../java/racingcar/service/CarDivision.java | 1 - src/main/java/racingcar/view/OutputView.java | 20 +++++----- 5 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 src/main/java/racingcar/domain/Car.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index ed58f4a34a7..a5fa08e5e78 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -19,13 +19,16 @@ public RacingController() { this.cars = new Cars(CarDivision.carDivide(inputView.readRacingCarName())); this.moveForward = new MoveForward(inputView.readTrialCount()); } - //가장 많이 간 사람이 이긴거. + public void run() { outputView.executionResultMessage(); int count = 0; - while(count != moveForward.getTrialCount()) { - count += 1; + while(count < moveForward.getTrialCount()) { + count++; + cars.moveCars(); + outputView.printMoveResults(cars.getCars()); } + outputView.finalWinnerMessage(cars.winnerJudge()); } } diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java new file mode 100644 index 00000000000..40b35697ef4 --- /dev/null +++ b/src/main/java/racingcar/domain/Car.java @@ -0,0 +1,27 @@ +package racingcar.domain; + +public class Car { + private final String name; + private int position; + + public Car(String name) { + this.name = name; + this.position = 0; + } + + public void move() { + position++; + } + + public int getPosition() { + return position; + } + public String getName() { + return name; + } + + @Override + public String toString() { + return name + " : " + "-".repeat(position); + } +} diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index 008d029d36d..17520e91d11 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -3,17 +3,48 @@ import racingcar.service.MoveForward; import java.util.List; +import java.util.stream.Collectors; public class Cars { - private final List cars; + private final List cars; - public Cars(List cars) { - this.cars = cars; + public Cars(List carNames) { + this.cars = carNames.stream().map(Car::new).collect(Collectors.toList()); + } + + public void moveCars() { + for (Car car : cars) { + if(stopAndGo()) { + car.move(); + } + } } public boolean stopAndGo() { int number = MoveForward.randomMoveForwards(); return number >= 4; } + + public List getCars() { + return cars; + } + + public String winnerJudge() { + StringBuilder sb = new StringBuilder(); + int maxPosition = 0; + for(Car car : cars) { + if(car.getPosition() > maxPosition) { + maxPosition = car.getPosition(); + } + } + + for(Car car : cars) { + if(car.getPosition() == maxPosition) { + sb.append(car.getName()); + } + sb.append(" "); + } + return sb.toString().trim(); + } } diff --git a/src/main/java/racingcar/service/CarDivision.java b/src/main/java/racingcar/service/CarDivision.java index 4ee058b55d2..bc6082f19a2 100644 --- a/src/main/java/racingcar/service/CarDivision.java +++ b/src/main/java/racingcar/service/CarDivision.java @@ -1,6 +1,5 @@ package racingcar.service; -import java.util.ArrayList; import java.util.List; public class CarDivision { diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 514bd584640..38fe28f342e 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,21 +1,23 @@ package racingcar.view; +import racingcar.domain.Car; + +import java.util.List; + public class OutputView { public void executionResultMessage() { System.out.println("\n실행 결과"); } - public void finalWinnerMessage() { - System.out.print("최종 우승자 : "); + public void finalWinnerMessage(String cars) { + System.out.print("최종 우승자 : " + cars); } - public void dashMessage() { - System.out.println("-"); - } - - public void printMessage(String carName, boolean stopAndGo) { - System.out.println(carName + " : " ); - + public void printMoveResults(List cars) { + for (Car car : cars) { + System.out.println(car); + } + System.out.println(); } } From 1386f329424fae45fd3cd9b404ed30aedc88c72e Mon Sep 17 00:00:00 2001 From: bowook Date: Tue, 17 Sep 2024 18:25:56 +0900 Subject: [PATCH 5/6] FINISH --- .../racingcar/controller/RacingController.java | 3 ++- src/main/java/racingcar/domain/Cars.java | 9 ++++++--- src/main/java/racingcar/service/CarDivision.java | 1 + src/main/java/racingcar/service/Validate.java | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/main/java/racingcar/service/Validate.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index a5fa08e5e78..e0d92a25547 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -3,6 +3,7 @@ import racingcar.domain.Cars; import racingcar.service.CarDivision; import racingcar.service.MoveForward; +import racingcar.service.Validate; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -16,7 +17,7 @@ public class RacingController { public RacingController() { this.inputView = new InputView(); this.outputView = new OutputView(); - this.cars = new Cars(CarDivision.carDivide(inputView.readRacingCarName())); + this.cars = new Cars(Validate.validator(CarDivision.carDivide(inputView.readRacingCarName()))); this.moveForward = new MoveForward(inputView.readTrialCount()); } diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index 17520e91d11..ffd46894f67 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -41,10 +41,13 @@ public String winnerJudge() { for(Car car : cars) { if(car.getPosition() == maxPosition) { - sb.append(car.getName()); + sb.append(car.getName()).append(", "); } - sb.append(" "); } - return sb.toString().trim(); + + if (!sb.isEmpty()) { + sb.setLength(sb.length() - 2); // ", "의 길이 만큼 줄임 + } + return sb.toString(); } } diff --git a/src/main/java/racingcar/service/CarDivision.java b/src/main/java/racingcar/service/CarDivision.java index bc6082f19a2..0ea8c80f957 100644 --- a/src/main/java/racingcar/service/CarDivision.java +++ b/src/main/java/racingcar/service/CarDivision.java @@ -4,6 +4,7 @@ public class CarDivision { public static List carDivide(String userInputs) { + return List.of(userInputs.split(",")); } } diff --git a/src/main/java/racingcar/service/Validate.java b/src/main/java/racingcar/service/Validate.java new file mode 100644 index 00000000000..4b0fe5fc169 --- /dev/null +++ b/src/main/java/racingcar/service/Validate.java @@ -0,0 +1,15 @@ +package racingcar.service; + +import java.util.List; + +public class Validate { + + public static List validator(List carNames) { + for(String carName : carNames) { + if(carName.length() > 5) { + throw new IllegalArgumentException(); + } + } + return carNames; + } +} From 88f0332e7b09e5bd8ce1232e91ef4e36b8a6c32b Mon Sep 17 00:00:00 2001 From: bowook Date: Tue, 17 Sep 2024 20:03:47 +0900 Subject: [PATCH 6/6] REFACTORING --- .../java/racingcar/controller/RacingController.java | 4 +--- src/main/java/racingcar/domain/Car.java | 2 ++ src/main/java/racingcar/domain/Cars.java | 3 ++- .../java/racingcar/{service => domain}/Validate.java | 2 +- src/main/java/racingcar/service/CarDivision.java | 10 ---------- src/main/java/racingcar/service/MoveForward.java | 1 + src/main/java/racingcar/view/InputView.java | 6 ++++-- 7 files changed, 11 insertions(+), 17 deletions(-) rename src/main/java/racingcar/{service => domain}/Validate.java (91%) delete mode 100644 src/main/java/racingcar/service/CarDivision.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index e0d92a25547..e2099777f72 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,9 +1,7 @@ package racingcar.controller; import racingcar.domain.Cars; -import racingcar.service.CarDivision; import racingcar.service.MoveForward; -import racingcar.service.Validate; import racingcar.view.InputView; import racingcar.view.OutputView; @@ -17,7 +15,7 @@ public class RacingController { public RacingController() { this.inputView = new InputView(); this.outputView = new OutputView(); - this.cars = new Cars(Validate.validator(CarDivision.carDivide(inputView.readRacingCarName()))); + this.cars = new Cars(inputView.readRacingCarName()); this.moveForward = new MoveForward(inputView.readTrialCount()); } diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java index 40b35697ef4..76682bbe4de 100644 --- a/src/main/java/racingcar/domain/Car.java +++ b/src/main/java/racingcar/domain/Car.java @@ -1,6 +1,7 @@ package racingcar.domain; public class Car { + //무엇을 할 것인가, 핵심 기능 로직 private final String name; private int position; @@ -20,6 +21,7 @@ public String getName() { return name; } + @Override public String toString() { return name + " : " + "-".repeat(position); diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java index ffd46894f67..7123e95d5b9 100644 --- a/src/main/java/racingcar/domain/Cars.java +++ b/src/main/java/racingcar/domain/Cars.java @@ -10,6 +10,7 @@ public class Cars { private final List cars; public Cars(List carNames) { + Validate.validator(carNames); this.cars = carNames.stream().map(Car::new).collect(Collectors.toList()); } @@ -46,7 +47,7 @@ public String winnerJudge() { } if (!sb.isEmpty()) { - sb.setLength(sb.length() - 2); // ", "의 길이 만큼 줄임 + sb.setLength(sb.length() - 2); } return sb.toString(); } diff --git a/src/main/java/racingcar/service/Validate.java b/src/main/java/racingcar/domain/Validate.java similarity index 91% rename from src/main/java/racingcar/service/Validate.java rename to src/main/java/racingcar/domain/Validate.java index 4b0fe5fc169..2b062a41cf6 100644 --- a/src/main/java/racingcar/service/Validate.java +++ b/src/main/java/racingcar/domain/Validate.java @@ -1,4 +1,4 @@ -package racingcar.service; +package racingcar.domain; import java.util.List; diff --git a/src/main/java/racingcar/service/CarDivision.java b/src/main/java/racingcar/service/CarDivision.java deleted file mode 100644 index 0ea8c80f957..00000000000 --- a/src/main/java/racingcar/service/CarDivision.java +++ /dev/null @@ -1,10 +0,0 @@ -package racingcar.service; - -import java.util.List; - -public class CarDivision { - public static List carDivide(String userInputs) { - - return List.of(userInputs.split(",")); - } -} diff --git a/src/main/java/racingcar/service/MoveForward.java b/src/main/java/racingcar/service/MoveForward.java index 3c8d9f9ed8b..3de31d5129b 100644 --- a/src/main/java/racingcar/service/MoveForward.java +++ b/src/main/java/racingcar/service/MoveForward.java @@ -3,6 +3,7 @@ import camp.nextstep.edu.missionutils.Randoms; public class MoveForward { + //어떻게 할 것인가, 상황별 로직 private final int trialCount; diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index 66b5b79c18e..3241776c084 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -2,11 +2,13 @@ import camp.nextstep.edu.missionutils.Console; +import java.util.List; + public class InputView { - public String readRacingCarName() { + public List readRacingCarName() { System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); - return Console.readLine(); + return List.of(Console.readLine().split(",")); } public int readTrialCount() {