publicinterfaceInputBehavior {
StringinputOneInnings(); //야구의 1이닝의 3개의 카운트를 입력하는 함수입니다.booleaninputIsFinishGame(); //야구 게임을 끝낼 지, 물어보는 입력 함수입니다.
}
JudgmentBehavior : 이닝에 대한 결과를 판단하는 인터페이스
interfaceJudgmentBehavior {
InningsResultgetInningsResult(StringinningsResult); //1이닝이 들어오면, 결과를 돌려주는 함수입니다.
}
PrintBehavior : 숫자 야구에 대한 게임 진행애서 출력을 관리하는 인터페이스
interfacePrintBehavior {
voidprintStartInnings(); //이닝이 시작할 때, 이닝 시작의 멘트를 보여주는 함수입니다.voidprintInningsResult(InningsResultinningsResult); //이닝 결과를 보여주는 함수입니다.voidprintIsFinishGame(); // 게임이 끝났을 때, 더 할 지 묻는 함수입니다.
}
GameHost : 숫자 야구를 플레이를 관리하는 함수입니다.
interfaceGameHost {
voidplayGame();
}
처음 생각한 것을 구현하면서 어려웠던 점
입력과 출력하는 하는 부분을 분리해서 별도의 클래스로 구분지었는데, 그러다보니 해당 로직이 깨끗하지 않았습니다.
if, else 문을 어떻게 하면 단순하게 할 수 있을까? 특히, 조건에 따라서 게임이 종료되는 로직이 있는데, 해당 부분이 어려웠습니다.
나 혼자 리팩토링
관심사 분리
입력과 출력 (View)
게임의 로직처리 (Presenter) + 게임의 종료 조건 검사 (BaseballJudgment)
게임의 결과 모델 (Model)
게임의 주된 로직
play 로직 : 새로운 게임 시작 -> 이닝 시작 -> 이닝 종료 -> 매치가 종료되었는 지 체크 -> 게임 종료 체
@Overridepublicvoidplay(){
playNewGame();
do {
playInnings();
playEndInnings();
checkFinishGame(checkEndMatch());
} while(isContinueGame());
}
BaseballNumber : 게임에서 숫자 야구의 난수를 만들고, 이닝을 입력시에 확인하는 역할을 담당
리팩토링을 하면서 START, END와 같은 상태를 통해서 구현을 했는데, 상태와 함께 로직을 처리하는 것이 어려웠다. 숫자 야구에는 여러 가지 상태를 처리해야 할텐데, 이 때 쉽게 생각나는 것은 if문이나 switch문인데, 이러한 생각에서 벗어나는 방법이 궁금했고, 이러한 점을 객체로 처리할 수 있는 지 궁금했다.