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

2단계 - 블랙잭 #780

Open
wants to merge 22 commits into
base: pablo730
Choose a base branch
from
Open

Conversation

Pablo730
Copy link

@Pablo730 Pablo730 commented Dec 7, 2024

경록님 안녕하세요!

개인 사정으로 인해 리뷰 요청이 너무 늦어졌네요 😭

이번 블랙잭 미션에서 제가 블랙잭 게임에 대해 잘 몰랐던 부분이 있어 알아본 아래 룰이 확실하지 않을 수 있는데요ㅠ

  • 블랙잭 게임은 숫자 21이 넘는 순간 즉시 패배로 더이상 게임을 진행하지 않는다

미션에 명시된 "21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다."와 의미가 일맥 상통한게 아닐까 싶어

이번 미션에서 합이 21을 넘을 경우 플레이어가 즉시 패배하도록 구현했습니다

추가로 1단계에서 리뷰 주셨던 부분들 확인 후 반영해보았습니다, 꼼꼼한 리뷰 감사합니다 🙇

  • 사용하지 않는 테스트 로직 제거
  • 불필요한 테스트 라이브러리 제거
  • sealed class 활용 등

그럼 남은 기간 빠르게 미션 완수할 수 있도록 노력해보겠습니다, 잘 부탁드립니다!

Copy link

@Rok93 Rok93 left a comment

Choose a reason for hiding this comment

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

창민님 2단계 리뷰 요청주신 코드가 컴파일 에러로인해 실행이 안되는 것으로 보입니다. 😂
해당 내용 확인해서 수정한 뒤 다시 리뷰요청 부탁드릴게요. 🙏


class BlackJack(val players: Players, val cardDeck: CardDeck) {
init {
repeat(INIT_CARD_DRAW_REPEAT) { players.players.forEach { it.addCard(cardDeck.drawCard()) } }
Copy link

Choose a reason for hiding this comment

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

Copy link

Choose a reason for hiding this comment

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

이 부분도 같이 확인 부탁드릴게요. 😃

Copy link

@Rok93 Rok93 left a comment

Choose a reason for hiding this comment

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

창민님 2단계 빠르게 잘 구현해주셨습니다. 👍💯
몇몇 코멘트 남겨두었는데, 확인 부탁드릴게요. 🙏

미션 진행하시면서 잘 이해가 안되거나 어려운 부분 있으시면 언제든지 DM 주세요. 😉

@@ -0,0 +1,17 @@
package blackjack.domain

fun defaultDeckGenerator(): MutableList<Card> {
Copy link

Choose a reason for hiding this comment

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

반환 타입이 가변리스트군요? 👀
가급적 가변 리스트보다는 불변 리스트를 사용해보면 어떨까요? 😃

Copy link

Choose a reason for hiding this comment

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

생성한 Card들을 자주 사용되게 될 것 같은데요.
모든 카드에대해 캐싱해서 재사용하면어떨까요? 😃

또한 이런 관점에서 별도의 DeckGenerator를 만들기보다는 Card의 상수로 두면 어떨까요?


class BlackJack(val players: Players, val cardDeck: CardDeck) {
init {
repeat(INIT_CARD_DRAW_REPEAT) { players.players.forEach { it.addCard(cardDeck.drawCard()) } }
Copy link

Choose a reason for hiding this comment

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

이 부분도 같이 확인 부탁드릴게요. 😃

@@ -0,0 +1,13 @@
package blackjack.domain

data class CardDeck(val deck: MutableList<Card>) {
Copy link

Choose a reason for hiding this comment

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

CardDeck의 내부 값을 외부에서 변경할 수 없도록해보면 어떨까요? 🤔


fun drawCard(): Card {
require(deck.isNotEmpty()) { "더이상 카드가 남아있지 않습니다" }
return deck.removeAt(deck.lastIndex)
Copy link

Choose a reason for hiding this comment

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

removeLast()를 사용하도록 변경해볼 수 있을 것 같아요. 😃

Suggested change
return deck.removeAt(deck.lastIndex)
return deck.removeLast()


data class Players(val players: List<Player>) {
init {
require(players.size == PLAYER_COUNT) { "블랙잭 게임에서 플레이어는 2명이어야 합니다" }
Copy link

Choose a reason for hiding this comment

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

아래와 같이 에러 메시지에도 상수를 사용하면, 추후 값이 변경되더라도 에러 메시지를 추가로 수정하는 공수가 없을 것 같네요. 😃

Suggested change
require(players.size == PLAYER_COUNT) { "블랙잭 게임에서 플레이어는 2명이어야 합니다" }
require(players.size == PLAYER_COUNT) { "블랙잭 게임에서 플레이어는 ${PLAYER_COUNT}명이어야 합니다" }

추가적으로 PLAYER_COUNT는 Players 클래스 내부에서만 사용되는 것 같은데, 접근 제한자를 private로 제한해주시면 좋을 것 같아요. 😁

KING(10, "K"),
;

fun getNumber(): List<Int> {
Copy link

Choose a reason for hiding this comment

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

getNumber의 결과는 사실상 value를 가져오는거니 getValue가 조금 더 적절한 네이밍인 것 같아요. 🤔
value는 의미가 조금 애매해지는 것 같아서 점수와 같은 의미를 가지는 네이밍을 고려해보시면 조금 더 네이밍으로 의도를 드러낼 수 있지 않을까 싶어요. 😁

package blackjack.domain

data class Player(val playerName: PlayerName, val mutableCards: MutableCards) {
fun addCard(card: Card) {
Copy link

Choose a reason for hiding this comment

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

현실에서 참가자가 카드를 한장 가져가는 것을 어떻게 표현하면 조금 더 역할이 드러날 수 있을까요? 👀
현실 세계에 빗대어서 네이밍을 고려해보시면 어떨까요? 😁

Comment on lines +8 to +10
fun toPlayerNamesString(): String {
return players.joinToString(", ") { it.playerName.name }
}
Copy link

Choose a reason for hiding this comment

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

Players 객체가 출력을 위한 행위를하고있네요? 🤔
바로 아래로직에서 한 것처럼 InitBlackJackView에서 출력을 위해 프로퍼티로부터 직접 name을 가져와서 출력을 위한 형태로 변경해보면 어떨까요?

@@ -0,0 +1,38 @@
package blackjack.view
Copy link

Choose a reason for hiding this comment

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

Controller클래스도 view 패키지에 위치하고있네요. 👀
view랑은 별도의 패키지에 두는게 조금 좋을 것 같아요. 😃

Comment on lines +6 to +8
require(sumCardValues() <= MutableCards.MAX_SUM_CARD_VALUES) {
playerName.name + " Bust! / " + mutableCards.cardsToString()
}
Copy link

Choose a reason for hiding this comment

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

현재 21점을 넘어서 Bust가 되는 경우에는 바로 블랙잭 게임이 종료되는대요.
플레이어의 점수가 Bust되더라도 블랙잭 게임이 바로 종료되면 안될 것 같아요. 🙄

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants