https://github.com/nbalance97/java-racingcar/tree/step2

 

GitHub - nbalance97/java-racingcar: 자동차 경주 게임 미션 저장소

자동차 경주 게임 미션 저장소. Contribute to nbalance97/java-racingcar development by creating an account on GitHub.

github.com

 

이번 미션에서는 자동차 경주 구현 1단계에서 한 미션을 바탕으로 MVC패턴을 적용하여 리팩토링 해보는 미션이었다.  1단계를 진행하면서 너무 클래스가 난잡하다고 느껴져서 페어와 MVC패턴으로 구현을 하기로 해서 이미 MVC패턴으로 설계를 해놓긴 했으나, 패키지명을 Model로 두어 해당 패키지명을 domain으로 수정하였다.

 

1차 피드백


다른분들의 깃허브 코드들도 살짝살짝 보기도 하면서 내 코드와 비교해 보니, 메인 클래스에서 자동차 경주 게임을 실행하는것 보다는 RacingGame 클래스를 만들어서 해당 클래스에서 게임을 진행하는 방식이 더 좋을거 같았다. 그래서 RacingGame 클래스에서 게임을 진행하도록 리팩토링을 진행해 보았다.

 

main 메서드에서는 RacingGame의 play() 메서드를 호출하도록 구현하였다.

try {
    racingGame.play();
} catch (RuntimeException e) {
    System.out.println(e.getMessage());
}

 

RacingGame의 play 메서드로 기존 main메서드에서의 게임 실행 코드를 이사시켰다. 생성자에서 자동차 이름과 시도 횟수를 전달받아 tryCount는 실제 게임을 진행할 때 사용하고 자동차 이름 배열은 raceController로 전달하여 자동차 객체를 넣도록 구현하였다.. 게임 자체를 객체화 하니 개인적으론 좀 더 명확하게 느껴졌다. 👀

public class RacingGame {
    private final RaceController raceController;
    private final String[] carNames;
    private final int tryCount;

    public RacingGame(String[] carNames, int tryCount) {
        this.carNames = Arrays.copyOf(carNames, carNames.length);
        this.tryCount = tryCount;
        raceController = new RaceController();
        raceController.insertCarFromCarNames(carNames);
    }

    public void play() throws RuntimeException {
        OutputView.printResultPrefix();
        for (int i = 0; i < tryCount; i++) {
            raceController.moveRound();
            raceController.printPosition();
        }
        raceController.printWinner();
    }
}

 

매 순간 리뷰 요청 버튼을 누를때는 떨려..떨려요.. 떨리는 마음으로 리뷰 요청을 드렸고, 리뷰어 제이에게 피드백을 받았다. 제이의 피드백을 요약하면 다음과 같다.

  1. RacingGame에 컨트롤러의 역할을 모두 부여
  2. RacingController을 제거관련 도메인 로직을 도메인으로 이동

처음 피드백을 듣고 RacingGame과 RacingController을 다시 보니 굉장히 애매모호한 점이 있었다.🤔 RacingGame에서는 실제 게임을 진행하고, RacingController에서는 승자를 구하거나 리스트 내 Car들을 이동시키는 등 Car 리스트와 상호작용 하는 역할만 하고 있었기 때문이다. 따라서 RacingController 객체를 삭제하고 도메인에 Cars라는 클래스를 생성해 준 후, Cars 클래스에서 Car 리스트를 다루도록 리팩토링 하였다.

public class Cars {
	...
    private List<Car> cars = new ArrayList<>();
	...
}
public class RacingGame {
    private static final String RESULT_PREFIX = "실행결과";
    private Cars cars = Cars.getInstance();
    private final int tryCount;
	
    ...
    public RacingGame(String[] carNames, int tryCount) {
        this.tryCount = tryCount;
        cars.insertCarFromCarNames(carNames);
    }
    ...

 

이후 추가 리뷰를 요청드렸으며 다음 피드백에서 제이는 일급컬렉션이라는 키워드를 알려주셨다. 찾아보니 분명 언젠가  이전에 공부했던 기억이 나는 개념이었다. 필요에 의해 사용한 후 다시 공부하니 훨씬 이해가 잘 되고 왜 사용하는지 조금은 알게 된 거 같다 제이 덕분에 정말 많이 배운거 같다..ㅎㅎ 감사합니다 제이😃😃😃😃

+ Recent posts