- 프로그램 실행
- 3자리 난수 생성 (중복 x)
- 사용자 입력
- 입력값 유효성 검증
- 심판이 볼, 스트라이크 확인
- 볼, 스트라이크 출력
- 게임 종료 조건 확인
- 프로그램 종료 여부 선택
- (종료를 선택했다면) 프로그램 종료
- "숫자를 입력해주세요 : " 출력
- 콘솔 사용자 입력
- 입력값을 모델에 저장(List)
- 게임 추가 진행 여부 입력
- ⚠ 예외: 사용자 입력값 검증 (IllegalArgumentException)
- 숫자를 입력하지 않은 경우
- 입력 길이가 3이 아닌 경우
- 게임 종료 후 추가 진행 여부에서의 입력값 검증
- 결과값 출력 (볼, 스트라이크, 낫싱)
- 결과 메시지 생성
- 정답을 맞췄을 시 "3개의 숫자를 모두 맞히셨습니다! 게임 종료" 출력
- 게임을 계속 진행할 것인지에 대한 여부 출력
- 게임 종료 메시지
- 중복없는 3자리 난수 생성
- 생성한 난수를 모델에 저장(Set)
- 숫자만 맞춘 경우
n볼
- 숫자와 자리를 모두 맞춘 경우
n스트라이크
- 숫자와 자리 하나도 맞추지 못한 경우
낫싱
- 숫자와 자리 모두 맞춘 경우 ➡ 게임 세트 종료
- 게임이 끝난 후, 추가 게임 진행 여부 확인
- 게임 상태 정보 초기화
- 게임 중에는 컴퓨터 숫자를 유지하고, 새 게임이 시작될 때 새로 생성
- ConfirmType: 게임이 종료된 후, 게임 추가 진행 여부를 상수로 저장
- GameStatus: Ball과 Strike의 개수를 저장하는 상수
- RandomNumber: 난수 Set 을 포장
- UserNumber: 유저가 입력한 숫자 List 를 포장
- InputView: 입력 및 입력값에 대한 유효성 검증 역할
- OutputView: 출력 역할
- BaseballGame: 전체적인 게임 진행 역할
- Referee: RandomNumber와 UserNumber를 비교하여 Ball과 Strike 개수를 판단하고, 이를 모델에 저장
- RandomNumberGenerator: 3자리 난수 Set을 생성
- ResultMessageGenerator: GameStatus를 이용하여 Ball과 Strike 개수를 바탕으로 출력할 문자열 생성
- 메서드 분리. depth 1 유지
- else 예약어 제거
- 비정상적인 메서드 분리가 많음. 자연스러운 흐름으로 고쳐볼 것.
- 중복을 제거
- 람다와 스트림을 사용
- invalid input 을 받으면 메시지를 출력하고 계속 게임 진행
- Exception Enum으로 예외와 예외 메시지 리터럴을 관리
- MVC 패턴 5대 규칙을 준수
- 객체지향 개념을 적용
- 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만 한다.
- 규칙 2: else 예약어를 쓰지 않는다.
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 4: 한 줄에 점을 하나만 찍는다.
- 규칙 5: 줄여쓰지 않는다(축약 금지).
- 규칙 6: 모든 엔티티를 작게 유지한다.
- 규칙 7: 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- 규칙 8: 일급 콜렉션을 쓴다.
- 규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.