서론
저번주와 마찬가지로 이전 기수의 우테코 프리코스 주제를 5시간동안 구현해보고 서로 코드리뷰를 하는 방식으로 진행했다. 이번주는 자동차 경주게임이 당첨됐고 구현은 생각보다 쉬워서 책임의 분리와 스트림을 적용하는데 시간이 다갔던 것 같다.
PR링크 코드의 링크를 남깁니다. 리뷰는 언제든 환영합니다...
기능 요구사항 정리
일단 입출력을 보고 기능목록을 작성을 어떻게 했나 설명하겠다.
💻 프로그래밍 실행 결과 예시
경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 회수는 몇회인가요?
5
실행 결과
pobi : -
woni :
jun : -
pobi : --
woni : -
jun : --
pobi : ---
woni : --
jun : ---
pobi : ----
woni : ---
jun : ----
pobi : -----
woni : ----
jun : -----
최종 우승자 : pobi, jun
🚀 기능 요구사항
초간단 자동차 경주 게임을 구현한다.
주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.
흐름도
기능 목록 정리
- 차 이름과 레이싱 게임 내에서 사용할 차 포지션을 관리할 Car
- 레이싱 게임 내 한턴 당 차들의 이동과 출력문, 최대 포지션을 관리하는 Car들의 컬렉션인 Cars
- 차들의 이동에 관여하는 랜덤값을 생성해주는 CarOperator
- 게임 내의 라운드를 관리하는 Round
- Cars와 CarOperator로 레이싱 게임의 한 턴을 움직이는 턴과 과정을 출력하는 턴으로 관리해주는 CarVenueService
- 입출력과 Service의 흐름을 컨트롤 해주는 RacingCarController
예외처리
- 자동차 이름의 길이 5보다 크거나 빈칸일 때
- 자동차들끼리 이름이 중복될 때
- 시도횟수가 숫자가 아닐 때
객체 관리
🚗 Car
상태
- 이름
- 포지션
행동
- 움직임
🚗🚗🚗 Cars
Car List를 관리하는 일급 컬렉션
상태
- 🚗 Car 모임
행동
- 리스트 내의 차 이동
- 리스트 내의 차 출력문 조합
- 리스트 내의 가장 멀리간 차 이름 조합
📍 Round
게임 내의 라운드를 관리
상태
- 최종 라운드
- 현재 라운드
행동
- 라운드 이동
- 최종과 현재 라운드 비교 게임 끝났는지 관리
👨 CarOperator
Cars 내의 각 차들에 대한 랜덤값 반환
상태
- Car들의 수
행동
- Car 수만큼 랜덤값 리스트 반환
🚚CarVenueService
레이싱 게임의 한턴을 움직임과 과정 출력, 결과로 우승자 출력 관리
상태
- 🚗🚗🚗 Cars
- 📍 Round
- 👨 CarOperator
행동
- Round 끝날 때 까지
- Cars에서 관리하는 차들 CarOperator에서 값을 받아 이동
- Cars에서 관리하는 차들 과정 출력
- Round 끝나고
- Cars에서 관리하는 우승자 출력
리팩터링
함수형 인터페이스, 제너릭에 대한 공부를 더하고 추가 예정
- View에서 재귀로 예외처리 안될 때 까지 받는 코드 흐름제어 -> 서플라이어 사용해 컨트롤러로 이동
- 전체적인 네이밍
- View에서 처리하는 중복 예외처리 -> Cars 도메인의 생성자 내로 이동, Car의 eqaul, hascode Overriding
- View에서 처리하는 숫자 예외처리 -> Round 도메인의 생성자 내로 이동
- stream 활용하기