๐พ ์ฝ๋ ๋ฆฌ๋ทฐ ์ ๋ฆฌ
Controller์ ์๋ ๋๋ฉ์ธ ๋ก์ง
๊ฒ์ ์งํ์ ์ํด Controller์ ๋ง์ ์ญํ ์ ๊ตฌํํ์๋ค.
์ ํผ๋๋ฐฑ์ ๋ฐ๊ณ BlackjackGame์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ฒ์์ ์งํ์ ํ๋๋ก ๊ตฌํํ๋ค.
๊ฐ๊ฐ์ ํ๋ ์ด์ด๋ค์ ๊ฒ์์ ์งํ์ Input๊ณผ Output์ด ์ฐ๊ฒฐ๋์ด ์์ด์
์ฒ์ ๋ฆฌํฉํ ๋ง์์๋ BlackjackGame์์ ํ๋ ์ด์ด๋ค์ ๊บผ๋ด์ค๊ณ , ํ๋ ์ด์ด ํ๋ ํ๋๋ง๋ค ๊ฒ์์ ์งํํ๊ฒ ๋์๋ค.
BlackjackController ์ผ๋ถ
private void askWantToHit(Player player, BlackjackGame blackjackGame) {
while (isAbleToAskHit(player, blackjackGame) &&
Answer.of(InputView.inputDrawAnswer()).isYes()) {
blackjackGame.hit(player);
OutputView.printPlayerCards(player);
}
}
private boolean isAbleToAskHit(Player player, BlackjackGame blackjackGame) {
if (blackjackGame.isNotGameOver(player)) {
OutputView.printAskOneMoreCard(player);
return true;
}
return false;
}
ํ์ง๋ง ๊ฒฐ๊ตญ BlackjackGame์์ ํ๋ ์ด์ด๋ฅผ get
ํด์ ๊ฐ์ ์กฐํํ๊ณ ,
ํด๋น ๊ฐ์ ๋ํ ๋ก์ง์ด Controller์์ ์ฒ๋ฆฌ๋๊ณ ์์๋ค.
๊ฒ์ด์ธ ์ ๋ง์๋๋ก ๋๋ฉ์ธ์ ์์ด์ผ ํ ๋ก์ง์ด ์ธ๋ถ์ธ Controller์์ ์ฒ๋ฆฌ๋๊ณ ์๋ ๊ฒ์ด๋ค. ํ์ด์ธ ๋ค๋๋ ๋น์ทํ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋๋ฐ, BlackjackGame ๊ฐ์ฒด๋ฅผ ํตํด ๊ฒ์ ์งํ ๊ณผ์ ์ ์บก์ํํ๋ผ ํ์ จ๊ณ , ์ด์ ๋ํด์๋ ์ถ๋ ฅ์ ์ ์ธํ๊ณ getter๊ฐ ์ฌ์ฉ๋๋ ๋ถ๋ถ์ด ํ๋๋ ๋จ์์์ง ์์์ผ ์บก์ํ๊ฐ ์ ์งํ๋์๋ค๊ณ ๋ณผ ์ ์๋ค๊ณ ํ์๋ค.
์ ํผ๋๋ฐฑ๋ค๋ก ๊ฒ์์ ์งํํ๋ ์ญํ ์ ์์ ํ BlackjackGame์ผ๋ก ์ฎ๊ธฐ๊ธฐ ์ํด
ํ์ฌ ๊ฒ์์ด ๋๋์ง ์์ ํ๋ ์ด์ด๋ค์ BlackjackGame์์ ๊ด๋ฆฌํ๋๋ก ํ๊ณ
(getCurrentPlayer()
), BlackjackGame์์๋ Players์๊ฒ ํ์ฌ ๊ฒ์์
์งํํด์ผ ํ๋ Player๋ฅผ ์ป์ด์ค๋๋ก ๊ตฌํํ๋ค.
๋ด๊ฐ ์ ์ฉํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ ์คํธ ์ฝ๋์ ๊ฐ๋ ์ฑ
๋ฆฌ๋ทฐ์ด๋๊ป์ ํ ์คํธ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ํด given, when, then์ผ๋ก ์ค๋ฐ๊ฟ ํ ๊ฒ์ ๊ถํด์ฃผ์ จ๋๋ฐ, ์ฐพ์๋ณด๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ Given-When-Then Pattern์ ๋ฐ๊ฒฌํ์๋ค.
-
Given
ํ ์คํธ๋ฅผ ์ํด ์ค๋น๋ฅผ ํ๋ ๊ณผ์ ํ ์คํธ์ ์ฌ์ฉํ๋ ๋ณ์, ์ ๋ ฅ ๊ฐ ๋ฑ์ ์ ์ํ๊ฑฐ๋, Mock ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ ๊ตฌ๋ฌธ ํฌํจ -
When
์ค์ ๋ก ์ก์ ์ ํ๋ ํ ์คํธ๋ฅผ ์คํํ๋ ๊ณผ์ -
Then
๋ง์ง๋ง์ ํ ์คํธ๋ฅผ ๊ฒ์ฆํ๋ ๊ณผ์ ์์ํ ๊ฐ, ์ค์ ์คํ์ ํตํด์ ๋์จ ๊ฐ์ ๊ฒ์ฆ
์ฌ์ค ์ง๊ธ๊ป ํ ์คํธ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์๋ง ์ง์ค์ ํ๊ณ ๊ฐ๋ ์ฑ์ ๊ณ ๋ คํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉํ ๊ฒ์ธ์ง ํ์ ์ ์์ผ๋, ์์ผ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ ํจํด์ ์งํค๋ ค ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค.
์ถ์ ๋ฉ์๋๋ก ๊ณตํต ๊ธฐ๋ฅ์ ์ ์ธํ๊ณ ๊ฐ๊ฐ ๊ตฌํํ๊ธฐ
๊ธฐ๋ฅ ์๊ตฌ์ฌํญ์์ ์ด๊ธฐ ์นด๋๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ก์ง์ด ๋๋ฌ์ ํ๋ ์ด์ด๋ง๋ค ๋ฌ๋๋ค. ๋๋ฌ๋ ์ฒ์์ ํ์ฅ๋ง ๋ณด์ฌ์ฃผ๊ณ , ํ๋ ์ด์ด๋ ๋์ฅ์ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ค. ์ด๋ฅผ ์ฒ์ ๊ตฌํํ์ ๋๋ User ์ถ์ ํด๋์ค์ public final Cards getCards()
๋ฅผ ๋๊ณ ํ๋ ์ด์ด๋ ์ด๊ธฐ์ ์ด ๋ฉ์๋๋ฅผ ํตํด ์นด๋๋ฅผ 2์ฅ์ธ Cards๋ฅผ (์ฌ์ค์ ์ ๋ถ) ๋ฐํํ๊ณ , ๋๋ฌ๋ ๋๋ฌ๋ง์ Card showOneCard()
๋ฅผ ํตํด Card ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๋ฐํ ํ์
๋ ๋ฌ๋ผ์ ๋๋ฌ์ ํ๋ ์ด์ด๋ค์ ์นด๋๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅธ ์ถ๋ ฅ ๋ฉ์๋๋ค๋ ํ์ํ๋ค. ๋๋ฌธ์ BlackjackGame ๊ฐ์ฒด์์๋ ์ถ๋ ฅ๋ง์ ์ํ ๋น์ทํ get()
๋ค์ด ์๊ฒจ๋ฌ๋ค. ๊ฒ์ด์ธ ์ ๋ง์๋๋ก ์ด๋ ๊ฒ ์ถ์ ํด๋์ค์ธ User์ Cards showInitialCard();
๋ฅผ ๋ง๋ค๊ณ ๋๋ฌ์ ํ๋ ์ด์ด ๊ฐ๊ฐ์ด
getCardsByCount(int count)
์ ๊ฐ์ ๋ง๋ ๊ฐ์๋ก ์นด๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ๋ฆฌํฉํ ๋ง ํด๋ณด์๋ค.
์บ์ ์ ์ฉ
์ฒ์ ๋ก์ง ๊ตฌํ ๋๋ Deck ๊ฐ์ฒด ์์ฒด๋ฅผ static์ผ๋ก ๋ง๋ค์ด์ ์บ์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ์๋ค.
ํ์ง๋ง static์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํ๋๋ง ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ํด๋น ๊ฒ์์ ์ฌ๋ฌ ์ค๋ ๋์์ ์งํํ๋ค๋ฉด ์นด๋ ๋ฐฐ๋ถ์ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒ์ด๋ค.
๋๋ฌธ์ Deck์ ๊ทธ๋ฅ ์ธ์คํด์ค๋ก ์์ฑํ๊ฒ ํ์๋๋ฐ, Deck์ ๋ค์ด๊ฐ ์นด๋๋ฅผ ์บ์ฑํ๋ ๋ถ๋ถ์ ์๊ฐํ์ง ๋ชปํ์๋ค.
์ฒ์์๋ LottoNumber ๋๋ฅผ ์๊ฐํ๊ณ of๋ก ๊ฐ์ฒด ํ๋ํ๋๋ฅผ ๋ฐํํด์ฃผ์ด์ผ ํ๋ ๊ณ ๋ฏผ์ ํ๋๋ฐ, ๊ทธ๋ฅ List<Card>
๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๋ฉด ๋์๋ค.
UI์ ๊ด๋ จ๋ ๋ก์ง
BlackjackGame ๊ฐ์ฒด์์ ์นด๋๋ฅผ ๋ ๋ฐ๊ธฐ ์ํ๋์ง์ ๋ํ ๋๋ต์ ๋ฐ์์ผ ํ๋๋ฐ, ์ค์ค๋ก๋ BlackjackGame ๊ฐ์ฒด๊ฐ ๊ฒ์ ์งํ์ ๋ด๋นํ๊ณ ์์ผ๋, yes / no ์ ๋ํ ์ ๋ณด๋ yes์ธ์ง no์ธ์ง์ ๋ฐ๋ผ ๊ฒ์ ์งํ ์ฌ๋ถ๊ฐ ๋ค๋ฅด๋, ๊ฒ์ ๊ฐ์ฒด๊ฐ ์์์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ์ด์ ๋ํด ๋ด ์๊ฐ์ ์ ๋ฌํ๊ณ ์๊ฒฌ์ ๋ฌผ์ด๋ณด์๋๋ฐ, โBlackjackGame ๊ฐ์ฒด๊ฐ ๋ธ๋์ญ ๊ฒ์ ์ญํ ์ ๋ด๋นํ๊ณ ์์ผ๋ yes no์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ด๋ ๊ด์ฐฎ์ง๋ง yes, no์ ๋ํ ์ ๋ณด๋ UI ์๊ตฌ์ฌํญ์ด๋ผ ์ถํ์ ์, ์๋์ค๋ก ๋ณ๊ฒฝ๋์ ๋ ๋๋ฉ์ธ ๊ฐ์ฒด๊น์ง ์ํฅ ๋ฒ์๊ฐ ๊ฐ ๊ฒ ๊ฐ๋คโ๋ผ๊ณ ๋ง์ํ์ จ๋ค. View์ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋์์ ๋ ๋๋ฉ์ธ ๊ฐ์ฒด๊น์ง ์ํฅ์ด ๊ฐ ๊ฒ ๊ฐ๋ค๋ ๋ถ๋ถ์ ์๊ฐํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ๋ค. ์ด ํผ๋๋ฐฑ์์ ๋ง์ ์ธ์ฌ์ดํธ๋ฅผ ์ป์๋๋ฐ, ์ฒด์ค ๊ฒ์ ๋ฏธ์ ์์ ์ฌ์ฉ์์ ๋๋ต์ ์ ๋ ฅ ๋ฐ๋ ๋ถ๋ถ์ ์์ด์ ๋๋ต์ ๋ํ ๊ฒ์ฆ์ ์ด๋์์ ์ทจํด์ค๊น๋ฅผ ๊ณ์ ํ ๋ก ํ๋ค ๊ฒ์ ๊ฐ์ฒด์์ ํด์ฃผ์์๋๋ฐ, ์ด ๋ต๋ณ์ ๋ฐ๊ณ ๋๋ฉ์ธ ๋ฐ์ผ๋ก ๋๋ต ๊ฒ์ฆ์ ๋บ ์ ์์๋ค.
๐พ ๋ฏธ์ ์ ๋ฆฌ
์ํ ํจํด ์ ์ฉ๊ธฐ
0309 ๊ฐ์์์ ์ด๋ฒ ๋ฏธ์ ์ ์ํ ํจํด์ ์ ์ฉํ์ฌ ๊ตฌํํ๋ ๋ฒ์ ๋ํด ๋ฐฐ์ ๋ค. ์ด๋ฒ ๋ฏธ์ ์ ์งํํ๋ฉด์ ์ค์ค๋ก ์ ์ผ ์ด์๋ผ๊ณ ์๊ฐํ๋ ๋ถ๋ถ์ ๋๋ฌ์ ํ๋ ์ด์ด์ ์ ์๋ง์ ๊ฐ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋๋ผ, ๋๋ฌ์ ํ๋ ์ด์ด์ ์ํ๋ณ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ๋ ๋ถ๊ธฐ์ฒ๋ฆฌ์๋ค.
์ด ๋ถ๋ถ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ด๋ฒ ๋ฏธ์ ๋์ ๋ง์ด ๊ณ ๋ฏผํด๋ณด์์๊ณ , ๋์ ์ฝ์ง์ ๊ณผ์ ๋ค์ ํจ๊ป ๊ธฐ๋กํด๋ณด๋ ค ํ๋ค.
1. if ๋ฌธ์ ํตํ ์ฒ๋ฆฌ
๋งจ ์ฒ์ ๋ฏธ์ ์ ์ ์ถํ ๋๋ ๊ฐ๊ฐ์ ์ํ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ์ฐ์ถ์ if๋ฌธ์ ํตํด์ ์ฒ๋ฆฌํด์ฃผ์๋ค.
/* ๋ณ์๋ก ๋ค์๊ณผ ๊ฐ์ด compareValue๋ฅผ ๊ฐ์ง๊ณ ์์
* private final String result;
* private final int compareValue;
*/
public static Result decide(Dealer dealer, Player player) {
if (dealer.cards.isBust() && !player.cards.isBust()) {
return WIN;
}
if (dealer.cards.isBust() && player.cards.isBust()) {
return STAND_OFF;
}
if (!dealer.cards.isBust() && player.cards.isBust()) {
return LOSE;
}
return Arrays.stream(values())
.filter(value -> value.compareValue == player.cards.compareTo(dealer.cards))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
ํ์ง๋ง ์ด๋ ๊ฒ ๊ตฌํ ๊ฒฐ๊ณผ์ ์ค์ค๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ ๋๊ผ๋ค.
- ๋๋ฌ์ ํ๋ ์ด์ด์ ์ํ๋ฅผ ๋น๊ตํ๋ ๋์ผํ ํ์๋ฅผ if๋ฌธ์ผ๋ก ๋ฐ๋ณตํด์ ์ฒ๋ฆฌํ์ฌ ๊ธธ์ด์ง
decide()
- ํด๋น ํ์ ์ ๊ตฌํ๊ธฐ ์ํ ์ฑ ์์ด ๋ถ๋ฆฌ๋์ด ์์ (๋ฐ์ดํฐ์ ๋ก์ง ๋ถ๋ฆฌ๋์ด ์์)
- compareValue์ธ
1, 0, -1
๊ฐ์ด Result์ ์๋ฏธ๋ฅผ ๋ช ํํ ๋๋ฌ๋ด์ง ๋ชปํจ - ๋ง์ฝ ์ค์๋ก
decide()
์ if๋ฌธ ํ์ค์ ์ง์ ๋ค๋ฉด ํ๋ก๊ทธ๋จ ์ค๋ฅ
๋๋ฌธ์ if๋ฌธ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ํ๋ค์ ์ด๋ป๊ฒ ์ค์ผ ์ ์์๊น ๋ง์ ๊ณ ๋ฏผ์ ํ๋ค.
2. ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ฒ๋ฆฌ
Enum ํ์ฉ์ฌ๋ก 3๊ฐ์ง ENUM + Funcational Interface ํ์ฉํ๊ธฐ
ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ณด๋ค, ์ ๊ธ๋ค์ ์ฐธ๊ณ ํ์ฌ ๋๋ฌ์ ํ๋ ์ด์ด์ ์ํ๋ง๋ค ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ๊ตฌํํด๋ณด์๋ค.
์ด์ ์ค์ค๋ก ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํ์ตํ๋ฉฐ ์ ๋ฆฌํ๊ณ
Dealer์ ๋ํ Player์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ ๋ก์ง์ BiPredicate<T>
๋ก ์ฒ๋ฆฌํ๋ค.
ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฌ, ํ๋ ์ด์ด์ ์ํ๋ณ / ์ ์๋ณ ๊ฒฐ๊ณผ ์ฐ์ถ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
public enum Result {
WIN("์น", (playerNotBust, dealerNotBust) -> playerNotBust && !dealerNotBust,
(playerScore, dealerScore) -> playerScore > dealerScore),
STAND_OFF("๋ฌด", (playerNotBust, dealerNotBust) -> !playerNotBust && !dealerNotBust,
Integer::equals),
LOSE("ํจ", (playerNotBust, dealerNotBust) -> !playerNotBust && dealerNotBust,
(playerScore, dealerScore) -> playerScore < dealerScore);
private final String result;
private final BiPredicate<Boolean, Boolean> statusPredicate;
private final BiPredicate<Integer, Integer> scorePredicate;
// ...
public static Result decide(User player, User dealer) {
return Arrays.stream(values())
.filter(value -> value.statusPredicate.test(player.isAbleToHit(), dealer.isAbleToHit()))
.findFirst()
.orElseGet(() -> decideByScore(player.score(), dealer.score()));
}
private static Result decideByScore(int playerScore, int dealerScore) {
return Arrays.stream(values())
.filter(value -> value.scorePredicate.test(playerScore, dealerScore))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("์นํจ ๊ฒฐ๊ณผ ์กฐ๊ฑด์ ๋งค์น๋์ง ์์ต๋๋ค."));
}
// ...
์ด๋ ๊ฒ Enum์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ์ฐ์ถ์ ํ์ ๋,
์ค์ค๋ก ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ๋๊ผ๋ค.
- ๋์ผํ ๊ธฐ๋ฅ(๋๋ฌ์ ํ๋ ์ด์ด์ ์ํ๋ฅผ ๋น๊ต)์ ๋ํด ๊ฐ๊ฐ ๋ค๋ฅธ ์ฐ์ฐ์ ๊ฐ์ง๊ณ ์์ด
๋์ด์ก๋
decide()
๋จ์ํ - (ํ ํ๋ก๊ทธ๋จ์์๋ ๊ทธ๋ด์ผ์ด ์๊ฒ ์ง๋ง) ์๋ก์ด Result ํ์ ์ด ์ถ๊ฐ๋์ด๋, ๋ฉ์๋์ ์ถ๊ฐ์ ์์ ์ด ์๋ค.
- ํ์ ์ด ํด์ผ ํ๋ ๊ธฐ๋ฅ์ ๋ํด์ ๊ฐ์ฅ ์ ์๊ณ ์์ ์๋ฐ์ ์๋, ์์ ์์ ๋ก์ง์ ์ถ๊ฐํ๋ฉด์, ๋ก์ง์ ๋ํ ๋ช ํํ ์์๋ช ์ ๊ฐ์ง
์ด๋ ๊ฒ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ด๋ฅผ ์ฌ์ฉํ์ ๊ฒฝ์ฐ์ ์ฅ์ ์ ์ค์ค๋ก ์๊ฐํ๊ณ ,
๋ฆฌ๋ทฐ์ด๋๊ป ์ง๋ฌธ์ ๋จ๊ฒผ๋๋ฐ ์ถ๊ฐ์ ์ผ๋ก ์๊ฒฌ์ ๋ฌ์์ฃผ์
จ๋ค ๐
์ํ ํจํด
๋ฏธ์ 2๋จ๊ณ๋ฅผ ์์ํ๋ฉด์, ๋ฒ ํ ๊ธ์ก์ ์ ๋ ฅ ๋ฐ๊ณ ์ํ์ ๋ฐ๋ผ ์์ต์ ๊ตฌํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผํ๋ค. ๋ฏธ์ ์ ์์ํ๊ธฐ ์์, 0309 ๋ธ๋์ญ ํผ๋๋ฐฑ ๊ฐ์์์ ๋ค๋ฃฌ ์ํํจํด์ ์ ์ฉํด ์ฌ๋ฌ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์๊ณ , ์ดํ ์ค์ค๋ก ์ํ ํจํด์ ๋ํด ๋ ์ฐพ์๋ณด๊ณ ์ด๋ฒ ๋ฏธ์ ์ ํตํด ์ํํจํด์ด ๋ฌด์์ด๊ณ , ์ด๋ฅผ ์ ์ฉํ๋ฉด ์ด๋ ํ ์ฅ์ ์ด ์๋์ง ์์๋ณด์!๋ฅผ ๋ชฉํ๋ก ์ํํจํด ์ ์ฉ๊ธธ์ ๊ฑธ์๋ค.
๋ด๊ฐ ์ ์ฉํ ์ํ ํจํด
์ ์ด์จ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๊ณ ์ํํจํด์ ์๋ํ๊ธฐ ๋๋ฌธ์, ์ค์ค๋ก ์๊ฐํด๋ณด์ง ๋ชปํ ์ฝ๋ ๋ฐ๋ผ์์ด๊ฐ ๋์ด๋ฒ๋ฆด๊น๋ด ์ค์ค๋ก ๊ณ์ํด์ ์ํ๋ณ๋ก ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผํ ๊ธฐ๋ฅ๋ค์ ๋ํ์ฌ ์๊ฐํด๋ณด๊ณ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋๋ฆ๋๋ก์ ๋ช ๋ถ์ ์ ๋ฆฌํด๋ณด์๋ค.
๋ํ ์๋๋ ์ํ ํจํด์ ์ฝํ ์คํธ์ธ User ํด๋์ค์ด๋ค.
public abstract class User {
protected final Name name;
protected State state;
protected Money bettingMoney;
public User(String name) {
this(new Name(name));
}
public User(Name name) {
this.name = name;
}
public final void initializeCards(Cards cards) {
state = StateFactory.generateStateByCards(cards);
}
public final boolean isAbleToHit() {
return !state.isFinish();
}
public final Score score() {
return state.cards().totalScore();
}
public final Cards cards() {
return state.cards();
}
public final String getName() {
return name.getName();
}
public State getState() {
return state;
}
private void changeState(State state) {
this.state = state;
}
public final void hit(Card card) {
changeState(state.draw(card));
}
public final void stay() {
changeState(state.stay());
}
// ...
์ฝํ ์คํธ์ ํ๋๋ก ์ํ(State)๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ํ์ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ๊ทธ ์ํ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด ์ฒ๋ฆฌํ๋๋ก ํ์๋ค.
PS
์ ๋ง์ ๊ต์ก์ฅ์์ ํฌ๋น์ ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ค ์ธ์ ๊น์ด ์ค์ค๋ก DM์ ๋จ๊ฒจ๋์ ๋ง์ด๋ค. ๋ง์๋๋ก ๋์์ธ ํจํด์ด ๋ฌด์กฐ๊ฑด ์ข์ ๊ฒ์ ์๋์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก๋ ์ด๋ฒ ๋ฏธ์ ๋์ ์ ์ผ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ธ ์ํ์ ๋ฐ๋ฅธ ์ฌ๋ฌ๊ฐ์ง ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์์๊น? ์ ๋ํ ์ข์ ๋ต์ด ์ํํจํด์ด๋ผ ์๊ฐํ์ฌ ์ํ ํจํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์ด์ ์ ๋๊ปด๋ณด๊ณ ์ถ์๊ธฐ์ ์ค์ค๋ก ์ข์ ์๋์๋ค๊ณ ์๊ฐํ๋ค ! ๋ฌผ๋ก ๋ค๋ฅธ ๋ฏธ์ ์์ ์ํํจํด์ ์ ์ฉํ๋ผํ๋ฉด ์ ์ ์ฉํ ์ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋, ์ด๋ฒ ๋ฏธ์ ์ ํตํด ์ด๋ ๊ฒ ์ํ์ ๋ฐ๋ฅธ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ค์ผ ์ ์๊ตฌ๋, ๋์์ธ ํจํด์ ์ด๋ฐ ์ฅ์ ์ด ์๊ตฌ๋๋ฅผ ๋๋ ์ ์์๋ค.