숫자 입력 및 스트라이크/볼 판정 로직 구현 (Not passed test yet)#3
숫자 입력 및 스트라이크/볼 판정 로직 구현 (Not passed test yet)#3SHINSEOJIN wants to merge 2 commits intoLikeLion-Study:masterfrom
Conversation
UiHyeon-Kim
left a comment
There was a problem hiding this comment.
2주 차 과제도 진행하시느라 고생하셨습니다~
다만 1주 차 과제에 비해 크게 바뀐 점이 없어 조금 아쉬운 감이 있어요.
이번 코드 리뷰를 참고하시고 수정해 본다면 큰 성장을 할 수 있을 거라고 생각해요.
일단 무작정 구현을 시작하기보다, 하루 이틀 정도 과제 요구사항을 읽고 어떤 기능이 필요한지, 어떤 흐름으로 진행 되어야 할지, 예외는 어떻게 처리하고 어떻게 구현해야 할지 고민해보면 좋을 것 같아요.
혹시 도움이 필요하거나, 나중에 수정하고 다시 코드 리뷰가 필요하시다면 디스코드에 남겨주세요
| - 1~9 사이의 서로 다른 숫자 3개를 랜덤으로 생성 | ||
| - 사용자가 숫자 3자리를 입력하면 결과를 출력 | ||
| - 스트라이크, 볼, 미스 판정 | ||
| - 정답을 맞추면 게임을 재시작하거나 종료할 수 있음 |
There was a problem hiding this comment.
과제 진행 요구사항에 아래와 같은 요구 사항이 있어요.
기능을 구현하기 전README.md에 구현할 기능 목록을 정리합니다.Git의 커밋 단위는 앞 단계에서README.md에 정리한 기능 목록 단위로 추가합니다.
현재 작성하신 기능 목록에 맞춰 해당 기능을 구현한 후 이를 커밋해 보면 어떨까요?
지금은 혼자 개발하셔서 크게 상관없을 수 있지만, 나중에 팀 프로젝트를 진행할 때 큰 도움이 될 거예요.
각 기능마다 구현한 후 커밋을 하면 무슨 기능이 구현되었는지 쉽게 파악할 수 있고, 어떤 코드에 에러가 있다면 그 시점으로 되돌아갈 수도 있어요.
그 외에 다양한 git 기능들이 많으니 이번에 수정할 때나 다음 과제부터 적용해보면 좋을 것 같아요.
우선은 기능마다 커밋하는 것에 익숙해지면 다음엔 좀 더 자세히 커밋하는 방법을 알려드릴게요.
| List<Integer> user = new ArrayList<>(); | ||
| for (int i = 0; i < 3; i++) { | ||
| user.add(input.charAt(i) - '0'); | ||
| } |
There was a problem hiding this comment.
사용자의 입력에 대한 예외 처리가 안되어 있어요.
기능 요구 사항 중 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 합니다. 라는 요구 사항이 있는데, 이 부분을 놓치신 것 같아요.
원활한 프로그램 실행을 위해 예외 처리는 필수로 해주시는 것이 좋아요.
참고할만한 예외 처리로는
- 사용자 입력이 3자리여야 한다.
- 입력에 문자가 입력되면 안된다.
- 랜덤 숫자 값은 1~9 이므로 0이 입력되면 안된다.
- 랜덤 숫자는 중복 값이 없으므로 중복 숫자 입력에 대한 예외처리.
등을 생각할 수 있겠네요.
| System.out.print("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요: "); | ||
| int choice = sc.nextInt(); | ||
| if (choice == 2) { | ||
| System.out.println("게임을 종료합니다."); |
There was a problem hiding this comment.
전체적으로 모든 출력이 붙어있어 가독성이 좋지 않은 것 같아요. print에 \n 또는 System.out.println()를 한 줄씩 포함해 출력에 가독성을 챙겨주는 것도 좋다고 생각해요
| } else { | ||
| break; | ||
| } | ||
| } |
There was a problem hiding this comment.
여기서 말하는 내용은 아직 어려울 수 있으나, 추후 팀 프로젝트를 원활하게 진행하려면 알아둘 필요가 있는 내용이니 참고하시고 공부해 보시면 좋을 것 같아요.
프로그래밍 요구사항에 프로그램 실행의 시작점은 Application의 main() 입니다. 라는 요구사항이 있어요.
그리고 객체지향 원칙(OOP)에서 단일 책임 원칙(SRP)이라는 것이 있어요.
위 두 문장을 보면 Application의 main() 함수는 프로그램을 실행하는 역할을 수행해요.
즉, 25번 라인부터 49번 라인의 숫자 판별 및 출력까지 하는 역할과,
54번 라인부터 66번 라인까지의 랜덤 숫자를 생성하는 역할,
그리고 모든 입력과 출력의 역할까지 맡기에는 Application 클래스와 main 함수에 책임이 과다한 게 됩니다.
25번 라인부터 49번 라인은 실제 야구로 치면 심판이 하는 역할이죠? 숫자 야구로 보면 게임의 룰이 된다고 볼 수 있죠.
그럼 BaseballJudge나 GameRule 이라는 클래스가 해당 기능들을 맡으면 좋을 것 같단 생각이 들어요.
굳이 왜 그래야하지? 라고 생각이 들 수 있는데, 현재 과제는 쉬운 편이고 이에 대한 코드도 짧은 편이에요.
그런데 코드가 길어지고(최소100 라인 이상) 역할들이 다양해 진다면 하나의 파일에서 코드를 찾기도 힘들고, 어떤 기능이 어디에 있고 어떻게 실행되는지 한 눈에 파악하기가 어려워요.
추후 팀 프로젝트를 진행할 때 모든 기능을 한 파일에 때려 박는다면 리팩토링 하기도, 유지보수 하기도, 재사용 하기도 힘들 거예요. 현재 과제가 어렵게 느껴지실 수도 있지만 팀 프로젝트에 비하면 훨씬 쉬운 편이니 한 번 생각해보시고 학습해 본다면 크게 성장할 수 있을 거예요.
There was a problem hiding this comment.
한번 브랜치를 새로 따서 말씀주신 사항 반영해보려 했는데, 시간 괜찮으시다면 이것도 한번 확인 부탁드릴게요..!! (shinseojin.ver2)
There was a problem hiding this comment.
이전보다 훨씬 보기 좋아졌네요. 각 함수 명에 맞는 기능만 잘 넣은 것 같아요.
현재는 이정도로 발전한 것도 충분하다고 생각하고, 어떻게 기능을 분할해야 하는지에 대해 익숙해지는 것이 먼저라고 생각해요.
그래도 혹시 욕심이 있다면 static, 파일 분리 등 다음으로 알아두면 좋을 내용도 알려드릴게요~
리팩터링 고생하셨습니다!
사용자 입력 기능 추가 랜덤 숫자 생성 기능 구현 스트라이크/볼 판정 로직 추가 테스트는 아직 통과하지 않았습니다. 추후 수정 예정입니다.