[우테코] 프리코스 2주차 미션 - 자동차 경주 게임

5662 단어 우테코우테코

1주차 피드백
1. 클래스나 메서드 변수 이름을 축약하지 마라
2. 공백도 컨벤션이다, 들여쓰기 통일
3. 반복 금지
4. 의미 없는 주석 x
5. 커밋 메시지 의미 있게 작성
6. 기능 목록 업데이트 및 재검토
7. README.md 상세히 작성
8. 매직넘버 x, 구현순서도 컨벤션

1주차 피드백이 나왔다
몇가지는 알고 있었지만 커밋 메시지기능목록, README.md 살아 있는 문서 만드는 것을 내가 잘하고 있는가에 대한 의문이 생겼다
마지막으로 이번 미션은 함수 분리에 이어 클래스 분리에 대해 고민하면서 미션을 진행했다


🚀 기능 요구사항

초간단 자동차 경주 게임을 구현한다.

  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
  • 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
  • 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
  • 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.

✍🏻 입출력 요구사항

⌨️ 입력

  • 경주 할 자동차 이름(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
  • 시도할 회수
5

🖥 출력

  • 각 차수별 실행 결과
pobi : --
woni : ----
jun : ---
  • 단독 우승자 안내 문구
최종 우승자 : pobi
  • 공동 우승자 안내 문구
최종 우승자 : pobi, jun
  • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 [ERROR] 로 시작해야 한다.
[ERROR] 시도 횟수는 숫자여야 한다.

💻 프로그래밍 실행 결과 예시

경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 회수는 몇회인가요?
5

실행 결과
pobi : -
woni : 
jun : -

pobi : --
woni : -
jun : --

pobi : ---
woni : --
jun : ---

pobi : ----
woni : ---
jun : ----

pobi : -----
woni : ----
jun : -----

최종 우승자 : pobi, jun

기능 목록

  • 자동차 이름 입력받기
    • 사용자에게 입력받기
    • ","를 기준으로 이름 나누기
  • 몇번 이동할 건지 입력받기
  • 자동차가 전진할지 말지 결정하기
  • 경주 진행하기
    • 게임 진행하기 (흐름)
    • 각 차수별 실행결과 보여주기
  • 경주를 마친 후 누가 우승했는지 결정하기
    • 제일 많이 전진한 거리 구하기
    • 제일 많이 전진한 자동차 찾기
  • 결과 출력하기
    • 단독 우승, 최종 우승 구분하기
  • 사용자 입력 안내 문구 출력하기
  • 잘못된 값 입력시 에러 처리하기
    • 자동차 이름 5이하인지 체크하기
    • 횟수 입력에 문자가 들어오는지 체크하기

객체 설계

객체 책임 : 아는 것 + 하는 것

아는 것 : 멤버 변수

  • 사적인 정보에 관해 아는것
  • 관련된 객체에 관해 아는것
  • 자신이 유도하거나 계산할 수 있는 것에 관해 아는것

하는 것 : 멤버 함수나 매개변수(메세지 전달)

  • 객체를 생성하거나 계산 수행하는 등의 스스로 하는것
  • 다른 객체의 행동을 시작시키는 것
  • 다른 객체의 활동을 제어하고 조절하는 것

Game

  • 책임
    • 경주에 필요한 기본 세팅(사용자에게 입력받아옴)
    • 경주를 진행시킴
  • 아는 것
    • 경주(race)
  • 하는 것
    • 차 이름별로 경주차 생성해서 Race 만들기(getCarByName())
    • 몇 회 진행할건지 입력받기(getMoveCount())
    • 횟수 별로 경주 진행시키기(run())
    • 차이름들로 경주차들 생성하고 반환하기(createCarList(String[] carNames))

Race

  • 책임
    • 경주 진행하기
    • 우승자 결정하기
  • 아는 것
    • 경주에 참여하는 자동차들(cars)
    • 총 몇회 움직이는지(moveCount)
    • 가장 많이 전진한 차 위치(maxDistance)
  • 하는 것
    • 가장 많이 전진한 위치 계산하기(calculateMaxDistance())
    • 우승자 결정하기(decideWinner())
    • 최종우승자 출력하기(showWinner())
    • 횟수만큼 경주 실행하기(execute())
    • 횟수 입력받기(setMoveCount(int moveCount))

Car

  • 책임
    • 이동하기
    • 현 위치 보여주기
  • 아는 것
    • 이름(name)
    • 위치(position)
  • 하는 것
    • 랜덤 숫자 4 이상이면 전진(move())
    • 현재 위치 "name : position"으로 보여주기(printPosition()) (position 수만큼 '-'로 표현)

InputView

  • 책임
    • 사용자에게 입력받기
  • 하는 것
    • 사용자 입력받기(getUserInput())

OutputView

  • 책임
    • 사용자에게 출력하기
  • 하는 것
    • 경주 이름 안내 메세지(printInputCarGuideMessage())
    • 시도할 횟수 안내 메세지(printInputNumberGuideMessage())
    • 결과 및 최종 우승자 출력(printFinalWinnerBy(String[] winnerCarNames))
    • 에러 출력(printErrorMessage(Exception exception))

알게된 것

  1. 일급객체&일급컬렉션
    • 경주차(car)를 담는 cars를 일급컬렉션으로 만들어줌
    • 비지니스에 종속적인 자료구조
    • Collection의 불변성을 보장
    • 상태와 행위를 한 곳에서 관리
    • 이름이 있는 컬렉션
    • 객체지향 생활체조 참고
  2. Enum
    • ErrorMessage를 enum으로 만들어 처리!
    • 에러를 하나의 enum으로 처리해서 유지보수에 편리할 듯 함
    • 근데 같은 static 이기에 더 좋은 방법이 존재할 것 같음
  3. 함수명 명확하게 작성
    • 길더라도 주석없이 명확하게 알려줘라
  4. README.md와 기능목록 수시로 수정
    • 처음부터 완벽하게 하지마라
    • 살아있는 문서를 만들어라
  5. 객체 책임 (아는것+하는것)

소감

우선 살아있는 문서를 만들자는 목표로 이번 미션을 진행했다
기능목록을 계속 수정하고 이 미션이 잘 들어나게끔 노력했다
그리고 함수크기를 최대한 작게하려고 노력했다
마지막으로 클래스를 책임,역할,협력에 따라 잘 분리하려고 애썼다
다음 미션이 마지막인데 더 극단적인 조건을 걸어서 진행해보자!

ToDo

  • 객체지향 생활체조 원칙을 모두 지켜보자
  • 들여쓰기가 1을 넘지않도록 해보자
  • 함수의 길이가 8을 넘지 않도록 해보자

좋은 웹페이지 즐겨찾기