-
Notifications
You must be signed in to change notification settings - Fork 1.2k
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
[Step 3] 자동차 경주 #5718
base: 6democratickim9
Are you sure you want to change the base?
[Step 3] 자동차 경주 #5718
Changes from 10 commits
a45338a
72b942e
c080737
116794b
aa35eeb
98314d6
0699d62
de4cc8d
366d1c1
48b1492
9171fec
7237abd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package CarRacingGame; | ||
|
||
public class CarRacingGame { | ||
static CarRacingGameUtils cars = new CarRacingGameUtils(); | ||
|
||
public static void main(String[] args) { | ||
|
||
int numberOfCars = InputView.inputNumberOfCars(); | ||
int numberOfAttempts = InputView.inputNumberOfAttempts(); | ||
|
||
cars.initialCarSettings(numberOfCars); | ||
cars.printMovingCars(numberOfAttempts); | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package CarRacingGame; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.Random; | ||
|
||
public class CarRacingGameUtils { | ||
public Map<String, String> cars; | ||
|
||
// TODO. 초기 차 인풋을 받고 차의 이동거리가 1인 상태에서 시작하는지, | ||
// 차의 이동거리가 0 인상태에서 시작되는 것인지 확인 필요 | ||
public Map<String, String> initialCarSettings(Integer numberOfCars) { | ||
cars = new HashMap<>(); | ||
for (int carNum = 1; carNum <= numberOfCars; carNum++) { | ||
cars.put("car" + carNum, "-"); | ||
} | ||
return cars; | ||
} | ||
|
||
public void printMovingCars(int numberOfAttempts) { | ||
System.out.println("실행 결과"); | ||
for (int attempt = 0; attempt < numberOfAttempts; attempt++) { | ||
PrintView.printCars(cars); | ||
moveCars(); | ||
System.out.println(); | ||
} | ||
} | ||
|
||
public void moveCars() { | ||
cars.forEach((carNumber, currentPosition) -> { | ||
String newPosition = makeDistanceOfCars(currentPosition); | ||
cars.put(carNumber, newPosition); | ||
}); | ||
} | ||
|
||
public String makeDistanceOfCars(String currentPosition) { | ||
Random random = new Random(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
// TO BE
public static Random RANDOM = new Random();
public String makeDistanceOfCars(String currentPosition) {
int randomValue = RANDOM.nextInt(10);
if (randomValue >= 4) {
currentPosition += "-";
}
return currentPosition;
} |
||
int randomValue = random.nextInt(10); | ||
if (randomValue >= 4) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
요 내용 한번 정리하고 가시죠 🙏
|
||
currentPosition += "-"; | ||
} | ||
return currentPosition; | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 요구사항 구현 잘 해주셨습니다. 크게 3가지로 의견을 드리고 싶습니다. 1. 먼저 테스트 관점입니다 (TDD)현재 작성하신 코드 기반으로 테스트를 잘 작성해주셨습니다만, 정확한 테스트라고 보긴 다소 어렵습니다. @Test
@DisplayName("Set the numbers of the cars and check cars move properly")
public void testMoveCars() {
int numberOfCars = 2;
carRacingGameUtils.initialCarSettings(numberOfCars);
carRacingGameUtils.moveCars();
carRacingGameUtils.cars.forEach((car, position) -> {
assertTrue(position.equals("-") || position.equals("--"));
});
} 요구사항은
입니다만, 작성하신 테스트코드는 항상 참(True) 을 테스트하는 코드 입니다. 아 물론 테스트에 대해서 한번 정리하고 가시면 좋을 것 같습니다. 2. 유지보수 관점입니다.현재 구조에서는 자동차가 이동한 거리를 자동차라는 객체와 자동차를 움직이게 하는 조건 (즉 수정이 앞으로 많이 발생할 것으로 예상되는 부분)은 분리를 해서 물론 지금 구조에서도 가능합니다 예를들어,
그리고 자동차를 움직이게 하는 조건에 대해서는 꾸준하게 수정사항이 발생할 수 있는 확률이 가장 높은 부분임에도 불구하고 public String makeDistanceOfCars(String currentPosition) {
Random random = new Random();
int randomValue = random.nextInt(10);
if (randomValue >= 4) {
currentPosition += "-";
}
return currentPosition;
} 요 내용 한번 참고해주시면 좋을 것 같습니다 🙇 3. 마지막으로 객체지향 관점입니다.제가 만약 여러가지 게임을 제공하는 일종에 게임랜드 앱을 만들고 저는 앱을 통해 사용자의 입력 및 출력을 하려고 합니다. int numberOfCars = InputView.inputNumberOfCars();
int numberOfAttempts = InputView.inputNumberOfAttempts();
cars.initialCarSettings(numberOfCars);
// console 화면에 출력하는 기능과 자동차경주를 진행하는 moveCars(); 가 강 결합 되어있는 구조.
cars.printMovingCars(numberOfAttempts); 따라서 민주님께 수정을 요청할 수 밖에 없는 구조입니다. 그렇게 하려면 일단 객체들간에 역할과 책임을 좀 나눌 필요가 있다고 생각됩니다. 요 내용한번 보시면 좋을 것 같습니다 😄 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package CarRacingGame; | ||
|
||
import java.util.Scanner; | ||
|
||
public class InputView { | ||
private static final Scanner scanner = new Scanner(System.in); | ||
|
||
public static int inputNumberOfCars() { | ||
System.out.println("자동차 대수는 몇 대 인가요?"); | ||
int numberOfCars = scanner.nextInt(); | ||
if (numberOfCars <= 0) { | ||
throw new IllegalArgumentException("Number of cars should be positive"); | ||
} | ||
return numberOfCars; | ||
} | ||
|
||
public static int inputNumberOfAttempts() { | ||
System.out.println("시도할 회수는 몇 회 인가요?"); | ||
int numberOfAttempts = scanner.nextInt(); | ||
if (numberOfAttempts <= 0) { | ||
throw new IllegalArgumentException("Number of attempts should be positive"); | ||
} | ||
return numberOfAttempts; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package CarRacingGame; | ||
|
||
import java.util.Map; | ||
|
||
public class PrintView { | ||
|
||
public static void printCars(Map<String, String> cars) { | ||
cars.forEach((car, position) -> { | ||
System.out.println(position); | ||
}); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
import CarRacingGame.CarRacingGameUtils; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
|
||
import java.util.Map; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
|
||
public class CarRacingUtilsTest { | ||
|
||
private CarRacingGameUtils carRacingGameUtils; | ||
|
||
@BeforeEach | ||
public void setUp() { | ||
carRacingGameUtils = new CarRacingGameUtils(); | ||
} | ||
|
||
@Test | ||
@DisplayName("Set the numbers of the cars and check proper numbers of items") | ||
public void testInitialCarSettings() { | ||
carRacingGameUtils.initialCarSettings(3); | ||
Map<String, String> cars = carRacingGameUtils.initialCarSettings(3); | ||
assertEquals(3, cars.size()); | ||
|
||
} | ||
|
||
@Test | ||
@DisplayName("Set the numbers of the cars and check cars move properly") | ||
public void testMoveCars() { | ||
int numberOfCars = 2; | ||
carRacingGameUtils.initialCarSettings(numberOfCars); | ||
carRacingGameUtils.moveCars(); | ||
carRacingGameUtils.cars.forEach((car, position) -> { | ||
assertTrue(position.equals("-") || position.equals("--")); | ||
}); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
java
에서pakcage
컨벤션은 소문자를 원칙으로 합니다 😄