1. 코드 컨벤션 생각하며 작성하기
2. MVC 에 맞게 코드를 구분하기
3. private, static, final 을 적절하게 사용하기
4. 테스트 코드 작성하기
5. 매직 넘버 추출하기
6. 객체가 사용되는 시점에 검증하기
7. 어레이 보다는 컬렉션을 사용하기
8. stream 사용해보기
위 사항을 지키면서 코드를 다시 한번 작성해 보았습니다.
이번에는 자동차 등록하는 부분은 Race 클래스에서 -> CarRacer 부분으로 이동하였습니다.
그렇게 되면 CarRacer의 객체가 생성될 때마다 input에 대하여 검증을 진행하겠지만,
멘토님께서 말씀하신 객체가 사용되는 시점에 검증하기 위해서는 이렇게 진행하는 것이 더 옳다고 판단하였습니다.
멘토님께서는 대부분의 코드를 stream으로 작성하셨는데, 저는 아직 stream이 익숙하지 않아 연습하는 기간을 가졌었습니다.
MVC 패턴에 따라 클래스들을 나눠서 폴더에 정리하였습니다.
뭔가 열심히 한것 같았는데 다시 작성해고 난 뒤 확인해 본 결과 step4에 비해서 변한건 별로 없긴하네요...
컨펌 부탁드립니다. 감사합니다!!
회사 가야하는데 코드를 짜다보니 시간 가는줄을 몰랐다. ㅜㅜ 1시가 되어버렸어 ㅜㅜ
import step4.ResultView;
import step5.domain.Race;
import step5.view.InputView;
import java.util.Scanner;
public class RacingCarMain {
public static void main(String[] args) {
InputView inputView = new InputView();
String carNames = inputView.requestCars();
int round = inputView.requestRound();
Race race = new Race(carNames.split(","), round);
race.startGame();
}
}
package step5.domain;
import step5.view.ResultView;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Race {
private static int round;
private static List<CarRacer> carRacers;
private static ResultView resultView = new ResultView();
private static String maxCarName;
private static int maxCarPosition = 0;
public Race(String[] carNames, int round) {
carRacers = enroll(carNames);
this.round = round;
}
private List<CarRacer> enroll(String[] carNames) {
return Arrays.stream(carNames)
.map(CarRacer::new)
.collect(Collectors.toList());
}
public void startGame() {
resultView.printCurrState(carRacers);
runGameByCycle();
carRacers.stream()
.forEach(carRacer -> findMaxPositionCarName(carRacer.getCarName(),carRacer.getCurrPosition()));
resultView.printFinalResult(maxCarName);
}
private void runGameByCycle() {
for (int i = 0; i < round; i++) {
playOneRound();
resultView.printCurrState(carRacers);
}
}
private void playOneRound() {
for (CarRacer carRacer: carRacers) {
carRacer.canIGo();
}
}
public void findMaxPositionCarName(String carName, int carPosition) {
if (carPosition > maxCarPosition) {
maxCarName = carName;
maxCarPosition = carPosition;
return;
}
if (carPosition == maxCarPosition) {
maxCarName += ", "+carName;
return;
}
}
}
package step5.domain;
public class Car {
private int position;
private String name;
public Car(int position, String name) {
this.position = position;
this.name = name;
}
public void moveForward() {
position++;
}
public int getPosition() {
return position;
}
public String getName() {
return name;
}
}
package step5.util;
import java.util.Random;
public class RandomGame {
static Random rd = new Random();
public boolean throwDice() {
int randNum = rd.nextInt(10);
if (randNum >= 4) {
return true;
}
return false;
}
}
package step5.view;
import java.util.Scanner;
public class InputView {
private static final String HOW_MANY_CAR = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).";
private static final String HOW_MANY_CYCLE = "시도할 횟수는 몇 회 인가요?";
private static final Scanner sc = new Scanner(System.in);
public String requestCars() {
System.out.println(HOW_MANY_CAR);
return sc.next();
}
public int requestRound() {
System.out.println(HOW_MANY_CYCLE);
return sc.nextInt();
}
}
package step5.view;
import step5.domain.CarRacer;
import java.util.List;
public class ResultView {
public void printCurrState(List<CarRacer> carRacers) {
for (CarRacer carRacer: carRacers) {
int position = carRacer.getCurrPosition();
System.out.print(carRacer.getCarName()+":");
for (int i = 0; i < position; i++) {
System.out.print("-");
}
System.out.println();
}
System.out.println();
}
public void printFinalResult(String maxCarName) {
System.out.println(maxCarName+"가 최종 우승했습니다.");
}
}
'강의 > TDD, Clean Code with Java 12기' 카테고리의 다른 글
[로또] step1 - 문자열 덧셈 계산기 (15일 차) (0) | 2021.08.03 |
---|---|
Step5 - 자동차 경주(우승자) - 피드백 (15일차) (0) | 2021.08.03 |
Step4 - 자동차 경주(우승자) - 피드백 반영 (11일차) (0) | 2021.07.29 |
Step4 - 자동차 경주(우승자) (9일차, 10일차) (0) | 2021.07.27 |
4단계 자동차경주 (우승자) (8일차) - 피드백 반영 (0) | 2021.07.27 |