우아한테크코스 6기 백엔드 프리코스 - 자동차 경주 게임

요구사항 파악

일단 기능 요구 사항을 읽고 입력, 출력, 계산 으로 분류했다.

입력

  • 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

출력

  • 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.

계산

  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
  • 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.

코드 컨벤션

  • indent depth는 2까지 허용
  • 3항 연산자 사용 금지
  • 메서드는 한 가지 일만 한다
  • 테스트를 통해 구현한 기능 목록이 정상 작동함을 확인한다

미션 사이의 연관성

미션의 요구사항을 입력, 출력, 계산으로 나누고 보니 이전 미션과의 공통점이 보였다.

  • 입력을 받는다.
  • 입력값이 정상적인 값인지 확인한다.
  • 비정상적인 값을 입력받은 경우 IllegalArgumentException 예외가 발생하며 프로세스가 종료된다.
  • 적절한 값을 출력한다.

이전 미션과 이번 미션의 공통되는 부분을 추상화하여 재사용성을 높일 수 있겠다는 생각이 스쳐지나갔다. 하지만 지금 내가 연습하는 것은 TDD이기 때문에 추상적인 설계는 모든 테스트를 통과한 뒤에 하기로 했다.

테스트 목록 작성

요구사항을 만족하기 위해 통과해야 할 테스트 목록은 아래와 같다.

m2t01 - 자동차 이름은 5자 이하의 문자열이며 쉼표로 구분하여 입력받는다.
m2t02 - 이동 횟수는 숫자만을 입력받는다.
m2t03 - 이외의 값을 입력할 경우 IllegalArgumentException을 발생시키며 프로그램은 종료된다.
m2t04 - 우승한 자동차의 이름을 모두 출력한다. 한 개 이상인 경우 쉼표로 구분하여 출력한다.
m2t05 - 지정된 범위의(0부터 9까지) 난수를 생성할 수 있어야 한다.
m2t06 - 1회의 이동에서 생성된 난수가 4 이상인 경우에만 전진한다.
m2t07 - 입력받은 횟수 만큼의 전진이 끝난 뒤 가장 앞에 있는 자동차를 선택한다.

구현

m2t05

가장 만만한 테스트부터 시작하자. 미션에서 제공하는 Randoms 감싸는 개체 RandomNumberGenerator 클래스가 필요하다. 이 클래스는 외부 API를 나의 프로그램으로부터 분리한다.

m2t05

아래는 이 테스트를 통과하기 위해 작성한 클래스이다.

m2t05 통과

아래는 조금 더 보폭을 크게 가져갔을 때의 m2t05 테스트이다.
첫 번째 미션처럼 GameRule 클래스를 도입했다.

m2t05-2

GameRule

마무리

elapsed-time-1

reference

Comments