- 컴퓨터의 숫자를 랜덤하게 정한다.
-
플레이어의 숫자를 입력받는다.
- 숫자를 입력받는다.
- 문자열 타입의 숫자를 리스트로 변환한다.
- 입력값을 검증한다.
- 입력된 문자열이 비어있지 않은지 검증한다.
- 입력된 문자열의 길이가 3인지 검증한다.
- 입력된 문자열이 정수인지 검증한다.
- 입력된 문자열이 양의 정수인지 검증한다.
- 입력된 정수들의 범위가 1부터 9인지 검증한다.
- 입력된 정수들이 서로 다른 수인지 검증한다.
- 입력값이 부적절한 경우, 예외를 반환한다.
-
플레이어가 입력한 숫자와 컴퓨터의 숫자를 비교한다.
- 플레이어가 입력한 각 숫자가 컴퓨터의 숫자에 있는지 확인한다.
- 플레이어가 입력한 숫자와 위치를 비교한다.
- 숫자 비교에 따라 힌트를 결정한다.
- 플레이어가 입력한 각 숫자가 컴퓨터의 숫자에 있는지 확인한다.
-
결정된 힌트를 출력한다.
-
플레이어가 숫자를 맞추지 못한 경우, 다시
게임 준비로 돌아가 숫자를 입력받는다. -
플레이어가 3개의 숫자를 모두 맞췄다면 게임을 다시 시작할 지, 종료할 지 결정한다.
- "1"을 누르면 게임을 다시 시작, "2"를 누르면 게임을 종료한다.
- 숫자 비교에 따른 힌트 설정 로직을 간소화하고 성능을 향상시킨다.
- for문을 stream 메소드를 사용하여 간소화한다.
- Hint 클래스 관련 힌트 목록을 Enum으로 분리한다.
- 입력값 검증 시의 검증 조건들을 Enum으로 분리한다.
- 입력값 검증 시 발생하는 예외의 목록을 Enum으로 분리한다.
- View 계층에서 출력하는 메시지의 목록을 Enum으로 분리한다.
- Player 클래스의 getter 및 setter를 제거하고 비즈니스 로직을 도메인 내에 구현한다.
- Player 클래스의 setter를 제거하고 생성 시에만 필드 변수값을 정할 수 있도록 한다.
- Player 클래스의 getter를 제거하고 비즈니스 로직을 도메인 내에 구현한다.
- ViewService의 기능을 InputView와 OutputView로 각각 분리한다.
- NumberService와 InputView, OutputView에 싱글톤 패턴을 적용한다.