- 저장소: https://github.com/yoondgu/java-racingcar/tree/step1
- 코드리뷰 진행 PR: https://github.com/woowacourse/java-racingcar/pull/452
기능 요구사항
- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4 이상일 경우 전진하고, 3 이하의 값이면 멈춘다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
구현하며 고민한 내용
- 랜덤값을 어디에서 생성할 것인가?
- Car 내부에서 생성하는 대신 외부에서 전달받도록 함.
- 인터페이스를 사용해 NumberGenerator 기능을 추상화했다.
- 필요에 의해 구현한 것인데, 이런 방식을 디자인 패턴에서는 전략 패턴이라고 부른다는 것을 알게 되었다.
- 테스트가 용이한 방식이라는 점에서 장점을 느꼈다.
- Car 내부에서 생성하는 대신 외부에서 전달받도록 함.
- 전진하는지, 정지해 있는지 알 수 없는 메서드 괜찮은가?
- Car 객체가 전진하는지, 정지해있는지 알 수 없는 메서드를 만들고 싶지 않았다.
- 따라서 한 칸 전진시키는 move() 메소드만 정의하고 RacingGame에서 이 메서드를 호출하거나 호출하지 않도록 함
- 검증 로직을 어느 곳에서 처리할 것인가?
- 데이터 타입 외에는 도메인 기능에서 모두 검증하도록 통일
- MVC 패턴의 적용
- 뷰 역할을 하는 UI 기능 코드와 모델 역할을 하는 도메인 기능 코드가 서로 모르도록 함.
- 이로 인해 컨트롤러의 책임이 커짐
코드리뷰에서 배운 것들
- TODO 리스트가 자세하고, 요구사항과 예외 케이스를 상세하게 적어주어 보기 편했다.
- 이 리뷰 덕분에 이후에도 살아 있는 문서 작성에 신경 쓰려고 했다.
- 이 리뷰 덕분에 이후에도 살아 있는 문서 작성에 신경 쓰려고 했다.
- Controller가 View와 Domain을 연결하는 역할을 잘 수행하고 있다. 그보다는 도메인인 RacingGame 클래스가 너무 많은 책임을 가지고 있지 않은지 확인해 보자.
- 일급 컬렉션으로 클래스 분리: position 정보를 가지고 있는 것은 Car이니 Cars가 스스로 우승자를 알 수 있다.
- 변수명은 되도록 의미 있는 것을 사용하자!
- 단순 오버라이딩으로 Intellij를 통해 자동 작성된 코드의 경우에도 주의하기.
- 매직 넘버는 상수로 치환하자.
- "전달받은 위치 값에 + 1을 더한 만큼 출력하는 코드"에 대해서 의도가 더 명확하게 보이기 위해서 어떻게 바꾸면 좋을지 고민해 보자.
- 미션 당시에는 리뷰어께 의도만 설명해 드리고, 더 깊게 고민하지 않았다.
- 지금 다시 리팩토링을 한다면 + 1을 하는 값도 의미 있는 이름을 가지는 상수(ex. PRINT_COUNT_ADDING_VALUE)로 정의할 것 같다.
- 반복문 대신 stream으로 가독성을 개선할 수 있을 때 적절히 사용해 보자.
- 불확실한 것과 확실한 것을 분리하면 코드에 대한 안정성이 많이 확보된다.
- 여러 요소들을 테스트하고 있다면 테스트코드를 분리해 보는 것도 좋다.
- 테스트 코드의 given-when-then 형식 찾아보기
- 예외 테스트에서 Exception의 message도 비교해 주면, 어떤 원인에 의한 예외인지 더 정확히 테스트할 수 있다.
- 파일 끝에는 POSIX 표준에 따라 개행문자가 들어가야 한다.
반응형
'우아한테크코스 > 미션 기록' 카테고리의 다른 글
[레벨1] 블랙잭 2단계 - 베팅 (0) | 2023.04.08 |
---|---|
[레벨1] 블랙잭 1단계 - 블랙잭 게임 실행 (0) | 2023.04.08 |
[레벨1] 사다리 타기 2단계 - 사다리 게임 실행 (0) | 2023.04.07 |
[레벨1] 사다리 타기 1단계 - 사다리 생성 (0) | 2023.04.07 |
[레벨1] 자동차 경주 2단계 - 리팩터링 (0) | 2023.04.07 |