들어가기 전
내 마음대로 구현해봤던 숫자 야구 게임 구현하기 1편에 이어, 박재성님의 피드백 강의를 듣고 느낀점과 TDD 방식으로 개발하면서 느낀점을 정리해보려고 한다.
피드백 강의를 통해 배운 것
TDD 관련
- 테스트 코드 작성은 잘 정리된 요구사항을 기반으로 할 때 수월하다.
- DB, UI, 랜덤값 등과 같이 테스트하기 어려운 부분보다는 util성 메서드, input/output 명확한 것 등 테스트하기 쉬운 영역부터 해나가는 것이 좋다.
- 큰 단위로 TDD를 하려고하기 때문에 힘든 것이다. 최대한 작은 단위로 쪼개보자.
- 테스트하기 어려운 영역과 테스트하기 쉬운 영역을 분리(격리)할 수 있어야한다.
도메인 모델 관련
- 나는 게임에 참여하는 주체인
Player
,Opponent
등에 초점을 맞췄었다. - 강의에서는 게임의 참여하는 주체가 아닌, 야구 게임에서 활용되는 숫자에 초점을 맞췄다.
- 즉, 하나의 숫자를
Ball
객체로, 여러 개의 숫자를Balls
객체로 바라보았다.
- 즉, 하나의 숫자를
- 같은 애플리케이션을 어떤 관점에서 보는지에 따라 완전히 다른 설계가 가능하다는게 흥미로운 것 같다.
기타
- 데이터를 가져와서 무언가 하려고하지 말고, 해당 데이터를 갖고있는 객체에게 메시지를 전달하는 방식으로 하자.
- 요구사항 분석을 통해 대략적인 설계 : 객체 추출
- UI, DB 등과 의존관계를 가지지 않는 핵심 도메인 영역 집중 설계
TDD로 구현해보기
1~4번을 반복하면서 개발한다.
- 요구사항을 기반으로한 테스트 코드 작성
- 컴파일 에러 해결
- 테스트 케이스를 어떻게든 통과하도록 로직 작성
- 리팩토링
요구 사항 정리
기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.
- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
- e.g. 상대방(컴퓨터)의 수가 425일 때, 123을 제시한 경우 : 1스트라이크, 456을 제시한 경우 : 1볼 1스트라이크, 789를 제시한 경우 : 낫싱
- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
느낀점
- 요구사항이 있어도 어떤 것 부터 테스트코드로 작성해야 할지 잘 모르겠다.
- 일단 작은 단위부터 테스트 하자.
- 예를 들어 아래와 같은 기능을 구현해야 한다면, 숫자 하나씩 있는 것 부터 도전해보자.
1 2 3 4
com = Balls(Arrays.asList(1,2,3)); user = Balls(Arrays.asList(1,3,2)); com.play(user); // 1 strike, 2 ball
- 강의로 볼 땐 수월해보였는데 막상 혼자 하려니 막막하다.
- 스스로 고민도 많이 해보고 꾸준한 연습이 필요할 것 같다.
- 커밋 단위를 잘 조절하자. 하다보니 커밋하지 않고 너무 많은 코드를 작성했다.