회고

[우테코] 프리코스 2주차 - 숫자 야구 게임 회고록

COBI-98 2023. 1. 1. 18:58

 

https://www.woowahan.com/

 

배달의 민족 운영사인 우아한형제들에서 운영하는 개발자 양성 프로젝트, 우아한테크코스에 지원하게 되었다.

22년에 일정이 변경되어 우아한테크코스의 프리코스를 경험하게 된 것은 나에게 정말 뜻 깊은 경험이었다.

우아한테크코스 프리코스과정에  2주차의 내가 시간을 많이 투자한 부분과 느낀점, 부족한점을 작성하는 회고록이다.

 

🔎 1주차 피드백 정리

이름을 통해 의도를 드러낸다, 축약하지 않는다.

  • 변수, 이름, 함수(메서드), 클래스 이름을 짓는데 연속된 숫자나 불용어를 추가하는 방식을 사용했었다. 나와 다른 개발자 클래스의역할에 대한 의도를 드러내기위한 중요한 활동이므로 적절하지 못했다!

공백도 코딩 컨벤션이다, 공백라인을 의미있게 사용한다.

  • 공백 라인을 의미 있게 사용하는 것이 좋아 보이며, 문맥을 분리하는 부분에 사용하는 것이 좋다.
  • 과도한 공백은 다른 개발자에게 의문을 줄 수 있다.
  • if, for, while문 사이의 공백도 코딩 컨벤션!


📌 미션에 들어가기 전 목표

  • 기능 목록을 상세히 나누기
  • 함수를 더 분리하는 과정
  • 함수별로 테스트를 작성하는 것
같은 수가 같은 자리에 있으면 스트라이크, 
다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 
그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
예) 상대방(컴퓨터)의 수가 425일 때
123을 제시한 경우 : 1스트라이크
456을 제시한 경우 : 1볼 1스트라이크
789를 제시한 경우 : 낫싱
위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 
컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 
게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고,
컴퓨터는 입력한 숫자에 대한 결과를 출력

 

👀 주어진 요구 사항 정리

  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현
  • 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게
  • 3항 연산자를 쓰지 않는다.
  • JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인
  • IllegalArgumentException
  • pickNumberInRange()
  • readLine()

✔  기능 구현 목록 작성

-숫자 랜덤 생성
1부터 9까지의 숫자
3자리 자연수
각 자리 숫자는 중복 x

-사용자 입력
[예외사항] 3자리의 자연수가 아닌경우
[예외사항] 1부터 9까지의 숫자가 아닌경우
[예외사항] 각 자릿수의 숫자중 중복된 값이 있는 경우
[예외사항] 0이하의 음수의 경우
예외사항의 경우 IllegalArgumentException을 발생시키고 종료

-사용자 입력과 랜덤 생성 숫자 비교
같은자릿수에 같은 수 : 스트라이크
다른자릿수에 같은 수 : 볼
다른자릿수에 다른 수 : 낫싱

-비교 결과 출력
볼, 스트라이크 카운트 후 출력
출력순서 : (x)볼 (y)스트라이크
y가 3이 아닌경우 2.사용자입력 으로 전환
(y=3) 3스트라이크 시 게임 종료 문구 출력

-종료 조건 입력
1 입력 재시작 : 1.숫자 랜덤 생성으로 전환
2 입력 종료 : 게임 종료
[예외사항] 1과 2의 숫자가 아닌 잘못된 값을 입력할 경우

 

💻 기능 구현

MVC 모델 적용기

baseball
	controller
    	BaseballGame (Model과 View를 결정하여 전달)
    model
    	ComputerNumber (게임을 위한 숫자 랜덤 생성) 
        PlayerNumber (사용자 숫자 생성) 
        RetryNumber (재시작 생성)
    util
    	NumberComapare (비교 후 볼, 스트라이크 카운트 저장)
        Validator (사용자 입력과 랜덤 생성 숫자 비교를 위한 검증자 생성)
    view
    	InputView  (사용자 입력 클래스)
        OutputView (출력 클래스)

 

🎯 고민한 과정, 회고

- MVC 모델을 적용하는 부분에서 클래스를 정확히 나누었는가?
Validator, RetryNumber의 이름과 위치에 대해서 고민했던 것 같다. 

-  상수로 선언되는 부분을 그대로 하드코딩한 부분 다음과 같이 진행했어야 했을것 같다.

private static final int MIN_RANDOM_NUMBER = 1;
private static final int MAX_RANDOM_NUMBER = 9;
private static final int MAX_NUMBER_LENGTH = 3;


- Java 코드 컨벤션 규칙을 어기면서 하고있진 않나 코드를 작성하면서 계속 고민을 많이했지만 상수로 선언되는 부분, 지역변수 선언, 코드작성 순서 등  요구 사항을 만족하지 못했던 것 같다.

고민한 과정과 코드들을 보고 다시 주어진 세가지 요구사항을 다시 확인하니 주어진 요구사항이 어떠한 이유로 주어진 것인지 의도를 파악하는데 노력을 많이해야할 것 같은 생각이 들었다.
주어진 요구사항들이 결국 미션에 들어가기 전 목표를 달성하기위한 방향을 나타내고있다고 생각한다. 
다음 회차때도 주어진 요구사항을 꼼꼼히 읽고 다른 관점에서 본다면 다른 의도가 있는지 시간을 많이 투자해야할 것 같다.

 

🚩 다음 목표

  • 테스트 코드를 사용해 구현 기능마다 확인하고 넘어가기
  • MVC 모델 공부
  • Java 코드 컨벤션 공부

 

🐣 [구현 코드 보러가기]

https://github.com/COBI-98/java-baseball/tree/EUNSH1

 

GitHub - COBI-98/java-baseball: 숫자 야구 게임 미션을 진행하는 저장소

숫자 야구 게임 미션을 진행하는 저장소. Contribute to COBI-98/java-baseball development by creating an account on GitHub.

github.com