Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[블랙잭 1단계] 모찌 미션 제출합니다. #124

Open
wants to merge 67 commits into
base: wondroid-world
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
d9f4ea4
docs: 기능 목록 작성
wondroid-world Mar 4, 2025
c9e3b8a
docs: 기능 요구 사항 추가
m6z1 Mar 4, 2025
2df5152
feat: 카드 모양 객체 구현
m6z1 Mar 4, 2025
7ceb108
feat: 카드 객체 구현
m6z1 Mar 4, 2025
d3d99c2
docs: 기능 요구 사항 추가
m6z1 Mar 4, 2025
5d8b925
feat: 카드 끗수를 숫자로 변환하는 로직 구현
m6z1 Mar 4, 2025
6d8e4d1
feat: 플레이어 행동 객체 구현
m6z1 Mar 4, 2025
e902fdf
Merge branch 'step1' of https://github.com/wondroid-world/kotlin-blac…
wondroid-world Mar 5, 2025
7fe01d4
docs: 플레이어 상태 기능 목록 수정
wondroid-world Mar 5, 2025
61ed0d5
feat: 플레이어 객체 구현
wondroid-world Mar 5, 2025
9c24b94
feat: 플레이어 카드 추가 기능 구현
wondroid-world Mar 5, 2025
90a4195
docs: 플레이어 기능 구현 추가
wondroid-world Mar 5, 2025
5b79da7
feat: 플레이어 이름만 가질 경우, 비어있는 카드 리스트를 가짐
wondroid-world Mar 5, 2025
47dc2ec
feat: 게임 결과 상태 객체 구현
m6z1 Mar 5, 2025
3557ebc
docs: 게임 결과 기능 목록 수정
m6z1 Mar 5, 2025
48d8577
feat: 기준 점수와 비교 점수를 비교하여 기준 점수 기준으로 게임 결과 반환 로직 구현
m6z1 Mar 5, 2025
48e2386
feat: 딜러 객체 구현
m6z1 Mar 5, 2025
ea6300e
docs: 딜러 이름 기능 목록 추가
m6z1 Mar 5, 2025
e55f6e2
feat: 딜러 이름의 초기값은 '딜러'
m6z1 Mar 5, 2025
a4a29b4
docs: 딜러 카드 리스트 기능 목록 추가
m6z1 Mar 5, 2025
a0ccfcc
feat: 딜러 카드 리스트 초기값 구현
m6z1 Mar 5, 2025
8147bce
feat: 딜러 카드 추가 기능 구현
m6z1 Mar 5, 2025
bbce347
docs: 카드들 상태 기능 목록 수정
wondroid-world Mar 5, 2025
fd9af80
feat: 게임 진행 중 카드들의 상태 구현
wondroid-world Mar 5, 2025
827acb6
docs: 끗수 기능 목록 추가
wondroid-world Mar 5, 2025
16be104
feat: 끗수 객체 추가
wondroid-world Mar 5, 2025
e44a767
docs: 카드 덱 기능 목록 추가
wondroid-world Mar 6, 2025
9100d77
feat: 카드 생성기 객체 구현
wondroid-world Mar 6, 2025
fa8bedd
docs: 카드 덱 기능 목록 수정
wondroid-world Mar 6, 2025
1a91b51
feat: 카드 덱 객체 구현
wondroid-world Mar 6, 2025
7088c4e
docs: 카드들 기능 목록 수정
wondroid-world Mar 6, 2025
8a55fdc
feat: 카드들 객체 구현
wondroid-world Mar 6, 2025
520e9b9
refactor: 카드 생성자 끗수를 끗수 타입으로 변경
wondroid-world Mar 6, 2025
1325edb
feat: 끗수 숫자 추가
wondroid-world Mar 6, 2025
a90b02a
refactor: ktlint 수정
wondroid-world Mar 6, 2025
43bca8f
refactor: 카드의 함수 네이밍 변경
wondroid-world Mar 6, 2025
aeebccf
docs: 플레이어 이름 검증 로직 추가
wondroid-world Mar 6, 2025
6ff398c
refactor: ktlint 수정
wondroid-world Mar 6, 2025
929540a
feat: 딜러 이름을 가지도록 수정
wondroid-world Mar 6, 2025
9b3d0e5
docs: 카드들 합 기능 목록 수정
wondroid-world Mar 6, 2025
fa7d4c4
feat: 카드 점수 계산 로직 구현
m6z1 Mar 6, 2025
d2bb180
refactor: 플레이어와 딜러의 카드들 타입 변경 및 카드 추가 로직 수정
m6z1 Mar 6, 2025
eb8b486
docs: 플레이어 행동 기능 목록 수정
m6z1 Mar 6, 2025
d395b56
feat: 딜러 점수에 따른 플레이어 행동 반환 로직 구현
m6z1 Mar 6, 2025
bb1979e
feat: 카드 상태 반환 로직 구현
m6z1 Mar 6, 2025
701086a
feat: 플레이어 카드 입출력 로직 구현
m6z1 Mar 6, 2025
18f3c58
feat: dsl 실습 구현
m6z1 Mar 6, 2025
5aa7ecd
docs: DSL 노트 정리 수정
m6z1 Mar 6, 2025
feda5e3
feat: 입출력 구현
m6z1 Mar 7, 2025
5390252
feat: 카드들의 블랙잭, 버스트 반환 로직 추가
m6z1 Mar 7, 2025
14d5ccb
feat: 딜러 결과 반환 및 업데이트 로직 추가
m6z1 Mar 7, 2025
dd2cd76
feat: 게임 결과의 반댓값 반환 로직 구현
m6z1 Mar 7, 2025
60ff224
feat: 플레이어의 블랙잭 여부 및 결과 업데이트 로직 추가
m6z1 Mar 7, 2025
b4a8fbc
feat: 플레이어 이름 검증 로직 추가
m6z1 Mar 7, 2025
2cce28d
feat: 블랙잭 로직 구현
m6z1 Mar 7, 2025
a60f022
feat: 딜러의 점수 분기 로직 추가
wondroid-world Mar 7, 2025
3ff8699
feat: 플레이어 이름 검증 로직 추가
wondroid-world Mar 7, 2025
196df71
refactor: 컨틀롤러 내부의 함수 순서 변경
m6z1 Mar 7, 2025
05980db
refactor: 사용하지 않는 생성자 제거
m6z1 Mar 7, 2025
9024c63
refactor: 카드들의 파라미터 네이밍 변경
m6z1 Mar 7, 2025
09916bb
test: 카드들 테스트 추가
m6z1 Mar 7, 2025
69e1097
refactor: 플레이어에서 bust, blackjack 판단하도록 수정
m6z1 Mar 7, 2025
e1779e9
test: 카드 테스트 추가
m6z1 Mar 7, 2025
87b91af
test: 딜러 테스트 추가
m6z1 Mar 7, 2025
08cba24
test: 게임 결과 테스트 추가
m6z1 Mar 7, 2025
70c7164
test: 플레이어 테스트 추가
m6z1 Mar 7, 2025
cbebd8c
homework: DSL 추가
wondroid-world Mar 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 63 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,63 @@
# kotlin-blackjack
# kotlin-blackjack

- 카드들 상태
- [X] 게임 진행 중 카드들의 상태는 Blackjack, Bust, None이 있다.
- [X] 카드들의 점수와 처음 턴 여부를 받아서 카드들의 상태를 반환한다.
- Blackjack는 처음 받은 카드의 합이 21이다.
- Bust는 카드의 합이 21초과이다.
- None은 카드의 합이 21미만이다.
- 게임 결과
- [X] 게임 결과는 Push, Win, Lose가 있고, 한국어 게임 결과를 가진다.
- [X] Push는 기준 점수가 비교 점수와 같다.
- [X] Win는 기준 점수가 비교 점수보다 높다.
- [X] Lose는 기준 점수가 비교 점수보다 낮다.
- 플레이어
- [X] 플레이어는 이름과 카드 리스트를 가진다.
- [X] 플레이어는 카드를 추가로 받을 수 있다.
- [X] 플레이어가 이름만 가질 경우, 가진 카드 리스트는 비어있다.
- 플레이어 이름 검증 로직
- [X] 플레이어의 이름은 1자 이상 5자 이내이다.
- [X] 플레이어 이름은 공백일 수 없다.
- [X] 플레이어 이름은 딜러가 될 수 없다.
- [X] 플레이어 이름은 중복될 수 없다.
- 카드 모양
- [X] 카드 모양은 클로버, 하트, 다이아몬드, 스페이드를 가진다.
- [X] 각 모양에 대해 한글 이름을 가진다.
- 카드
- [X] Card는 모양과 denomination(끗수)를 가진다.
- [X] Card의 끗수가 J, Q, K이면 숫자는 10이다.
- [X] Card의 끗수가 2~10 사이의 숫자이면 숫자 그대로 가진다.
- [X] 위의 끗수가 아닐 경우엔 숫자는 0이다.
- 카드들
- [X] 카드들은 생성자로 카드 리스트를 가진다.
- [X] Ace 카드가 0개 일때, 카드들의 총합을 반환한다.
- [X] Ace 카드가 1개이고 카드의 합이 11미만 일때, Ace카드를 11로 판단한다.
- [X] Ace 카드가 1개이고 카드의 합이 11이상 일때, Ace카드를 1로 판단한다.
- [X] Ace 카드가 2개이고 카드의 합이 10미만 일때, Ace카드의 합을 12로 판단한다.
- Ace의 카드 2장 중 1장은 11, 1장은 1로 판단한다.
- [X] Ace 카드가 2개이고 카드의 합이 10이상 일때, Ace카드의 합을 2로 판단한다.
- Ace의 카드 2장 다 1로 판단한다.
- [X] Ace 카드가 3개이고 카드의 합이 9미만 일때, Ace카드의 합을 13로 판단한다.
- Ace의 카드 3장 중 1장은 11, 2장은 1로 판단한다.
- [X] Ace 카드가 3개이고 카드의 합이 9이상 일때, Ace카드의 합을 3으로 판단한다.
- Ace의 카드 3장 다 1로 판단한다.
- [X] Ace 카드가 4개이고 카드의 합이 8미만 일때, Ace카드의 합을 14로 판단한다.
- Ace의 카드 4장 중 1장은 11, 3장은 1로 판단한다.
- [X] Ace 카드가 4개이고 카드의 합이 8이상 일때, Ace카드를 합을 4으로 판단한다.
- Ace의 카드 4장 다 1로 판단한다.
- [X] 카드들에 카드를 추가할 수 있다.
- 플레이어 행동
- [X] 응답은 Y, N로만 받을 수 있다.
- [X] 플레이 행동은 hit과 stay로 나뉜다.
- [X] 딜러 카드의 합이 16 이하일 경우 hit을 반환하고, 아닐 경우엔 stay를 반환한다.
- 딜러
- [X] 딜러는 이름과 카드들을 가진다.
- [X] 딜러는 이름이 없을 경우, 딜러라는 이름을 가진다.
- [X] 딜러의 초기 카드 리스트는 비어있다.
- [X] 딜러는 카드를 추가로 받을 수 있다.
- 카드 생성기
- [X] 무작위로 섞은 카드 번들을 생성한다.
- 카드 덱
- [X] 카드 덱은 첫번째 순서의 카드부터 차례대로 카드를 반환한다.
- 끗수
- [X] 끗수는 제목과 숫자를 가진다.
Empty file removed src/main/kotlin/.gitkeep
Empty file.
10 changes: 10 additions & 0 deletions src/main/kotlin/blackjack/Application.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package blackjack

import blackjack.controller.BlackjackController
import blackjack.view.InputView
import blackjack.view.OutputView

fun main() {
val blackjackController = BlackjackController(InputView(), OutputView())
blackjackController.run()
}
170 changes: 170 additions & 0 deletions src/main/kotlin/blackjack/controller/BlackjackController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
package blackjack.controller

import blackjack.model.CardDeck
import blackjack.model.CardsMaker
import blackjack.model.CardsStatus
import blackjack.model.Dealer
import blackjack.model.GameResult
import blackjack.model.Player
import blackjack.model.PlayerBehavior
import blackjack.model.Players
import blackjack.view.InputView
import blackjack.view.OutputView

class BlackjackController(
private val inputView: InputView,
private val outputView: OutputView,
) {
private val cardDeck = CardDeck(CardsMaker.CARDS)

fun run() {
outputView.printStartMessage()
val players: Players = inputView.readPlayers()
val dealer = Dealer()

getCards(players, dealer)
playGames(players, dealer)
}

private fun getCards(
players: Players,
dealer: Dealer,
) {
repeat(2) {
getCardsToPlayer(players.value)
getCardsToDealer(dealer)
}
outputView.printPlayersCards(dealer, players.value)
}

private fun getCardsToPlayer(players: List<Player>) {
players.forEach { player ->
val card = cardDeck.pickCard()
player.appendCard(card)
}
}

private fun getCardsToDealer(dealer: Dealer) {
val card = cardDeck.pickCard()
dealer.appendCard(card)
}

private fun playGames(
players: Players,
dealer: Dealer,
) {
if (dealer.isBlackjack(true)) {
val blackjackPlayers: List<Player> = players.findBlackjackPlayer()
updateGameResult(players, dealer)
outputView.printDealerBlackjackMessage(dealer, blackjackPlayers)
displayResult(players, dealer)
return
}
players.value.forEach { player ->
playGame(player, dealer)
}
displayResult(players, dealer)
}

private fun updateGameResult(
players: Players,
dealer: Dealer,
) {
players.value.forEach { player ->
if (isAllPlayerBlackjack(player, dealer)) return@forEach
player.updateResult(GameResult.WIN)
dealer.updateResult(player.cards.calculateScore())
}
}

private fun isAllPlayerBlackjack(
player: Player,
dealer: Dealer,
): Boolean {
if (player.isBlackjack(true)) {
player.updateResult(GameResult.PUSH)
dealer.updateResult(player.cards.calculateScore())
return true
}
return false
}

private fun playGame(
player: Player,
dealer: Dealer,
) {
if (isPlayerBlackjack(player, dealer)) return
executePlayerGameLogic(player)
executeDealerGameLogic(dealer)
val dealerResult: GameResult = dealer.updateResult(dealer.cards.calculateScore())
player.updateResult(dealerResult)
}

private fun isPlayerBlackjack(
player: Player,
dealer: Dealer,
): Boolean {
if (player.isBlackjack(true)) {
val dealerResult: GameResult = dealer.updateResult(CardsStatus.BLACKJACK_SCORE)
player.updateResult(dealerResult)
return true
}
return false
}

private fun executePlayerGameLogic(player: Player) {
while (!player.isBust()) {
outputView.printPlayerBehaviorGuide(player)
val playerBehavior: PlayerBehavior = inputView.readPlayerBehavior()

if (executePlayerBehavior(playerBehavior, player)) break
}
}

private fun executePlayerBehavior(
playerBehavior: PlayerBehavior,
player: Player,
): Boolean {
when (playerBehavior) {
PlayerBehavior.HIT -> {
player.appendCard(cardDeck.pickCard())
outputView.printPlayerCard(player)
if (isPlayerBust(player)) return true
}

PlayerBehavior.STAY -> return true
}
return false
}

private fun isPlayerBust(player: Player): Boolean {
if (player.isBust()) {
outputView.printBust(player)
return true
}
return false
}

private fun executeDealerGameLogic(dealer: Dealer) {
while (dealer.isHit()) {
dealer.appendCard(cardDeck.pickCard())
outputView.printDealerGettingCard()
if (isDealerBust(dealer)) break
}
}

private fun isDealerBust(dealer: Dealer): Boolean {
if (dealer.isBust()) {
outputView.printBust(dealer)
return true
}
return false
}

private fun displayResult(
players: Players,
dealer: Dealer,
) {
outputView.printResult(dealer, players)
}
}
10 changes: 10 additions & 0 deletions src/main/kotlin/blackjack/model/Card.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package blackjack.model

data class Card(
val shape: CardShape,
val denomination: Denomination,
) {
fun isDenominationAce(card: Card): Boolean = card.denomination == Denomination.ACE
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자기 스스로가 Card인데 파라미터로 Card를 받는건 무엇인가요?


fun combine(): String = denomination.title + shape.koreanName
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

객체가 메시징을 던진다.
이 의미를 어떻게 판단해야 되는 지 고민을 해봤습니다. 처음에는 객체는 메시징을 던진다라는 말을 들었을 때, 다른 객체에서 완전히 원하는 포맷의 주어야한다고 생각을 했습니다.

기본적으로 객체가 꽁꽁 숨겨져있고, 객체로 하여금 필요한 행동을 메시징 이라는 형태로 요청한다고 봐주시면 됩니다.
그렇기에 객체가 스스로 할 수 있도록 자율성을 부여할 수 있게 됩니다.

그래서 위와 같이 수정을 했습니다. 메시징을 던진다에 대해서 저의 생각의 변화에 대해서, 페로로의 생각이 궁금해요!

다만 위 예시는 메시징을 통해 가져오는 것과 어울리지 않습니다.
왜냐하면 어떻게 출력할 지 결정하는 것은. Card로부터 필요한 기능이 아니기 때문인데요.

가령 2하트 라고출력하는 것을 화면에 따라 ❤️2 이렇게 출력할지도 모릅니다.
혹은 그림으로 출력할수도 있죠.

메시징을 던지기 이전의 관심사 분리가 선행되어야 할 것으로 보입니다!

}
9 changes: 9 additions & 0 deletions src/main/kotlin/blackjack/model/CardDeck.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package blackjack.model

class CardDeck(
private val cards: List<Card>,
) {
private var index = 0

fun pickCard(): Card = cards[index++]
}
10 changes: 10 additions & 0 deletions src/main/kotlin/blackjack/model/CardShape.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package blackjack.model

enum class CardShape(
val koreanName: String,
) {
DIAMOND("다이아몬드"),
SPADE("스페이드"),
HEART("하트"),
CLOVER("클로버"),
Comment on lines +6 to +9
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

마찬가지로 카드 모형이 위와 같이 출력될 것이라는 것을 결정하는 것은 도메인이 아닌 UI 의 관심사입니다. 😓

}
33 changes: 33 additions & 0 deletions src/main/kotlin/blackjack/model/Cards.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package blackjack.model

class Cards(
value: List<Card>,
) {
private val _value: MutableList<Card> = value.toMutableList()
val value: List<Card> get() = _value.map { card -> card.copy() }
Comment on lines +6 to +7
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

card.copy() 라는 코드는 왜 필요한가요?


var size: Int = this.value.size
private set

fun add(card: Card) {
_value.add(card)
}

fun isBlackjack(firstTurn: Boolean): Boolean = CardsStatus.from(calculateScore(), firstTurn) == CardsStatus.BLACKJACK
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

블랙잭 상태는, 첫번째 턴이라기 보다는 "카드가 2장일 때 합계가 21점이면" 으로 접근을 하시는 방향이 좋을거에요!


fun isBust(): Boolean = CardsStatus.from(calculateScore()) == CardsStatus.BUST

fun calculateScore(): Int {
val aceCount: Int = value.count { card -> card.isDenominationAce(card) }
val score: Int = value.sumOf { card -> card.denomination.number }
return when (aceCount) {
1 -> if (score < 11) score + 11 else score + 1
2 -> if (score < 10) score + 11 + 1 else score + aceCount * 1
3 -> if (score < 9) score + 11 + 1 + 1 else score + aceCount * 1
4 -> if (score < 8) score + 11 + 1 + 1 + 1 else score + aceCount * 1
else -> score
}
}
Comment on lines +20 to +30
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

알고리즘적이 조금 복잡하게 느껴지는데 쉽게 생각해보세요!

카드뭉치에 에이스 카드가 있을 때 .... 보너스 점수 10점을 획득한다.


fun getCardsInfomation(): List<String> = value.map { it.combine() }
}
14 changes: 14 additions & 0 deletions src/main/kotlin/blackjack/model/CardsMaker.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package blackjack.model

object CardsMaker {
private val DENOMINATIONS: List<Denomination> = Denomination.entries
private val SHAPES: List<CardShape> = CardShape.entries

val CARDS: List<Card> =
DENOMINATIONS
.flatMap { denomination ->
SHAPES.map { shape ->
Card(shape, denomination)
}
}.shuffled()
}
21 changes: 21 additions & 0 deletions src/main/kotlin/blackjack/model/CardsStatus.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package blackjack.model

enum class CardsStatus {
BLACKJACK,
BUST,
NONE,
;

companion object {
const val BLACKJACK_SCORE = 21

fun from(
cardsScore: Int,
firstTurn: Boolean = false,
): CardsStatus {
if (firstTurn && cardsScore == 21) return BLACKJACK
if (cardsScore > 21) return BUST
return NONE
}
Comment on lines +12 to +19
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

카드의 상태를 결정하는 것은 카드가 스스로 해야 하지 않을까요?
만약 카드 상태를 결정하는데 필요한게 늘어날수록 이 함수도 비대해지게 됩니다.

아래 시그니처와 비교하면 어떤가요?

class Cards {
   ...
   fun getStatus(): CardsStatus { ... }
}

}
}
25 changes: 25 additions & 0 deletions src/main/kotlin/blackjack/model/Dealer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package blackjack.model

class Dealer(
private val dealerName: String = "딜러",
override val cards: Cards = Cards(mutableListOf()),
) : Player(dealerName) {
private var _results: MutableMap<GameResult, Int> = mutableMapOf()
val results: Map<GameResult, Int> get() = _results.toMap()

override fun appendCard(card: Card) {
cards.add(card)
}

fun isHit(): Boolean {
val dealerScore = cards.calculateScore()
return PlayerBehavior.from(dealerScore) == PlayerBehavior.HIT
}

fun updateResult(playerScore: Int): GameResult {
val dealerScore: Int = cards.calculateScore()
val result: GameResult = GameResult.of(dealerScore, playerScore)
_results[result] = _results.getOrDefault(result, 0) + 1
return result
}
}
20 changes: 20 additions & 0 deletions src/main/kotlin/blackjack/model/Denomination.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package blackjack.model

enum class Denomination(
val title: String,
val number: Int,
) {
ACE("A", 0),
TWO("2", 2),
THREE("3", 3),
FOUR("4", 4),
FIVE("5", 5),
SIX("6", 6),
SEVEN("7", 7),
EIGHT("8", 8),
NINE("9", 9),
TEN("10", 10),
JACK("J", 10),
QUEEN("Q", 10),
KING("K", 10),
Comment on lines +7 to +19
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

하지만, 이렇게 확장성을 고려하다보니, 블랙젝에서 구현하는 데, 블랙잭 점수에 대해서 너무 많은 분기를 처리해야하더라구요. 그래서, 아래와 같이 블랙잭에 핏한 카드들을 생성했습니다.

이미 enum에 점수를 넣은 것 부터 점수를 결정하는 규칙을 도메인에서 결정하였다고 보입니다.
점수가 동적으로 결정될 것을 고민하는 확장성이라면 애초에 enum에 포함되는 것 자체가 모순이겠죠?

다만 지금 블랙잭 규칙에서는 그러한 요구사항이 없기 때문에 enum에 포함되어도 괜찮다고 봅니다.
확장성을 고려하는 것은 중요하지만 과한 확장성은 객체의 복잡도를 크게 높이거나 오버 엔지니어링이 될 위험이 있습니다.

}
Loading