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

[Step2] 2단계 - 로또(자동) #1139

Merged
merged 13 commits into from
Dec 31, 2024
Merged

Conversation

eunice0035
Copy link

@eunice0035 eunice0035 commented Dec 23, 2024

2단계 로또 구현 제출합니다~

Copy link
Member

@wisemuji wisemuji left a comment

Choose a reason for hiding this comment

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

안녕하세요 은성님!

다음 단계로 넘어가기 전에 몇 가지 개선해보면 좋을 포인트가 있어 남깁니다! 🙂

궁금한 점이나 논의해보고 싶은 내용이 있으시다면 언제든 알려주세요!

package lotto.domain

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*
Copy link
Member

Choose a reason for hiding this comment

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

Ktlint가 깨지고 있습니다! 참고로 IntelliJ에서는 다음 단축키로 코드를 포맷할 수 있습니다.

  • Win: Ctrl + Alt + L
  • MacOS: Cmd + Alt + L

val resultView = ResultView()

val amount = inputView.getMoney()
val lottoCount = amount / 1000
Copy link
Member

Choose a reason for hiding this comment

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

이 로직은 자동차 경주 5단계의 그림에 의하면 컨트롤러가 아니라, 도메인에 위치해야 하지 않을까요?

image

}

fun printResults(
results: Map<Int, Int>,
Copy link
Member

Choose a reason for hiding this comment

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

다른 개발자들도 Map<Int, Int>가 어떤 의미인지 이해할 수 있을까요?
외부에서 값을 꺼내어(get)조작하기보다, 의미있는 객체를 만들고 메세지만 던져보세요!
아래 글이 도움되길 바랍니다!

Copy link
Author

Choose a reason for hiding this comment

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

LottoResult 클래스로 wrapping 해보았습니다. get을 사용하지 않고 구현하는 것이 아직은 어렵네요ㅠ

import org.junit.jupiter.api.Test

class LottoCalculatorTest {
private val calculator = LottoCalculator()
Copy link
Member

Choose a reason for hiding this comment

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

LottoCalculator는 커밋되지 않은 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

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

빠졌었네요ㅠ 추가로 커밋했습니다!


class LottoMaker {
fun makeLotto(): Lotto {
return Lotto((START_NUMBER..END_NUMBER).shuffled().take(LOTTO_COUNT).sorted())
Copy link
Member

Choose a reason for hiding this comment

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

랜덤 로직을 참조하고 있는 테스트는 매번 실행할때마다 어떤 결과가 나올지 보장할 수 없습니다.
실제 객체에 버그가 있다고 하더라도 운이 좋게 통과할수도, 운이 나쁘게 실패할 수도 있다는 의미입니다.
아래 글이 도움되길 바랍니다 🙂

Copy link
Author

Choose a reason for hiding this comment

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

LottoMaker를 외부에서 주입받을 수 있도록 변경해보았습니다

fun `Lotto - shoule be in range(1-45)`() {
val lottoMaker = LottoMaker()
val lotto = lottoMaker.makeLotto()
assertTrue(lotto.numbers.all { it in 1..45 })
Copy link
Member

Choose a reason for hiding this comment

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

assert 구문에 대한 다음 시각도 있으니 참고 부탁드립니다!

Copy link
Author

Choose a reason for hiding this comment

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

assert가 아닌 shouldbe로 테스트 코드를 변경해보았습니다.

Copy link
Member

@wisemuji wisemuji left a comment

Choose a reason for hiding this comment

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

안녕하세요 은성님! 리뷰 반영을 잘 해주셨습니다 💯

조금 고민해보시면 좋을 내용을 코멘트로 달았으니 다음 단계 미션 진행해주시면서 같이 반영해주시면 됩니다

다음 단계도 화이팅입니다 💪

Comment on lines +17 to +25
lottoResult.getResults().entries.sumOf { (match, count) ->
when (match) {
3 -> 5000 * count
4 -> 50000 * count
5 -> 1500000 * count
6 -> 2000000000 * count
else -> 0
}
}
Copy link
Member

Choose a reason for hiding this comment

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

다음 단계를 진행하시면서 아래 요구 사항에 맞게 enum 클래스를 활용해 보시고 이전과 어떻게 달라졌는지 직접 확인해보시면 더욱 의미있을 것 같아요!

Enum 클래스를 적용해 프로그래밍을 구현한다.

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

class LottoCalculator {
Copy link
Member

Choose a reason for hiding this comment

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

LottoCalculator라는 이름만 보고도 현재 하고 있는 행동(수익률 계산, 로또 결과 판단)을 예측할 수 있을까요?

Copy link
Member

Choose a reason for hiding this comment

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

여러 가지 해결 방법이 있겠지만, 잘 Wrapping해주신 LottoResult를 외부에서 생성해주지 말고, 객체 스스로 판단하여 Result를 생성할 수 있도록 만드는 것도 하나의 방법이 될 수 있을 것 같아요 🙂

fun makeTicket(amount: Int): LottoTicket {
val lottoMaker = LottoMaker.defaultMaker()
val lottoCount = amount / 1000
return LottoTicket(List(lottoCount) { lottoMaker.makeLotto() })
Copy link
Member

Choose a reason for hiding this comment

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

리뷰를 잘 반영해서 도메인 로직을 도메인 객체에 잘 위임해주셨어요!
이러한 로직을 부생성자로 만드는 것도 충분히 고려해볼 수 있을 것 같은데요,
부생성자에 대한 아래와 같은 시각도 있으니 참고해보시면 도움이 되실 것 같습니다 🙂

Copy link
Member

Choose a reason for hiding this comment

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

더불어 이 로직도 테스트 코드로 검증해보면 어떨까요?

@wisemuji wisemuji merged commit 2f2e082 into next-step:eunice0035 Dec 31, 2024
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