Card
:Suit - 마크 ,Rank - 등급 숫자
를 표현하며 비교연산 대상CardHand
:[Card]
프로퍼티를 소유Score
- 카드의 조합을 표현하는enum
ScoreFactory
-Score
의 팩토리객체FactoryMethod
:[Card]
로 조합의 가능성 검증 및 생성 하는init
들의enum
반환형은 ->Score?
CardDeck
: 초기 카드 52장을 지니고 게임에서 이용되는 객체MyPlayer
:CardHand
를 소유한 게임 진행의 중심객체MyDealer
:MyPlayer
를 서브클래싱한 특수화 객체, 추가적으로draw()
동작 수행PlayerEntry
:[MyPlayer]
를 추상화한 객체, 게임에서는 각개인의MyPlayer
가 아닌 전체를 대상으로 진행하여 추상화하여 구성InputView
: 초기 게임 설정을 위한 입력을 받는 뷰 객체Setting
: 게임의 종류와 인원수의 입력을 추상화한 DTOMode
: 게임의 종류를 표현하는enum
Entry
: 게임의 인원수를 표현하는enum
OutputView
: 게임의 상태와 결과, 에러메세지의 출력 방법을 알고 있는 뷰 객체Game
: 게임의 구성원과 흐름을 알고 있는 객체
객체에게서 데이터를 가져오는 것 보다는
객체가 직접 데이터로 연산을 하게끔 외부에서 입력을 넣어준 뒤 결과값을 반환 받게하였다.
객체의 데이터의 출력에 대해서는, OutputView
가 클로저의 형태로 로직을 넘겨, 데이터를 공개하지 않고 출력을 할 수 있었다.
중간에 테스트를 하면서 MyDealer
객체가 생성될 때 init()
에서 MyDeck
또한 생성되게 구현을 했었다.
하지만 MyDealer
의 모든 프로퍼티는 숨겨져 있어서, 테스트를 수행할 수 없었다.
테스트를 할 수 있는 구조로 만들기 위해서, MyDeck
외부에서 주입하게 변경하였다.
그러니 테스트하기도 쉬워지고, 구조 또한 유연해졌다고 느꼈다.
ex)
비교연산을 할 때 데이터를 가져오기 보다는 해당 인스턴스와
다른 인스턴스와의 비교를 내부에서 하고 비교연산의 결과만 반환하게 하였다.