TDD로 간단한 커멘드라인 프로그램 개발하기

카일·2020년 2월 16일
4
post-thumbnail

모든 코드는 여기를 클릭 하시면 확인 하실 수 있습니다.

안녕하세요 첫 블로그 포스팅으로는 TDD로 간단한 커멘드라인 프로그램을 개발하는 과정을 포스팅 해볼까 합니다. 처음으로 개발 할 프로그램은 자동차 경주 게임인데요, 기능 요구사항 및 프로그래밍 요구사항을 아래에 적어보고 어떤 식으로 구현 할 지에 대해 설계하는 부분까지를 이번 포스팅의 내용으로 하겠습니다.

자동차 경주 게임

자동차 경주 게임은 Command Line Program으로 사용자에게 함께 플레이 할 사용자의 이름과 플레이 횟수를 입력하면 각 횟수 마다 난수에 의해 60%의 확률로 전진과 스탑이 결정됩니다. 매 라운드의 결과를 출력하고 최종적으로 우승자의 명단을 출력하며 프로그램은 종료됩니다.

개발 방법

Test Driven Development (TDD) 를 기반으로 Production Code를 작성하기 전에 Test 코드를 먼저 작성하고 테스트가 통과하는 가장 쉬운 방법으로 프로덕션 코드를 완성한 후 리팩토링 하는 방식으로 개발 할 예정입니다.

기능 요구사항

  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
  • 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4 이상일 경우 전진하고, 3 이하의 값이면 멈춘다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.

프로그래밍 요구사항

  • 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.
  • indent(인덴트, 들여쓰기) depth를 3을 넘지 않도록 구현한다. 2까지만 허용한다.
    • 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
    • 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
  • else 예약어를 쓰지 않는다.
    • 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
    • else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
  • 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
    • 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.

TO-DO LIST 작성 (README.md)

# 자동차 경주 게임

- 사용자에게 플레이 할 자동차의 이름을 입력받고, 플레이 할 횟수를 입력받는다. 매 라운드(횟수) 마다 각 사용자는 무작위로 생성된 난수에 의해 GO / STOP 이 결정된다.
- 매 라운드 별로 결과를 출력하고, 모든 라운드가 종료되는 경우 우승자를 출력한다.

## TO-DO LIST

- 함께 플레이 할 사용자를 입력받는다.

    - 1~5 글자
    - 공백 및 NULL Exception
    - Comma(,) 를 기준으로 구분
    - 중복된 이름 입력 Exception
    
- 플레이 할 횟수를 입력받는다.
    
    - 1 ~ 30 회
    - 1 보다 작은 수 Exception
    - 문자열 Exception

- 전진 하는 조건은 0~9 사이의 Random 값을 구한 후 4이상이면 전진, 3이하 멈춘다.
    
    - 전진 하는 조건은 달라질 수 있다고 가정한다.
        - 차의 종류나 탈 것의 변경
        - 다른 조건에 의한 이동
        - 위의 조건에 의해 전진시 이동 거리가 달라 질 수 있다.

- 매 라운드 별로 각 사용자의 이름과 Position을 출력하고

    - 매 라운드 결과 값을 저장하고 있는다.

- 모든 라운드가 종료되면 최종 우승자의 이름을 출력한다.
     
    - 라운드 결과 중 마지막 라운드의 결과를 출력한다.

개발 환경

  • IDE : Intellij
  • Test : Junit5
  • Language : Java
  • Build (?!) : Gradle

프로그램 완성 스크린 샷 및 테스트 통과 스크린 샷

1개의 댓글