src/main/java/racingcar/domain/Attempt.java
package racingcar.domain;
public class Attempt {
원시값을 포장하여 유의미한 객체를 만드셨네요👏
다만 해당 객체에서 시도 횟수의 경우 음수는 불가능한 것으로 보이는데, 요 부분에 대한 Validation과 테스트도 함께 추가해주면 좋을 것 같아요.
→ Input 에서 사용자 입력에 대한 검증을 거친 후 시도 횟수 객체를 생성합니다. 입력에 대한 검증을 지나와도 객체 생성 시 별개의 검증 과정을 거치는 것이 좋을까요?
리뷰어님께서 피드백해주신 상수화의 기준에 대해 고민해보았습니다. 피드백을 받기 전에는 언제 어떤값을 수정할지 모르니 모든 값을 상수화해야한다
라고 생각했습니다. 리뷰어님께 지적을 받고 상수화 기준에 대해 고민해보았고 제 나름의 결론을 내렸습니다.
문자열일 경우 → 재사용성
문자열을 사용하는 경우를 크게 두 가지로 생각했습니다. 첫번째는 이번 과제처럼 안내문(또는 경고문)
을 띄우는 경우, 두번째는 프로그램에서 자주 사용되는 특정 단어
입니다. 안내문의 경우 동일한 경우가 거의 없으므로 굳이 모든 문자열을 상수화하지 않아도 된다고 판단하여 그에 맞게 코드를 수정하였습니다. 특정 단어는 재사용성의 가능성이 있기에 상수화하는 것이 맞다고 생각했습니다. 이번 과제에는 포함되지 않아 수정하지 않았습니다.
숫자일 경우 → 현재 프로그램에 귀속되는지의 여부
음수임을 판단하는 메소드를 구현한다 가정했을 때 제가 작성하는 코드는 입력받은 값이 0보다 작은지 확인하는 코드일 것입니다. 여기서 숫자 0은 이미 메소드가 음수인지 판단
을 하는 역할이 확정되어 있기 때문에 값이 변경될 가능성이 없어 상수화를 하지 않아도 된다 생각합니다. 이번 과제에서 등장하는 0에서 9까지의 값 중 3 초과
의 경우 랜덤 첫 값 0, 마지막 값 9, 기준이 되는 3은 구현하는 프로그램이 발전함에 따라 수정될 가능성이 있다고 판단하여 해당 값들은 상수화를 하였습니다.
여러 클래스 내에서 사용하는 경우 → Enum 클래스 고려
현재 구현하는 자동차 경주 미션에는 필요가 없어 추가하지 않았으나 현재 프로그램에 한해 여러 클래스에서 필요한 값이라면 Enum 클래스를 사용해도 좋을듯합니다. 예시로, 프리코스 최종 코딩테스트에서 진행했던 페어 매칭 프로그램 구현 에서 코스 타입(백엔드, 프론트엔드), 레벨 타입(레벨1~레벨5) 등 클래스에 구분하지 않고 사용하는 값의 경우에는 별도의 클래스로 분리하여 관리하는 것이 좋다고 생각합니다!
테스트 시 입력에 대한 테스트가 필수였는데 Input
에서 입력 및 검증을 모두 맡다보니 제가 테스트 해야하는 메소드들은 private 으로 선언되어 테스트를 할 수 없었습니다. 그러자 프리코스 때 작성했던 코드가 생각나 참고하였습니다. 바로 Input
과 Validator
를 분리하는 것입니다. 프리코스 당시에는 클래스를 모두 분리해야 한다! 에 사로잡혀 의미도 모르고 분리했었다면, 이번에는 나름의 기준이 있습니다. 클래스도 하나의 역할만을 하도록 분리하는 것이 맞다고 생각되고 테스트를 위해 입력값을 검증하는 메인 메소드를 public으로 만들기 위해 분리하는 것이 불가피하다 느꼈습니다... 를 좀 더 이쁘게 풀어쓰기ㅠ