- 볼링 게임 점수판 요구사항을 파악한다.
- 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
- 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
- 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.
- 내가 쓴 글에 대해서 삭제할 수 있다.
- 내가 쓴 글에 댓글이 남겨져있지 않아야 삭제할 수 있다.
- 댓글이 있더라도, 내가 쓴 댓글만 있으면 삭제할 수 있다.
- 다른 사람이 쓴 댓글이 하나라도 있더라도 삭제할 수 없다.
질문 삭제 수행 과정
- questionId 통해 Question을 가져온다.
- 해당 질문이 내가 쓴 글이 아닐 경우 Exception 처리를 한다.
- 해당 질문의 댓글(Answer) 목록을 가져온다.
- 해당 질문에 대해 순환하면서, 내가 쓴 댓글이 아니면 Exception 처리를 한다.
- 질문과 답변을 삭제한다.
- 삭제한 내역을 DeleteHistory에 등록한다.
- Question - 질문 정보를 관리한다.
- 질문 ID, User를 가지고 있다.
- 질문을 삭제하는 기능을 갖는다.
- 해당 질문이 User에 대해 삭제 가능한지 여부를 판단해주어야 한다.
- 질문이 가진 댓글도 삭제해준다. (Answer의 삭제 기능을 호출하도록 한다.)
- 삭제 후에 DeleteHistory의 생성 기능을 이용해 deleteHistories를 만들어 반환해준다. (Answer, Question 모두)
- Answer - 댓글 정보를 관리한다.
- 댓글을 삭제하는 기능을 갖는다.
- 해당 댓글이 User에 대해 삭제 가능한지 여부를 판단해주어야 한다.
- DeleteHistory - 삭제 히스토리를 관리한다.
- 댓글이나 질문을 삭제했을 경우 DeleteHistory 객체를 생성해서 반환해주어야 한다.
- QuestionTest
- 질문 작성한 사람이 다를 경우 삭제시 Exception을 뱉어줘야 한다.
- 삭제가 수행되면 Question 객체의 deleted 객체가 true로 변경되어야 한다.
- 삭제 히스토리 테스트 - 삭제를 수행하면 삭제 히스토리 정보가 하나씩 생성되는지 테스트?
- AnswerTest
- 답변 작성한 사람이 다를 경우 삭제시 Exception을 뱉어줘야 한다.
- 삭제가 수행되면 Answer 객체의 deleted 객체가 true로 변경되어야 한다.
- 삭제 히스토리 - 삭제를 수행하면 삭제 히스토리 정보가 하나씩 생성되는지 테스트?
- UserTest
- ?
https://www.bowlinggenius.com/ 참고
- 스트라이크(strike) : 프레임의 첫번째 투구에서 모든 핀(10개)을 쓰러트린 상태. X로 표시
- 스페어(spare) : 프레임의 두번재 투구에서 모든 핀(10개)을 쓰러트린 상태. 9|/으로 표시
- 미스(miss) : 프레임의 두번재 투구에서도 모든 핀이 쓰러지지 않은 상태. 두 투구의 점수로 표시
- 거터(gutter) : 핀을 하나도 쓰러트리지 못한 상태. 거터는 "-"로 표시
- 총 10 프레임으로 구성된다.
- 한 프레임 당 2번의 투구를 진행한다.
- 스트라이크의 경우에는 한번의 투구만 진행한다.
- 10 프레임은 스트라이크이거나 스페어이면 한 번을 더 투구할 수 있다.
- 현재 프레임에서 스트라이크가 나온 경우, 다음 2번째까지의 투구의 점수를 더한다.
- 현재 프레임에서 스페어가 나온 경우, 다음 1번째의 투구의 점수를 더한다.
- 플레이어 이름을 입력받는다.
- 플레이어 이름은 3글자의 영어 알파벳만 가능하다.
- 플레이어 이름을 포함한 점수판을 출력한다.
- 윗줄의 내용은 반복되므로 상수로 가지고 있도록 한다.
- 총 10프레임의 투구를 입력받아, 투구의 내용에 따른 점수판 표시를 더한 점수판을 반복하여 출력한다.
- 프레임 1개
- 1번 투구가 10인 경우
- 스트라이크. 2번은 진행하지 않는다.
- 다음 2회의 투구 후 합산 점수가 도출된다.
- X로 표시한다.
- 1번 투구가 10 미만 0 이상인 경우
- 1번 투구의 점수를 숫자로 표시한다.
- 2번 투구를 진행한다.
- 2번 투구와의 합이 10인 경우 - 스페어
- 다음 1회의 투구 후 합산 점수가 도출된다.
- 2번 투구의 점수를 / 로 표시한다.
- 2번 투구와의 합이 10 미만인 경우 - 미스
- 2번 투구의 점수를 숫자로 표시한다.
- 2번 투구가 0인 경우 - 거터
- 2번 투구의 점수를 -로 표시한다.
- 2번 투구와의 합이 10인 경우 - 스페어
- 1번 투구가 0인 경우
- 1번 투구의 점수를 -로 표시한다.
- 2번 투구를 진행한다.
- 2번 투구와의 합이 10인 경우 - 스페어
- 다음 1회의 투구 후 합산 점수가 도출된다.
- 2번 투구의 점수를 / 로 표시한다.
- 2번 투구와의 합이 10 미만인 경우 - 미스
- 2번 투구의 점수를 숫자로 표시한다.
- 2번 투구가 0인 경우 - 거터
- 2번 투구의 점수를 -로 표시한다.
- 2번 투구와의 합이 10인 경우 - 스페어
- 10프레임의 경우
- 1번 투구 스트라이크
- 3번 투구까지 진행할 수 있다.
- 2번 투구 스페어
- 3번 투구까지 진행할 수 있다.
- 2번 투구 미스 / 거터
- 게임이 종료된다.
- 1번 투구 스트라이크
- 1번 투구가 10인 경우
- 프레임 1개
- BowlingGameController : 게임을 진행하는 Controller
- 입력받은 Player들에 의해 게임을 수행한다.
- View에게 필요한 정보를 보내고 받아온다.
- Player: 각 Frame의 플레이를 수행하는 사람
- 이름 정보를 갖는다.
- 이름이 3글자가 아니면 Exception 처리를 수행한다.
- 진행한 Frame의 목록을 갖는다.
- play를 수행하며 Frame의 목록을 채워나간다.
- Frame 수를 이용해 게임 완료 여부를 판단할 수 있다.
- 이름 정보를 갖는다.
- Frame: 프레임 정보를 갖는 Interface (힌트 참고)
- 현재 Frame의 번호 정보를 갖는다.
- Frame의 번호가 10이 넘거나 0보다 작으면 Exception 처리를 수행한다.
- play를 수행한다.
- 다음 Frame을 생성한다. (힌트 참고) <- State를 이용하자.
- 스트라이크/스페어/거터/미스 중 하나의 상태를 가질 수 있다. <- State
- 거터를 제외하 3개의 상태는 Frame이 끝나야만 가질 수 있다.
- 진행 전에는 Ready, 결과를 갖기 전에는 Playing 이라는 상태를 가지면 좋을까?
- State를 통해 프레임 완료 여부를 판단할 수 있다.
- 스트라이크/스페어/미스는 Frame 완료
- Gutter, Ready, Playing: Frame 미완료
- 프레임의 점수를 계산하여 가지고 있다.
- 현재 Frame의 번호 정보를 갖는다.
- State: 프레임이 갖는 상태 객체
- 각 상태에 맞는 play를 수행한다.
- 1번과 2번의 투구에서 쓰러뜨린 핀 정보를 갖는다.
- 각 투구 수 검증
- 첫 투구: 0 이상 10 이하
- 두번째 투구: 첫번째 투구에 따라..
- 각 투구 수 검증
- NormalFrame: Frame 을 구현하는 Concrete 클래스
- 1-9 프레임을 가진다.
- FinalFrame: Frame 을 구현하는 Concrete 클래스
- 10 프레임을 가진다.
- 3개의 처리는 어떻게 하면 좋을지 고민 필요
- AdditionalFrame: FinalFrame에서 Spare나 Strike가 나올 경우 생성된다.
* - FrameResult: 각 Frame 의 결과를 가진다.
- Board: 점수판 객체
- FrameResult를 통해 점수판을 만든다.
- Player
- Player의 이름이 3글자가 아닌 경우 Exception 반환
- Frame
- 현재 Frame이 0에서 10사이에 있는 지 검증
- 각 상태에 따른 Play
- 고민 필요
- 다음 Frame 생성
- State
- 프레임의 완료 여부
- 각 상태에서 play를 수행한 후의 상태 변경
- 각 투구 수 검증