개선 전
private final List<Integer> player;
private final List<Integer> computer;
private int ball;
private int strike;
public Hint() {
this.player = PLAYER.number();
this.computer = COMPUTER.number();
this.ball = 0;
this.strike = 0;
}
개선 후 (테스트는 red)
public abstract class Builder {
protected final List<Integer> player;
protected final List<Integer> computer;
protected int ball;
protected int strike;
public Builder() {
this.player = PLAYER.number();
this.computer = COMPUTER.number();
this.ball = 0;
this.strike = 0;
}
}
public class Hint extends Builder {
public Hint() {
super();
}
public List<Integer> buildHint() {
computer.forEach( computerNumber -> comparing(computerNumber) );
List<Integer> hint = new ArrayList<>();
// ..
return hint;
}
private void comparing(int computerNumber) {
ListIterator<Integer> playerList = player.listIterator();
int playerNumber = playerList.next();
if (computer.contains(playerNumber) && computerNumber != playerNumber) {
ball++;
}
if (computerNumber == playerNumber) {
strike++;
}
}
}
고민
- 사용자 입력 위치는 테스트 용이성을 고려해야 함
- 적절한 인스턴스 생성 위치는 어디인가?
- 객체 참조(메서드 체이닝)의 단위는 어떻게 끊어야 할까?