[자동차 경주] 코드
2주차 과제를 진행한 repo 주소이다.
https://github.com/Dreaming-J/java-racingcar-6/tree/Dreaming-J
2주차 회고
이번 과제에서는 크게 2가지가 중심으로 다가왔다.
바로 "클래스의 역할 분리", "기능 요구 사항의 해석"이다.
클래스의 역할 분리
자동차 경주를 위해 어떻게 역할 분리를 할 것인지에 대한 고민을 많이 했다.
처음에는 자동차와 경기장으로만 객체를 분리했었다가, 우승자를 선정하는 것은 경기장에서 진행하는 것이 이상하다고 생각이 들어 새로운 경기 결과 객체를 생성했다.
하지만 경기장에서 경기 결과를 내는 것이 코드 짜기가 수월했고 일단은 경기장에서 우승자를 가리도록 했다.
이렇게 짜고 보니 책임이 제대로 배분된 것이 아니라는 생각에 계속 찝찝해 고민을 거쳐 경기 결과에서 제대로 우승자를 가릴 수 있도록 리팩토링을 진행해주었다.
그리고 각 라운드별 경주 또한, 처음에는 Controller에서 진행했었다.
이유는 race 메서드를 입력된 라운드 수만큼 반복해야 하는데 그건 메서드가 너무 많은 일을 한다고 생각했기 때문이었다.
당연히 컨트롤러에서 각 라운드를 반복해서 시키는 책임이 없다고 생각했고, 고민 끝에 제대로 경기장이 라운드 진행에 책임을 질 수 있도록 리팩토링을 했다.
기능 요구 사항의 해석
처음에는 크게 신경쓰지 않았던 부분이지만 코드를 다 짠 후에 깊게 고민하게 된 부분이다.
라운드의 최솟값, 중복된 참가자, 공백의 참가자 등 상세하게 적혀 있지 않는 부분에 대해서 어떻게 할 것인지 고민을 했다.
이 애플리케이션이 실제로 런칭되어 운영한다고 했을 때를 생각하니 비교적 쉽게 결정을 지었다.
실제로 런칭된다면, 자동차 경주에 1라운드 미만으로는 경주가 성립되지 않기에 라운드의 입력 값에 최소 1로 결정했다.
그리고 참가자의 이름도 공백으로 참가할 수 없도록 trim 메서드를 활용해 공백으로만 참가하는 참가자를 걸렀다.
마지막으로 동명이인 참가자는 "pobi-1", "pobi-2" 같은 식으로 해결할까 고민하다, 이번 경주에서는 동명이인은 불가능하도록 처리했다.
아무리 그래도 과제에서 주어진 요구 사항인 이름은 5자 이하여야 한다는 것을 어기고 싶지 않아서 이렇게 결정했다.
만약 실제 프로젝트를 진행한다면 클라이언트에게 동명이인은 어떻게 처리하는 것이 좋을 지 물어보고 싶어지는 고민이었다.
1주차 돌아보기
1주차의 경험 덕분에 이번 과제는 스스로 만들기를 잘 수행했다.
1주차때는 자바가 어색해져서 과거의 코드를 보며 거의 베끼다싶이 했었다.
하지만 신기하게도 머슬 메모리인건지 코드를 치는 것이 순식간에 익숙해져서 이번에는 과거의 코드를 보지 않고 스스로 만들기에 성공했다.
이번 자동차 미션 또한 작년에 혼자 연습삼아 풀어봤던 과제였지만 과거의 코드는 아예 보지 않고 진행했다.
그 덕분에 더 나다운 코드를 짤 수 있었다고 생각이 들었다.
그리고 이번에 처음으로 코드 리뷰를 2번씩 주고받았다.
확실히 나의 코드는 이미 나에게 너무 익숙해서 편해보이지만 처음보는 상대방에게는 그렇지 않다는 것을 느꼈고, 그로 인해 내가 보지 못한 시야를 준다는 것을 깨달았다.
3주차 다짐
- 피어리뷰하기!
- 기능 테스트를 위한 구조 고민해보기!