본문 바로가기

강의/TDD, Clean Code with Java 12기

Step5 - 자동차 경주(우승자) (14일차)

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+"가 최종 우승했습니다.");
    }

}