1주차 미션을 무사히 마치고 2주차 미션이 시작됐다.
이번에도 메일로 미션이 왔다. 2주차 미션은 자동차 경주 미션이었따. 내가 봤을때는 숫자야구보다 쉬운 것 같다
이번에도 설계부터 시작했다.
경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 회수는 몇회인가요?
5
실행 결과
pobi : -
woni :
jun : -
pobi : --
woni : -
jun : --
pobi : ---
woni : --
jun : ---
pobi : ----
woni : ---
jun : ----
pobi : -----
woni : ----
jun : -----
최종 우승자 : pobi, jun
게임의 진행은 이렇게 된다. 프리코스 전에 한 번 해봤는데 요구사항을 잘못 파악한적이 있다.
시도할 회수만큼 게임을 진행해야 하는데 시도할 회수에 먼저 도달하는 자동차가 우승하는걸로 이해하고 코드를 짰었다.
이번에는 그런 실수를 하지 않기 위해 요구사항을 꼼꼼하게 확인하고 미션을 진행했다.
로직을 짠 후에 기능목록을 정리해봤다.
기능
자동차
- [x] 위치를 가진다
- [x] 초기 위치 0
- [x] 전진 또는 멈출 수 있다
- [x] 4이상일 경우 한칸 전진
- [x] 3이하일 경우 정지
- [x] 이름을 가진다
- [x] 5자 초과하면 예외
- [x] 이름이 null이나 공백이면 예외
자동차 게임
- [x] 0에서 9 사이의 무작위 값을 구한다
- [x] 시도 횟수만큼 게임이 진행된다
- [x] 우승자를 판별한다
- [x] 우승자는 한명 이상일 수 있다
입력
- [x] 자동차 이름은 쉼표를 기준으로 구분한다
- [x] 사용자는 몇번의 이동을 할 것인지 입력할 수 있어야 한다
출력
- [x] 우승자를 출력한다
- [x] 자동차의 이동을 출력한다
1주차 미션에 이어서 2주차 미션도 MVC 패턴
을 적용하기로 했다.
이번 구현도 ENUM
클래스부터 시작했다. 열거형부터 정의하고 시작하면 어떤 코드를 짜야하는지 명확하게 알 수 있어서 좋은 것 같다.
구현 초반에는 ErrprManager
라는 클래스를 먼저 만들어놨다. 코드를 짜다가 예외처리
에 관한 부분을 생각해보게 되었다. 1주차 미션에서는 예외들을 한 클래스에 모아서 관리했는데 그렇게 하면 기존 클래스 내부에서 처리할 수 있는 로직들이 다른 클래스와의 의존이 생기게 변해서 안좋다고 생각했다.
그래서 예외처리 부분들을 처리가 필요한 클래스들 안으로 넣어서 관리해주었다. 비슷한 예외를 여러번 처리하면 클래스로 관리할텐데 이번 미션은 예외가 대부분 달라서 이렇게 할 수 있었다.
이번 미션에서도 전략패턴
을 사용해주었다. 테스트를 위해서였는데 Car
객체 내부에서 숫자를 생성해서 이동하면 단위 테스트
를 하기 어려웠다. 그래서 숫자를 주입해서 테스트하는 방식을 사용하기 위해서 전략패턴
을 사용하게 되었다.
@Test
void 자동차_초기위치_0이아니면_예외(){
Car car = new Car("junki");
assertThat(car.getPosition()).isEqualTo(0);
}
@Test
void 파워_4이상_전진(){
Car car = new Car("junki");
car.move(4);
assertThat(car.getPosition()).isEqualTo(1);
}
@Test
void 파워_3이하_정지(){
Car car = new Car("junki");
car.move(3);
assertThat(car.getPosition()).isEqualTo(0);
}
@Test
void 이름_5자_초과_예외(){
assertThatThrownBy(() -> new Car("longname"))
.isInstanceOf(IllegalArgumentException.class);
}
@Test
void 이름_Null_예외(){
assertThatThrownBy(() -> new Car(""))
.isInstanceOf(IllegalArgumentException.class);
}
이렇게 숫자를 넣어서 움직임을 통제할 수 있었다.
전략패턴
을 통한 테스트 구현 이외에는 어려움을 크게 겪지 않았다.
이번 미션은 미리미리 해놓아서 16번째로 PR을 날릴 수 있었다. 사실 더 빨리 날릴 수 있었는데 설정 잘못해서 조금 늦어졌다. 한자리수에 못들어가서 아쉽다.
다른사람들의 코드리뷰를 하면서 코드 잘짜는 사람들이 되게 많다는 생각이 들었다. 내 코드를 보여주는 것은 좀 부끄러운데 다른사람들 코드 보면서 리뷰 남기는건 재밌었다.
서로 코드리뷰를 하면서 많이 배울 수 있는것 같다.
2주차 미션
https://github.com/woowacourse-precourse/java-racingcar-6/pull/16/files
미션을 마치고 예전에 했던 코드를 보는데 그래도 그때보다 코드가 개선되긴 한 것 같다.
https://github.com/woowacourse/java-racingcar/compare/main...dradnats1012:java-racingcar:step1