main에 함수만 주르륵 있던 코드를 분리하면서 각자 어울리는 객체 타입을 선택해주려고 했다. 나름 고민해가면서 고르는 기준을 세웠다. (사실 내 나름대로 정리하는거라 확실치 않음 튜터님께 여쭤봐야함)
1) 단순히 값들이 모여있는가? -
struct
2) 역할이나 행동이 주된 것인가? -protocol
3) 정체성이 강하고 상태가 있거나 공유해야 하는가? -class
예를 들어 야구게임에서는
Judgement: 판정 결과의 답을 가짐GameRule: 게임 규칙들의 값들Digit: 야구게임이 진행되는 자릿수(사용자가 맞춰야하는 숫자 수)이것들은 struct가 적절한 거 같다. 단순한 값들이고 규칙과 결과는 공유될 필요는 없고 오히려 공유되면 위험할 수 있다고 생각했다.
어떤 기능만 하거나 로직만 있다면 protocol이 적절한 거 같다.
야구게임 내에서 아래의 두 protocol도 struct에서 변경한 것이다. struct라고 하기에는 단순히 값 보단 역할이나 행동이라고 보였다.
Judging: 게임의 승패를 판단하는 역할NumberGenerating: 게임에 쓰일 숫자들을 만드는 행동class는 정체성과 상태를 가진 객체라고 설명하는 걸 많이 봤는데 이 프로젝트를 통해서 직접 어떤 타입으로 할까 고민하다보니 어렴풋이 이해가 가는 거 같다.
GameController: 게임을 진행하거나 종료하고 내부 상태를 저장GameHistory : 사용자가 몇 회차에 얼마나 시도를 했는지 저장, 종료 될 시 리셋GameHistory는 사용자가 얼마나 몇회 차에 얼마나 시도를 했는지 저장해주는 객체이다. 처음에는 값이니까 struct가 아닐까 했는데 누적되는 값이고 그게 상태에 가깝다고 생각해서 class로 해주었다.
GameController는 하나가 존재하면서 흐름을 책임지는 면이 class에 적절하다고 생각했다.
BaseballGame을 class로 설정했었다. 근데 지금 하는 일도 너무 많고 게임 루프를 돌리는 것은 GameController이 할 일 인거 같다. BaseballGame 해당하는 로직을 따로 분리하는게 맞다는 생각이 든다.
😩 금요일 밤이라서 그런지 그냥 네이밍만 냅다 BaseballgameController로 바꾸고 주말을 즐기고 싶다..