2008년 08월 14일
초보 개발자 코드 트레이닝, Part 4. TDD 수련 - 야구게임 2편
이전내용
GameNumber에 대한 값 검사 하는 부분을 추가했습니다.
테스트 내용은 "(1,2,10)으로 생성하면 에러를 보내야한다.. (1,2,1)을 생성성해도 마찬가지 에러를 보내야한다." 입니다.
테스트코드
@Test
public void checkNumberRange() {
boolean isCatch = false;
try {
new GameNumber(1,2,10);
} catch (RuntimeException e) {
e.printStackTrace();
isCatch = true;
}
assertTrue(isCatch);
}
@Test
public void checkNumberDuplicate() {
boolean isCatch = false;
try {
new GameNumber(1,2,1);
} catch (RuntimeException e) {
e.printStackTrace();
isCatch = true;
}
assertTrue(isCatch);
}
테스트코드가 좀 지져분합니다. 그냥 Exception을 주려고 했는데, 그렇게 되면 기존 GameNumber를 생성하는 부분에서는모두 에러 확인 처리를 해줘야하니 불편하다고 생각해 RuntimeException으로 작성했습니다. 아직 두개의 쓰임새가 머리에 쏙 와 닿지가 않네요. 좀 진행하다보면 차이점이 도출될 것 같습니다.(기존에도 RuntimeError를 많이 썼습니다. 그렇지만 이러면 강제성이 없어 script언어같다는 느낌이 들어요)
GameNumber
public GameNumber(int number1, int number2, int number3) {
numbers = new int[numberCount];
numbers[0] = number1;
numbers[1] = number2;
numbers[2] = number3;
for(int eachNumber : numbers) {
if(!(eachNumber > 0 && eachNumber < 10))
throw new OutOfRangeGameNumberException();
}
int idx = 0;
for(int eachNumber : numbers) {
int otherIdx = 0;
for(int eachOtherNumber : numbers) {
if(idx == otherIdx)
continue;
if(eachNumber == eachOtherNumber) {
throw new EachEqualNumberException();
}
otherIdx++;
}
idx++;
}
}
기존 코드에 추가된 부분은 과감히 파란색! 반복문안에 자꾸 반복문이 들어가 거스르긴 한데, 뭐 유한한 값이니 그렇다고 죄다 풀어서 비교하는 코드도 너무 Copy&Paste이잖아요.
테스트목록 정리
GameNumber에 대한 값 검사 하는 부분을 추가했습니다.
테스트 내용은 "(1,2,10)으로 생성하면 에러를 보내야한다.. (1,2,1)을 생성성해도 마찬가지 에러를 보내야한다." 입니다.
테스트코드
@Test
public void checkNumberRange() {
boolean isCatch = false;
try {
new GameNumber(1,2,10);
} catch (RuntimeException e) {
e.printStackTrace();
isCatch = true;
}
assertTrue(isCatch);
}
@Test
public void checkNumberDuplicate() {
boolean isCatch = false;
try {
new GameNumber(1,2,1);
} catch (RuntimeException e) {
e.printStackTrace();
isCatch = true;
}
assertTrue(isCatch);
}
테스트코드가 좀 지져분합니다. 그냥 Exception을 주려고 했는데, 그렇게 되면 기존 GameNumber를 생성하는 부분에서는모두 에러 확인 처리를 해줘야하니 불편하다고 생각해 RuntimeException으로 작성했습니다. 아직 두개의 쓰임새가 머리에 쏙 와 닿지가 않네요. 좀 진행하다보면 차이점이 도출될 것 같습니다.(기존에도 RuntimeError를 많이 썼습니다. 그렇지만 이러면 강제성이 없어 script언어같다는 느낌이 들어요)
GameNumber
public GameNumber(int number1, int number2, int number3) {
numbers = new int[numberCount];
numbers[0] = number1;
numbers[1] = number2;
numbers[2] = number3;
for(int eachNumber : numbers) {
if(!(eachNumber > 0 && eachNumber < 10))
throw new OutOfRangeGameNumberException();
}
int idx = 0;
for(int eachNumber : numbers) {
int otherIdx = 0;
for(int eachOtherNumber : numbers) {
if(idx == otherIdx)
continue;
if(eachNumber == eachOtherNumber) {
throw new EachEqualNumberException();
}
otherIdx++;
}
idx++;
}
}
기존 코드에 추가된 부분은 과감히 파란색! 반복문안에 자꾸 반복문이 들어가 거스르긴 한데, 뭐 유한한 값이니 그렇다고 죄다 풀어서 비교하는 코드도 너무 Copy&Paste이잖아요.
테스트목록 정리
- 게임숫자는 3자리이다.
- 숫자의 범위는 1부터 9까지이다.
- 각자리의 숫자는 중복될수 없다. -> 하나 추가했습니다.
- 숫자를 비교할수 있어야한다. (같다와 다르다를 알수 있어야한다.)
예)1,2,3 == 1,2,3, 1,2,4 != 1,3,4 - 숫자들의 비교결과를 상세히 알수 있어야한다..(strike, ball, hit, out)
- 특정 시도 횟수 내에 맞출수도 있고, 아웃이 될수도 있다. 다시 게임을 하면 이전에 생성한 숫자는 쓸수 없다.
숫자를 다시 생성할때 이전 기록과 중복여부를 판단하고 같다면 다시 생성한다. - 사용자가 숫자를 등록하면 컴퓨터와 비교하고 결과를 리턴, 매번 시도 횟수도 출력해야한다.
예) 현재 1strike 기회 3번시도중 1사용했습니다. - BaseballGame이라는 클래스를 써야한다(main이 여기서 시작)
- 게임을 처음실행하면 사용자에게 입력을 받을수 있다.
콘솔에서 게임숫자를 입력받아야 한다. 1,2,3 하면 1,2,3을 파싱해서 담아야한다. - 매번 게임은 현재 게임횟수를 출력해야한다.(시도횟수와는 다르다)
현재 첫번째 게임을 하고 있습니다.
현재 두번째 게임을 하고 있습니다. - 게임은 hit이거나 out이 되야 한게임이 끝이 난다.
hit나 out이 나오면 게임을 다시 시작한다. - 게임이 종료되면 다시 게임을 시작한다.
- 게임중 현재 상태를 요청할수 있다.(현재 상태를 출력해주는 루틴만 있으면 되겠다)
- 게임이 기록이 없다면 기록을 둘려줄수없다.
# by | 2008/08/14 10:21 | TDD | 트랙백 | 덧글(0)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]