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단계 블랙잭 제출합니다. #8

Merged
merged 67 commits into from
Mar 6, 2023

Conversation

re4rk
Copy link

@re4rk re4rk commented Mar 2, 2023

안녕하세요 리뷰어님!
코드 구현은 기존에 하던대로 구현하고 추후에 DSL을 적용하여 구현을 하였습니다!

re4rk added 30 commits February 28, 2023 13:40
Copy link

@woowajames woowajames left a comment

Choose a reason for hiding this comment

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

아크 안녕하세요.
블랙잭 미션 구현 하시느라 고생하셨습니다. 👍
코멘트 확인 후 충분히 고민하시고 다시 리뷰 요청해주세요.

@Test
fun company() {
val person = introduce {
name("로피")

Choose a reason for hiding this comment

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

정말 사소한 것이지만 페어가 아닌 본인 닉네임을 사용하면 좋았을 것 같아요.

}

fun skills(block: SkillsBuilder.() -> Unit) {
skills = SkillsBuilder().apply { block() }.build()

Choose a reason for hiding this comment

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

introduce() 함수에서 사용한 것처럼 이런 식으로도 사용 가능하겠죠? 하나의 방식으로 모두 통일하면 좀 더 보기 좋지 않을까 싶어요.
SkillsBuilder().apply(block).build()

Comment on lines 30 to 31
val soft = MutableList(0) { "" }
val hard = MutableList(0) { "" }

Choose a reason for hiding this comment

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

private이면 더욱 좋겠네요. 그리고 Skills라는 타입도 이미 있는데 soft, hard 두 개의 프로퍼티를 하나로 줄여볼 수도 있지 않을까요? 🤔

var korean = 0
var english = 0

fun build(): Languages = Languages(korean, english)

Choose a reason for hiding this comment

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

Korean, English 외 언어에 관한 입력은 처리가 불가능한 형태입니다. Skills를 참고하여 변경해보면 좋겠네요.

Comment on lines 93 to 94
assertThat(person.skills.soft.size).isEqualTo(2)
assertThat(person.skills.hard.size).isEqualTo(1)

Choose a reason for hiding this comment

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

hard 스킬에 kotlin을 넣으려고 의도했지만 오류로 결과적으로 java라는 값이 들어갈 수도 있다면 이 테스트 코드가 그걸 검증해 줄 수 있나요? 개인적으로는 심리적 안정감에 도움이 되지 않는 테스트 코드라고 생각합니다.

class CardDeckTest {

@Test
fun `카드덱 잘 있는지 확인`() {

Choose a reason for hiding this comment

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

잘 있는게 뭔가요? 어떤 상태가 잘 있는거죠? 무엇을 테스트하는 것인지 좀 더 상세하고 명확하게 작성해주세요.(이하 동일)

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class CardValueTest {

Choose a reason for hiding this comment

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

ParameterizedTest를 통해서 좀 더 간결하게 바꿀 수 있을 것 같아요.

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

data class BlackJack(

Choose a reason for hiding this comment

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

3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

위 요구 사항을 지켜보면 어떨까요?

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

import blackjack.domain.BlackJackGame.Companion.BLACKJACK_NUMBER

Choose a reason for hiding this comment

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

BLACKJACK_NUMBER는 단 하나의 클래스에서만 다룰 수 있는 방향을 고민해보면 좋겠습니다.

- [X] 게임 초기 세팅을 한다.
- [X] 중간결과를 반환한다.
- [X] 최종결과를 반환한다.

Choose a reason for hiding this comment

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

다음 사항에 관한 구현 여부를 확인해보세요. 기본적인 기능 요구 사항을 만족하지 않고 있습니다.

  • 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다.
  • 플레이어는 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. (현재 플레이어 카드가 K, ACE 일 때도 카드를 더 받을 것인지 묻고 있습니다. Ace를 언제 1 또는 11로 계산할지 좀 더 고민이 필요해보여요.)

re4rk added 26 commits March 3, 2023 15:14
Copy link

@woowajames woowajames left a comment

Choose a reason for hiding this comment

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

아크 블랙잭 1단계 구현 잘해주셨습니다. 💯
몇 가지 코멘트 남겼으니 확인하시고 다음 단계에 함께 반영해주세요!
다음 단계 진행을 위해 merge 하겠습니다!

Comment on lines 9 to 10
@CsvSource(value = ["ACE,1", "KING,10", "QUEEN,10", "JACK,10", "TEN,10", "NINE,9", "EIGHT,8", "SEVEN,7", "SIX,6", "FIVE,5", "FOUR,4", "THREE,3", "TWO,2"])
fun `카드의 값들이 나온다`(cardValue: CardValue, value: Int) {

Choose a reason for hiding this comment

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

CsvSource 활용 좋네요! 훨씬 깔끔해졌어요! 👍

Comment on lines 11 to 12
val size: Int
get() = cards.size

Choose a reason for hiding this comment

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

코틀린 컨벤션에 따라 위치를 조정하면 좋을 것 같아요.

  1. Property declarations and initializer blocks
  2. Secondary constructors
  3. Method declarations
  4. Companion object


operator fun plus(card: Card): Cards = Cards(cards.plus(card))

fun containsACE() = cards.map { it.value }.contains(CardValue.ACE)

Choose a reason for hiding this comment

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

isContainsAce()라는 네이밍이 좀 더 어울리지 않을까요?

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

class Score(val cards: Cards) {

Choose a reason for hiding this comment

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

Score에 대한 테스트 코드도 작성해보시죠!

Comment on lines 13 to 17
private val validateAceCondition: Boolean
get() = minScore + ACE_OTHER_NUMBER_DIFF <= BLACKJACK_NUMBER

private val isMaxScoreInRange: Boolean
get() = maxScore <= BLACKJACK_NUMBER

Choose a reason for hiding this comment

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

보통 Boolean 타입은 is로 시작하죠. 네이밍에 일관성을 맞추면 더 좋겠어요.


companion object {
private const val ACE_OTHER_NUMBER_DIFF = 10
private const val BLACKJACK_NUMBER = 21

Choose a reason for hiding this comment

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

BLACKJACK_NUMBER = 21
같은 상수가 여러 곳에서 사용중입니다. 만약 해당 값에 변경이 발생한다면 모두 찾아서 변경해줘야 하며 실수로 빠뜨리면 버그가 발생할 수 있습니다. 하나의 상수로 해결 할 수 있는 구조에 대해 고민해보면 어떨까요?

package blackjack.domain

@JvmInline
value class Name(private val value: String) {

Choose a reason for hiding this comment

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

value class 사용 굿 👍

Comment on lines 10 to 22
fun User.winTo(other: User): Outcome =
when {
other.score > BLACKJACK_NUMBER && this.score > BLACKJACK_NUMBER -> DRAW
other.score > BLACKJACK_NUMBER -> WIN
this.score > BLACKJACK_NUMBER -> LOSE

other.score == this.score -> DRAW
this.score > other.score -> WIN
other.score > this.score -> LOSE

else -> throw IllegalStateException()
}
}

Choose a reason for hiding this comment

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

Comment on lines 19 to 25
fun `ACE 카드가 있는지 확인 할 수 있다`() {
var cards = Cards()
cards += Card(CLOVER, EIGHT)
assertThat(cards.containsACE()).isFalse
cards += Card(CLOVER, ACE)
assertThat(cards.containsACE()).isTrue
}

Choose a reason for hiding this comment

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

두 가지 테스트를 동시에 하기보다는 분리하면 좋습니다.
예를 들면

  1. ACE 카드가 없으면 false를 반환한다
  2. ACE 카드가 있으면 true를 반환한다

Comment on lines 12 to 13
assertThat(card.mark).isEqualTo(mark)
assertThat(card.value).isEqualTo(value)

Choose a reason for hiding this comment

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

assertAll 에 대해 찾아보고 적용해보면 좋을 것 같아요.

@woowajames woowajames merged commit 27d0e6c into woowacourse:re4rk Mar 6, 2023
@re4rk re4rk deleted the step1 branch March 6, 2023 12:18
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