2018-4-21 Bowling 1단계 마무리
볼링 4번째 이야기 LastFrame구현하기
public class LastFrame {
private State state = new Ready();
private List<State> states;
public LastFrame(List<State> states) {
this.states = states;
}
public List<State> bowl(int pin) {
state = state.bowl(pin);
states.add(state);
if (state.isStrike() || state.isSpare()){
state = new Ready();
return states;
}
return states;
}
public List<State> getStates() {
return states;
}
}
- 볼링에서 어제까지 고민을 하던 LastFrame을 구현을 했다. 10프레임에서는 문제가 스트라이크가 나오고 10개를 쓰러트리게 되면 스페어가 아닌 스트라이크가 구현이 된다는 점이였다. 이 부분을 해결을 하기 위해서 상태값들을 저장하는 리스트를 만들고, 스트라이크인 경우 다시 Ready상태로 만들어줬다.
public List<State> lastRunning(String name) {
LastFrame lastFrame = new LastFrame(getStates());
states = lastFrame.bowl(Input.inputNum(10));
if (states.get(0).isStrike()) {
ResultView.upperBar(states, name, 10);
states = lastFrame.bowl(Input.inputNum(10));
ResultView.upperBar(states, name, 10);
states = lastFrame.bowl(Input.inputNum(10));
ResultView.upperBar(states, name, 10);
return states;
}
ResultView.upperBar(states, name, 10);
states = lastFrame.bowl(Input.inputNum(10));
if (states.get(1).isSpare()) {
ResultView.upperBar(states, name, 10);
states = lastFrame.bowl(Input.inputNum(10));
ResultView.upperBar(states, name, 10);
return states;
}
ResultView.upperBar(states, name, 10);
return states;
}
- 이 부분을 깔끔하게 처리를 하고 싶었지만, 값을 넣을때마다 출력을 해주는 형태라서 ResultView와 states를 남발하게 되었다. 리팩토링을 어떻게 할 것인가에 대한 고민을 해봐야겠다.
public interface State {
String displayText();
State bowl(int first);
boolean isFinish();
boolean isStrike();
boolean isSpare();
boolean isMiss();
boolean isFirstBowl();
}
- isInstance를 안쓰기 위해서 상태값들을 체크하는 메소드를 인터페이스에 구현을 했다. 이를 통해서 LastFrame에서 샷을 날리는 부분을 해결을 한다.
오늘의 느낀점
- 어제까지만 해도 엄청나게 생각이 안나고 많이 고민을 하던 10프레임이였다. 계속 고민을 하고 경우의 수를 나누다보니까 스트라이크인 경우에 초기화를 시키는 부분을 떠오르게 되었다. 스트라이크에서는 bowl메소드를 호출을 하면 예외가 발생하는 예외처리를 작성을 했는데, 마지막프레임에서 10개를 쓰러트린경우 바로 스트라이크의 상태값을 리스트에 저장을 하고, 리턴을 Reday로 초기화를 함으로써 경우의 수를 해결을 할 수 있었다.
- 볼링 1단계를 마무리하면서 상속, 인터페이스에 대해서 많은 공부가 되었다. 남은 기간동안도 잘 공부를 해봐야겠다 :0
Written on April 24, 2018