학습 목표 : 넥스트스텝 강좌 중 TDD 교육을 들으면서 앞으로 매주 코딩 연습을 하고자 한다.
2️⃣ 숫자야구게임 구현
기능 요구 사항
기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.
- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
- e.g. 상대방(컴퓨터)의 수가 425일 때, 123을 제시한 경우 : 1스트라이크, 456을 제시한 경우 : 1볼 1스트라이크, 789를 제시한 경우 : 낫싱
- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게 임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
실행 결과
숫자를 입력해 주세요 : 123
1볼 1스트라이크
숫자를 입력해 주세요 : 145
1볼
숫자를 입력해 주세요 : 671
2볼
숫자를 입력해 주세요 : 216
1스트라이크
숫자를 입력해 주세요 : 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료
게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
1
숫자를 입력해 주세요 : 123
1볼 1스트라이크
…
위 내용에 맞춰 1차 코딩을 진행함
깃 링크 : https://github.com/ess234/java-baseball-precourse/tree/develop/src/main/java/baseball
TDD에 대한 기본 개념 없이 작성한 코드이며 이 코드를 리팩토링하고자 한다.
TDD 개념 설명
1. TDD는 단위테스트와 다르며 테스트 코드를 프로덕션 코드보다 먼저 작성해야 된다.
-> 리팩토링 과정이 포함되어 있기 때문임
2. TDD를 잘 하려면 todo 리스트를 잘 작성되어야 한다.
TDD를 하는 이유는 디버깅 시간을 줄일 수 있고, 동작하는 문서 역할을 대신함
가장 중요한 포인트는 리팩토링이나 코드를 변경하는데 두려움을 없애준다.
TDD 작성 리사이클
1) 실패하는 테스트를 구현한다.
2) 테스트가 성공하도록 프로덕션 코드를 구현한다.
3) 프로덕션 코드와 테스트 코드를 리팩토링한다.
TDD 원칙
원칙 1 - 실패하는 단위 테스트 작성 시 프로덕션 코드를 작성하지 않는다.
원칙 2 - 컴파일을 실패하지 않으면서 실행이 실패하는 테스트 코드를 작성한다.
원칙 3 - 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
설계를 위해 도메인 기반으로 구현하고자 하는 기능을 생각해보자 한다.
TDD를 적용할 경우 자연스레 DDD 또한 적용한다는 의미가 설계에서 적용되기 때문임을 알 수 있다.
먼저, 숫자 야구게임을 구현하기 위해 MVC 기반으로 3가지 도메인을 유출해볼 수 있다.
=> 컨트롤러, 뷰, BaseBall, Balls, BallNumber
도메인 분리 후 테스트가 쉬운 영역과 테스트가 어려운 영역을 격리시킬 수 있어야 한다.
ex) 테스트가 어려운 부분 : 랜덤 값 생성
꼭 테스트가 어려운 영역을 TDD로 구현할 필요는 없다.
그리고 테스트 작성 시 경계값으로 테스트하는 것이 좋다.
1단계 Utill성 기능을 TDD로 도전해보자
2단계 테스트 가능한 부분부터 TDD로 도전해보자
-> 큰 기능을 작은 단위로 쪼개서 구현하고자 노력하자!!
-> 객체 필드에 직접 접근하기 보단 메세지를 통해 접근하도록 하자!!
ex ) if (this.ballNo == ball.ballNo) 보단 ball.matchBallNo(this.ballNo)가 더 가독성이 좋고 조건 수정 시 matchBallNo 메소드 내부만 수정하면 된다.
그리고 되도록 객체 인스턴스 변수에 직접 접근하지 않는걸 권장한다.
피드백 적용한 소스 코드
https://github.com/ess234/java-baseball-precourse/tree/apply-feedback/src/main/java/baseball
'IT > 자바' 카테고리의 다른 글
자바 플레이그라운드 with TDD, 클린코드 강좌 후기 Day 3 (0) | 2022.12.18 |
---|---|
자바 플레이그라운드 with TDD, 클린코드 강좌 후기 Day 2 (0) | 2022.11.27 |
[Effective JAVA] Item 16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2021.11.20 |
[Effective Java] Item 15 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2021.11.20 |
[Effective Java] Item 14 Comparable을 구현할지 고려하라 (0) | 2021.11.11 |