-
Notifications
You must be signed in to change notification settings - Fork 357
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
Step4 수동 로또 #1134
base: goodbyeyo
Are you sure you want to change the base?
Step4 수동 로또 #1134
Conversation
1. WinningLotto 제거하고 담당하던 책임 LottoTicket 으로 이동 2. LottoTicket 프로퍼티 변경 : List<Int> -> Set<LottoNumber> 3. LottoTicket 프로퍼티 기반으로 위임하도록 변경, 부생성자 추가 4. LottoTicket 정적팩토리메서드 추가
* feat: Lotto 도메인 테스트 및 구현 * feat: 로또 번호, 티켓 발급 기능 구현 및 테스트 * refactor: Test 코드 내 도메인 로직 Class 분리 리팩토링 * feat: 당첨 로또 기능 구현 * feat: 로또 컨트롤러, 입출력 뷰 구현 * refactor: 피드백 반영, LottoTickets.calculateLottoRank 테스트 추가 * refactor: 피드백 반영 1. WinningLotto 제거하고 담당하던 책임 LottoTicket 으로 이동 2. LottoTicket 프로퍼티 변경 : List<Int> -> Set<LottoNumber> 3. LottoTicket 프로퍼티 기반으로 위임하도록 변경, 부생성자 추가 4. LottoTicket 정적팩토리메서드 추가 * doc: STEP3 로또2등 요구구사항 정리 * feat: 보너스번호 도메인 구현 * feat: 보너스 번호 일치여부 구현 * feat: 로또 2등 기능 구현 1. LottoRank : 로또 랭크 판단 조건, 상금 변경 2. LottoTicket : 당첨 로또 계산 위임(WinningLotto) 3. LottoTicket : data class 변경 (피드백 반영) 4. 당첨 로또 계산 시 보너스 번호가 포함된 WinningLotto 전달 5. 당첨 결과 출력 보너스 번호 일치 여부 출력 6. 테스트 코드 2등 로또 반영 * refactor: 피드백 반영 1. BonusNumber 제거하고 WinningLotto 가 직접 책임을 담당하도록 변경 2. WinningLotto 생성자 인자 팩토리 메서드(동반 객체 메서드) 구조로 전달 3. LottoNumber 정적 팩터리 메서드 추가
* feat: Lotto 도메인 테스트 및 구현 * feat: 로또 번호, 티켓 발급 기능 구현 및 테스트 * refactor: Test 코드 내 도메인 로직 Class 분리 리팩토링 * feat: 당첨 로또 기능 구현 * feat: 로또 컨트롤러, 입출력 뷰 구현 * refactor: 피드백 반영, LottoTickets.calculateLottoRank 테스트 추가 * refactor: 피드백 반영 1. WinningLotto 제거하고 담당하던 책임 LottoTicket 으로 이동 2. LottoTicket 프로퍼티 변경 : List<Int> -> Set<LottoNumber> 3. LottoTicket 프로퍼티 기반으로 위임하도록 변경, 부생성자 추가 4. LottoTicket 정적팩토리메서드 추가 * doc: STEP3 로또2등 요구구사항 정리 * feat: 보너스번호 도메인 구현 * feat: 보너스 번호 일치여부 구현 * feat: 로또 2등 기능 구현 1. LottoRank : 로또 랭크 판단 조건, 상금 변경 2. LottoTicket : 당첨 로또 계산 위임(WinningLotto) 3. LottoTicket : data class 변경 (피드백 반영) 4. 당첨 로또 계산 시 보너스 번호가 포함된 WinningLotto 전달 5. 당첨 결과 출력 보너스 번호 일치 여부 출력 6. 테스트 코드 2등 로또 반영 * refactor: 피드백 반영 1. BonusNumber 제거하고 WinningLotto 가 직접 책임을 담당하도록 변경 2. WinningLotto 생성자 인자 팩토리 메서드(동반 객체 메서드) 구조로 전달 3. LottoNumber 정적 팩터리 메서드 추가
1. LottoNumber private 생성자로 변경 2. LottoNumber 필드 접근을 위한 메서드 추가
- LOTTO_NUMBER_POLL 활용하도록 LottoNumber 생성자 대신 정적 팩토리 메서드 호출
* feat: Lotto 도메인 테스트 및 구현 * feat: 로또 번호, 티켓 발급 기능 구현 및 테스트 * refactor: Test 코드 내 도메인 로직 Class 분리 리팩토링 * feat: 당첨 로또 기능 구현 * feat: 로또 컨트롤러, 입출력 뷰 구현 * refactor: 피드백 반영, LottoTickets.calculateLottoRank 테스트 추가 * refactor: 피드백 반영 1. WinningLotto 제거하고 담당하던 책임 LottoTicket 으로 이동 2. LottoTicket 프로퍼티 변경 : List<Int> -> Set<LottoNumber> 3. LottoTicket 프로퍼티 기반으로 위임하도록 변경, 부생성자 추가 4. LottoTicket 정적팩토리메서드 추가 * doc: STEP3 로또2등 요구구사항 정리 * feat: 보너스번호 도메인 구현 * feat: 보너스 번호 일치여부 구현 * feat: 로또 2등 기능 구현 1. LottoRank : 로또 랭크 판단 조건, 상금 변경 2. LottoTicket : 당첨 로또 계산 위임(WinningLotto) 3. LottoTicket : data class 변경 (피드백 반영) 4. 당첨 로또 계산 시 보너스 번호가 포함된 WinningLotto 전달 5. 당첨 결과 출력 보너스 번호 일치 여부 출력 6. 테스트 코드 2등 로또 반영 * refactor: 피드백 반영 1. BonusNumber 제거하고 WinningLotto 가 직접 책임을 담당하도록 변경 2. WinningLotto 생성자 인자 팩토리 메서드(동반 객체 메서드) 구조로 전달 3. LottoNumber 정적 팩터리 메서드 추가
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요!
step4 구현 잘해주셨네요 💯
몇가지 코멘트를 남겼으니 확인부탁드릴게요~!
return PurchaseDetail(purchaseAmount, manualLottoTickets) | ||
} | ||
|
||
private fun getManualLottoTickets(manualLottoQuantity: Int): LottoTickets { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LottoTicket을 만드는 책임이 View에 있는 것 같아요! 자동로또와 동일�한 레벨로 옮겨보면 어떨까요?
repeat(manualLottoQuantity) { | ||
val line = readlnOrNull()?.takeIf { it.isNotBlank() } ?: throw IllegalArgumentException("로또 번호를 입력해주세요.") | ||
val numbers = | ||
line.split(DELIMITER) | ||
.map { it.trim().toIntOrNull() ?: throw IllegalArgumentException("로또 번호는 숫자여야 합니다.") } | ||
manualLottoTickets.add(LottoTicket.from(numbers.toSet())) | ||
} | ||
return LottoTickets(manualLottoTickets) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://kotlinlang.org/docs/constructing-collections.html#initializer-functions-for-lists
위 문서를 참고하여 mutableListOf없이 만드는 법도 알아보시면 좋을 것 같습니다!
import lotto.domain.LottoTickets | ||
import lotto.domain.LottoTickets.Companion.LOTTO_TICKET_PRICE | ||
|
||
data class PurchaseDetail( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그리고 DTO 는 메서드로 접근하지 않고 바로 필드에 접근해도 괜찮은지 선호님의 생각이 궁금합니다.
getPurchaseAmount
가 아닌 purchaseAmount
를 바로 호출하는 것과 관련해서 말씀주시는게 맞을까요??
https://velog.io/@paulus0617/kotlin-getter-setter 요글을 읽어보시면 프로퍼티는 필드(Field)와 접근자 메서드(getter, setter)를 하나로 합친 것을 의미합니다.
라고 되어있는데요!
그래서 코틀린 진영에서는 필드가 아닌 프로퍼티라는 네이밍으로 사용하고 있습니다 :)
디컴파일 해보시면 실제 javaCode에서는 getPurchaseAmount
를 통해 접근하시는걸 확인하실 수 있을거에요!
혹시 제가 질문을 잘 못이해한거라면 다시한번 말씀부탁드림니다!
import lotto.domain.LottoTickets.Companion.LOTTO_TICKET_PRICE | ||
|
||
data class PurchaseDetail( | ||
val purchaseAmount: Int, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://edu.nextstep.camp/s/l3Ppxbm8/ls/ROS71xiT 에 보면 모든 원시 값과 문자열을 포장한다.
라고 되어있는데요!! purchaseAmout도 Money와 같은 객체로 포장해볼 수 있지 않을까요??
purchaseAmount: Int, | ||
manualLottoTickets: LottoTickets, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
부생성자와 팩터리 메서드 두가지 방식으로 구현이 가능했을 것 같은데요!
부생성자 방식을 선택하신 이유가 있을까요! 혹은 상욱님만의 기준이 있을까요?
- InputView 로또 생성 역할 위임 -> LottoTicket
- immutableList 사용하도록 변경
1. purchaseAmount 원시값 포장 2. PurchaseDetail 팩터리 메서드 추가
1. purchaseAmount 원시값 포장 2. PurchaseDetail 팩터리 메서드 추가
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요! :)
리뷰 반영까지 잘 해주셨네요~!
DM으로 코멘트 드린 부분만 확인한번 부탁드립니다!
마지막까지 화이팅하세요! :)
@@ -19,13 +19,21 @@ class LottoTickets(private val lottoTickets: List<LottoTicket>) : Collection<Lot | |||
} | |||
|
|||
companion object { | |||
private const val LOTTO_TICKET_PRICE = 1000 | |||
const val LOTTO_TICKET_PRICE = 1000 | |||
|
|||
fun purchase(amount: Int): LottoTickets { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 함수는 이제 미사용으로 보이네요! :)
안녕하세요 🙂
수동 로또 리뷰 부탁드립니다.
참 PR 요청하는데
Can’t automatically merge.
메세지가 뜨는데 왜 그런걸까요? 🥲그리고 DTO 는 메서드로 접근하지 않고 바로 필드에 접근해도 괜찮은지 선호님의 생각이 궁금합니다.