Skip to content

πŸš€ 3단계 - μžλ™μ°¨ κ²½μ£Ό #5920

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Mar 16, 2025
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,20 @@
* λͺ¨λ“  ν”Όλ“œλ°±μ„ μ™„λ£Œν•˜λ©΄ λ‹€μŒ 단계λ₯Ό λ„μ „ν•˜κ³  μ•žμ˜ 과정을 λ°˜λ³΅ν•œλ‹€.

## 온라인 μ½”λ“œ 리뷰 κ³Όμ •
* [ν…μŠ€νŠΈμ™€ μ΄λ―Έμ§€λ‘œ μ‚΄νŽ΄λ³΄λŠ” 온라인 μ½”λ“œ 리뷰 κ³Όμ •](https://github.com/next-step/nextstep-docs/tree/master/codereview)
* [ν…μŠ€νŠΈμ™€ μ΄λ―Έμ§€λ‘œ μ‚΄νŽ΄λ³΄λŠ” 온라인 μ½”λ“œ 리뷰 κ³Όμ •](https://github.com/next-step/nextstep-docs/tree/master/codereview)

## κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘
### πŸš€ 3단계 - μžλ™μ°¨ κ²½μ£Ό
> **μš”κ΅¬μ‚¬ν•­**
> - μ΄ˆκ°„λ‹¨ μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ„ κ΅¬ν˜„ν•œλ‹€.
> - μ£Όμ–΄μ§„ 횟수 λ™μ•ˆ nλŒ€μ˜ μžλ™μ°¨λŠ” μ „μ§„ λ˜λŠ” 멈좜 수 μžˆλ‹€.
> - μ‚¬μš©μžλŠ” λͺ‡ λŒ€μ˜ μžλ™μ°¨λ‘œ λͺ‡ 번의 이동을 ν•  것인지λ₯Ό μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
> - μ „μ§„ν•˜λŠ” 쑰건은 0μ—μ„œ 9 μ‚¬μ΄μ—μ„œ random 값을 κ΅¬ν•œ ν›„ random 값이 4이상일 κ²½μš°μ΄λ‹€.
> - μžλ™μ°¨μ˜ μƒνƒœλ₯Ό 화면에 좜λ ₯ν•œλ‹€. μ–΄λŠ μ‹œμ μ— 좜λ ₯ν•  것인지에 λŒ€ν•œ μ œμ•½μ€ μ—†λ‹€.

κ΅¬ν˜„ λͺ©λ‘
- [x] μ‚¬μš©μžλ‘œλΆ€ν„° 값을 μž…λ ₯λ°›λŠ”λ‹€.
- [x] μž…λ ₯받은 값을 μ΄μš©ν•΄ μžλ™μ°¨ 객체λ₯Ό μƒμ„±ν•œλ‹€.
- [x] μž…λ ₯받은 값을 μ΄μš©ν•΄ μ‹€ν–‰λ˜λŠ” κ²Œμž„μ˜ λ‘œμ§μ„ κ΅¬ν˜„ν•œλ‹€.
- [x] κ²Œμž„ λ‚΄μ—μ„œ μžλ™μ°¨κ°€ μ „μ§„ λ˜λŠ” λ©ˆμΆ”κ²Œ ν•œλ‹€.
- [x] μžλ™μ°¨μ˜ μƒνƒœλ₯Ό 화면에 좜λ ₯ν•œλ‹€.
10 changes: 10 additions & 0 deletions src/main/java/car_racing/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package car_racing;

import car_racing.domain.GameController;

public class Main {
public static void main(String[] args) {
GameController gameController = new GameController();
gameController.run();
}
}
31 changes: 31 additions & 0 deletions src/main/java/car_racing/domain/CarController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package car_racing.domain;

import car_racing.domain.model.Cars;
import car_racing.view.CarPrinter;
import car_racing.view.model.UserInput;

public class CarController {
private final Cars cars;
private final UserInput userInput;

public CarController(UserInput userInput) {
this.userInput = userInput;
this.cars = new Cars(userInput.getNumOfCar());
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MVCνŒ¨ν„΄μ„ κΈ°λ°˜ν•˜μ‹ κ±° κ°™μŠ΅λ‹ˆλ‹€.
ControllerλŠ” κ³Όμ—° μƒνƒœλ₯Ό κ°€μ§€κ³  μžˆλŠ”κ²Œ λ§žμ„κΉŒμš”?
즉, μΈμŠ€ν„΄μŠ€λ³€μˆ˜λ‘œ Carsλ₯Ό κ°€μ§€κ³  μžˆλŠ”κ²Œ λ§žμ„μ§€... 고민을 ν•΄λ³΄μ‹œλ©΄ μ–΄λ–¨κΉŒμš”?


public void race() {
showRaceStart();
for (int i = 0; i < userInput.getNumOfGame(); i++) {
cars.moveAll();
showRaceResult();
}
}

private void showRaceStart() {
CarPrinter.showRaceStart();
}

private void showRaceResult() {
CarPrinter.showRaceResult(cars);
}
}
14 changes: 14 additions & 0 deletions src/main/java/car_racing/domain/GameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package car_racing.domain;

import car_racing.view.model.UserInput;
import car_racing.view.UserInputProcessor;

public class GameController {
private final UserInputProcessor userInputProcessor = new UserInputProcessor();

public void run() {
UserInput userInput = userInputProcessor.getUserInput();
CarController carController = new CarController(userInput);
carController.race();
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Controllerκ°€ Controllerλ₯Ό κ°€μ§€κ³  μžˆλŠ” ν˜•νƒœκ°€ MVCμ—μ„œ κΈ°λ°˜λ˜λŠ”κ±ΈκΉŒμš”?

}
14 changes: 14 additions & 0 deletions src/main/java/car_racing/domain/model/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package car_racing.domain.model;

public class Car {
private int distance;

public void move(int distance) {
if (distance < 0) throw new IllegalArgumentException("μžλ™μ°¨λŠ” 음수만큼 움직일 수 μ—†μŠ΅λ‹ˆλ‹€.");
this.distance += distance;
}

public int getDistance() {
return distance;
}
}
35 changes: 35 additions & 0 deletions src/main/java/car_racing/domain/model/Cars.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package car_racing.domain.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Consumer;

public class Cars {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μΌκΈ‰μ»¬λ ‰μ…˜ πŸ‘

private static final Random random = new Random();
private static final int MOVE_THRESHOLD = 4;
private static final int DEFAULT_MOVE_DISTANCE = 1;

private final List<Car> cars;

public Cars(int numOfCars) {
this.cars = new ArrayList<>();
for (int i = 0; i < numOfCars; i++) {
this.cars.add(new Car());
}
}

public void moveAll() {
cars.forEach(car -> {
if (isMovable()) car.move(DEFAULT_MOVE_DISTANCE);
});
}

public void forEach(Consumer<Car> action) {
cars.forEach(action);
}

private boolean isMovable() {
return random.nextInt() > MOVE_THRESHOLD;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ—¬κΈ°μ„œ λžœλ€μ„ μ œμ–΄ν•œλ‹€λ©΄, Cars에 λŒ€ν•œ moveAll에 λŒ€ν•œ ν…ŒμŠ€νŠΈκ°€ νž˜λ“€κ±° κ°™μŠ΅λ‹ˆλ‹€.

ν•œλ²ˆ μ•„λž˜ 글을 μ°Έκ³ ν•΄λ³΄μ‹œλ©΄ μ–΄λ–¨κΉŒμš”?

https://tecoble.techcourse.co.kr/post/2020-05-17-appropriate_method_for_test_by_interface/

}
19 changes: 19 additions & 0 deletions src/main/java/car_racing/view/CarPrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package car_racing.view;

import car_racing.domain.model.Car;
import car_racing.domain.model.Cars;

public class CarPrinter {
public static void showRaceStart() {
System.out.println("\nμ‹€ν–‰ κ²°κ³Ό");
}

public static void showRaceResult(Cars cars) {
cars.forEach(CarPrinter::showEachRaceResult);
System.out.println();
}

private static void showEachRaceResult(Car car) {
System.out.println("-".repeat(car.getDistance()));
}
}
25 changes: 25 additions & 0 deletions src/main/java/car_racing/view/UserInputProcessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package car_racing.view;

import car_racing.view.model.UserInput;

import java.util.Scanner;

public class UserInputProcessor {
private static final Scanner scanner = new Scanner(System.in);

public UserInput getUserInput() {
int numOfCar = getNumOfCar();
int numOfGame = getNumOfGame();
return new UserInput(numOfCar, numOfGame);
}

private int getNumOfCar() {
System.out.println("μžλ™μ°¨ λŒ€μˆ˜λŠ” λͺ‡ λŒ€ μΈκ°€μš”?");
return scanner.nextInt();
}

private int getNumOfGame() {
System.out.println("μ‹œλ„ν•  νšŒμˆ˜λŠ” λͺ‡ 회 μΈκ°€μš”?");
return scanner.nextInt();
}
}
19 changes: 19 additions & 0 deletions src/main/java/car_racing/view/model/UserInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package car_racing.view.model;

public class UserInput {
private final int numOfCar;
private final int numOfGame;

public UserInput(int numOfCar, int numOfGame) {
this.numOfCar = numOfCar;
this.numOfGame = numOfGame;
}

public int getNumOfCar() {
return numOfCar;
}

public int getNumOfGame() {
return numOfGame;
}
}
26 changes: 26 additions & 0 deletions src/test/java/car_racing/CarTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package car_racing;

import car_racing.domain.model.Car;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;

class CarTest {
@ParameterizedTest(name = "μžλ™μ°¨λ₯Ό 움직이면 μžλ™μ°¨κ°€ 움직인 만큼 μœ„μΉ˜κ°€ λ³€ν•œλ‹€. 움직인 κ°’: {0}")
@ValueSource(ints = {1, 2, 3})
void shouldMoveCarByGivenDistance(int inputDistance) {
Car car = new Car();
car.move(inputDistance);
assertThat(car.getDistance()).isEqualTo(inputDistance);
}

@ParameterizedTest(name = "μžλ™μ°¨λ₯Ό 음수만큼 움직이면 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. 움직인 κ°’: {0}")
@ValueSource(ints = {-1, -2, -3})
void sholdThrowRuntimeExceptionWhenNegativeDistanceIsGiven(int inputDistance) {
Car car = new Car();
assertThatThrownBy(() -> car.move(inputDistance))
.isInstanceOf(RuntimeException.class);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

경계값을 ν…ŒμŠ€νŠΈν•΄λΌ. λΌλŠ” 말이 μžˆμŠ΅λ‹ˆλ‹€.
μŒμˆ˜μ™€ μ–‘μˆ˜λ₯Ό 검증해야 ν•˜λŠ”λ°μš”.

κ·Έλ ‡λ‹€λ©΄ μŒμˆ˜μ™€ μ–‘μˆ˜μ˜ 경계선은 μ–΄λ””μΌκΉŒμš”?
-1κ³Ό 1이라고 μƒκ°ν•©λ‹ˆλ‹€.
κ·Έ 두가지 ν…ŒμŠ€νŠΈλ‘œ μΆ©λΆ„νžˆ ν• μˆ˜ μžˆμ§€ μ•Šμ„κΉŒμš”?

1을 κ²€μ¦ν•œλ’€μ— 2,3을 κ²€μ¦ν•˜λŠ”κ²ƒμ— λŒ€ν•΄ 큰 μ˜λ―Έκ°€ μžˆμ„κΉŒμš”?

ν•œλ²ˆ κ³ λ―Όν•΄λ³΄μ‹œλ©΄ 쒋을거 κ°™μŠ΅λ‹ˆλ‹€!

}