Skip to content

[2단계 - 로또 구현] 포츈(정윤성) 미션 제출합니다. #312

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

Merged
merged 32 commits into from
Feb 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e6e39bb
add step1 code
javajigi Jun 10, 2019
6a50db6
add Lotto, WinningLotto
javajigi Jun 10, 2019
ed49fab
fix(Rank) : 4등 이하에서 보너스 번호로 인해, 당첨결과를 못뽑는 로직에러 수정
unluckyjung Feb 22, 2021
fcb6154
refactor : unmodifiable을 방어적 복사로 수정
unluckyjung Feb 23, 2021
908f436
docs(기능목록) : 기능목록 작성
unluckyjung Feb 23, 2021
16ba132
refactor : 로또 티켓을 인터페이스로한 수동티켓, 자동 티켓 분할
unluckyjung Feb 23, 2021
da1d0b8
test(LottoTicketTest) : 로또 티켓의 타입이 맞는지 확인하는 기능
unluckyjung Feb 23, 2021
fb9813f
feat : 로또 티켓 뭉치에서 수동티켓과 자동티켓의 개수를 세는 기능
unluckyjung Feb 23, 2021
fda4f66
refactor(LottoNumbers) : 로또 넘버를 정렬하는 기능
unluckyjung Feb 23, 2021
f34bd1a
feat(LottoManualTicketCount) : 구매하려는 수동 티켓의 개수를 확인하는 기능 구현
unluckyjung Feb 24, 2021
f16fefa
feat(LottoGameUtils) : 문자열로 받은 로또 번호들을 split해서 리턴해주는 유틸기능 구현
unluckyjung Feb 24, 2021
ad7ca4d
feat(LottoTicketMachine) : 로또 티켓을 수동으로 구매하는 기능 추가
unluckyjung Feb 24, 2021
d1ec4c8
feat(LottoTickets) : 로또 티켓을 이어 붙이는 기능 구현
unluckyjung Feb 24, 2021
b313cd9
refactor(LottoManualTicketCount) : coun가 스스로 남아있는지 확인하게 수정
unluckyjung Feb 24, 2021
aa08243
refactor(LottoGame) : 도메인에 맞춰 컨트롤러 수정
unluckyjung Feb 24, 2021
44364aa
refactor(view) : view 수정 및 구현
unluckyjung Feb 24, 2021
a6f9a84
Merge remote-tracking branch 'origin/step2' into step2
unluckyjung Feb 24, 2021
cd6d368
refactor(LottoNumber) : 로또 넘버들을 캐싱해놓고, 로또 넘버를 던져주기
unluckyjung Feb 24, 2021
326f964
refactor : 로또 번호 생성방식 변경으로 인한 수정
unluckyjung Feb 24, 2021
a544799
refactor(LottoGameController) : 결과 화면에 맞춰서 공백 출력
unluckyjung Feb 24, 2021
275b54a
docs(기능목록) : 구현한 기능목록 정리
unluckyjung Feb 24, 2021
d461d8e
fix : 머지될때 추가된 포비의 코드들 삭제
unluckyjung Feb 25, 2021
ade76bb
fix : 머지될때 추가된 포비의 코드들 삭제
unluckyjung Feb 25, 2021
d084da2
refactor : LottoGameUtil의 기능을 LottoNumbers로 이관
unluckyjung Feb 26, 2021
586f7f1
refactor : 사용되지 않는 메소드 삭제
unluckyjung Feb 26, 2021
1d6867e
refactor : 타입을 나누었던 로또 티켓을 다시 한개의 로또 티켓으로 수정
unluckyjung Feb 26, 2021
ed12c8a
refactor : view 에서 로또 번호 리스트를 받아오게 수정
unluckyjung Feb 26, 2021
3ee8b13
refactor : 자바 컨벤션 적용
unluckyjung Feb 26, 2021
397aa44
refactor : 사용되지 않는 메소드 삭제
unluckyjung Feb 26, 2021
1d1aa7e
refactor(InputView) : 요구사항에 맞춰서 결과 입, 출력
unluckyjung Feb 26, 2021
542cb5a
Merge remote-tracking branch 'origin/step2' into step2
unluckyjung Feb 26, 2021
c4e7e22
refactor(LottoTicket) : 상수로 수정
unluckyjung Feb 27, 2021
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
42 changes: 41 additions & 1 deletion docs/기능목록.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,44 @@
- [x] 당첨된 티켓 개수 저장하는 기능
- [x] 수익률을 계산하는 기능
- [x] 당첨된 수익금을 더하는 기능
- [x] 구입금액 기준 수익률 계산하는 기능
- [x] 구입금액 기준 수익률 계산하는 기능

---

## 로또 수동 구매 기능목록

- [x] 수동으로 구매할 로또 티켓의 수를 입력 받는 기능
- [x] 숫자를 입력 받는 기능
- [x] 숫자인지 확인하는 기능
- [x] 양의 정수인지 확인하는 기능
- [x] 보유한 금액에 맞는 티켓을 구매하려는지 확인하는 기능

- [x] 수동으로 구매할 번호를 입력 받는 기능
- [x] `,` 단위로 잘라내는 기능
- [x] 숫자인지 판별하는 기능
- [x] 1~45 사이의 숫자인지 판별하는 기능
- [x] 중복숫자인지 판별하는 기능
- [x] 잘라낸 숫자의 개수가 6개인지 판별하는 기능

- [x] 로또 번호를 정렬하는 기능

- [x] 수동으로 구매한 개수, 자동으로 구매한 개수를 출력하는 기능
- [x] 티켓 뭉치에서 수동이 몇갠지 찾는 기능
- [x] 티켓 뭉치에서 자동이 몇갠지 찾는 기능

- [x] 수동으로 로또 티켓을 구매하는 기능

---

## 코드리뷰 리팩토링
- [x] 유틸리티 클래스 없애기
- [x] 문자열 형태의 로또 번호들을 자르는 역할을 Utils 에서 LottoNumbers로 이관

- [x] 로또 수동 번호 입력을 List로 받기
- [x] view 단에서 시도 횟수 검증하기
- [x] 로또 수동 번호 입력 받기

- [x] 인터페이스로 나눈 LottoTicket 다시 합치기
- [x] 인자없이 로또 티켓을 만드려고 하면 자동으로 만들기
- [x] numbers가 인자로 들어오면 수동으로 만들기

13 changes: 12 additions & 1 deletion src/main/java/lottogame/controller/LottoGameController.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,18 @@ public LottoGameController(LottoGame lottoGame) {
}

public void buyTickets() {
lottoGame.buyTickets(new Money(InputView.getMoneyInput()));
Money money = new Money(InputView.getMoneyInput());
System.out.println();
buyManualTickets(money);
buyAutoTickets(money);
}

private void buyManualTickets(Money money) {
lottoGame.buyManualTickets(money, InputView.getManualLottoNumbers(money));
}

private void buyAutoTickets(Money money) {
lottoGame.buyAutoTickets(money);
}

public void printBroughtLottoTickets() {
Expand Down
12 changes: 9 additions & 3 deletions src/main/java/lottogame/domain/LottoGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,18 @@ public class LottoGame {

private LottoNumber drawnBonusNumber;
private LottoNumbers drawnWinningNumbers;
private LottoTickets lottoTickets;
private LottoGameResult lottoGameResult;
private final LottoTickets lottoTickets = new LottoTickets();
private final LottoTicketMachine lottoTicketMachine = new LottoTicketMachine();

public void buyTickets(final Money money) {
this.lottoTickets = lottoTicketMachine.buyTickets(money);
public void buyManualTickets(final Money money, final List<String> LottoNumbersGroup) {
for (String lottoNumbers : LottoNumbersGroup) {
this.lottoTickets.add(lottoTicketMachine.buyManualTicket(money, lottoNumbers));
}
}

public void buyAutoTickets(final Money money) {
this.lottoTickets.concat(lottoTicketMachine.buyAutoTickets(money));
}

public void drawWinningNumber(final String winningNumbers, final String bonusNumber) {
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/lottogame/domain/LottoGameResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import lottogame.domain.ticket.LottoTicketResult;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -27,7 +26,7 @@ public LottoGameResult(final List<LottoTicketResult> winningTickets) {
}

public Map<Rank, Integer> toMap() {
return Collections.unmodifiableMap(lottoGameResult);
return new LinkedHashMap<>(lottoGameResult);
}

public double getLottoGameYield(final int ticketCount) {
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/lottogame/domain/Rank.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ public enum Rank {
this.messageFormat = messageFormat;
}

public static Rank getRank(LottoTicketResult lottoTicketResult) {
public static Rank getRank(final LottoTicketResult lottoTicketResult) {
return Arrays.stream(values())
.filter(rank -> rank.matchCount == lottoTicketResult.getMatchCount())
.filter(rank -> rank.isBonusMatch == lottoTicketResult.isBonusMatched())
.findAny()
.filter(rank -> !rank.equals(RANK3) || rank.isBonusMatch == lottoTicketResult.isBonusMatched())
.findFirst()
.orElse(FAIL);
}

Expand Down
13 changes: 11 additions & 2 deletions src/main/java/lottogame/domain/machine/LottoTicketMachine.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
package lottogame.domain.machine;

import lottogame.domain.Money;
import lottogame.domain.number.LottoNumbers;
import lottogame.domain.ticket.LottoTicket;
import lottogame.domain.ticket.LottoTickets;

public class LottoTicketMachine {

public static final int TICKET_PRICE = 1000;

public LottoTickets buyTickets(final Money money) {
public LottoTickets buyAutoTickets(final Money money) {
LottoTickets lottoTickets = new LottoTickets();

while (money.isCanBuy(TICKET_PRICE)) {
lottoTickets.add(new LottoTicket());
lottoTickets.add(LottoTicket.of());
money.use(TICKET_PRICE);
}
return lottoTickets;
}

public LottoTicket buyManualTicket(final Money money, final String selectedLottoNumbers) {
if (!money.isCanBuy(TICKET_PRICE)) {
throw new IllegalArgumentException("남은 금액이 모자릅니다.");
}
money.use(TICKET_PRICE);
return LottoTicket.of(new LottoNumbers(selectedLottoNumbers));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,21 @@
import lottogame.domain.number.LottoNumber;
import lottogame.domain.number.LottoNumbers;

import java.util.ArrayList;
import java.util.List;

public class LottoWinningDrawingMachine {

public static final String DELIMITER = ",";
private LottoNumbers lottoNumbers;

public LottoNumbers drawing(String drawingNumbers) {
drawingNumbers = drawingNumbers.replaceAll(" ", "");
final List<LottoNumber> lottoNumberGroup = new ArrayList<>();

for (String number : drawingNumbers.split(DELIMITER)) {
lottoNumberGroup.add(new LottoNumber(number));
}
return lottoNumbers = new LottoNumbers(lottoNumberGroup);
public LottoNumbers drawing(final String drawingNumbers) {
return lottoNumbers = new LottoNumbers(drawingNumbers);
}

public LottoNumber bonusDrawing(final String drawingNumber) {
validBonusNumber(drawingNumber);
return new LottoNumber(drawingNumber);
return LottoNumber.of(drawingNumber);
}

private void validBonusNumber(final String bonusNumber) {
if (lottoNumbers.contains(new LottoNumber(bonusNumber))) {
if (lottoNumbers.contains(LottoNumber.of(bonusNumber))) {
throw new IllegalArgumentException("보너스 번호가 당첨번호와 중복됩니다.");
}
}
Expand Down
22 changes: 18 additions & 4 deletions src/main/java/lottogame/domain/number/LottoNumber.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package lottogame.domain.number;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class LottoNumber {
Expand All @@ -8,17 +10,29 @@ public class LottoNumber {
private static final int FINISH_NUMBER = 45;

private final int value;
private static final Map<Integer, LottoNumber> LOTTO_NUMBER_MAP = new HashMap<>();

public LottoNumber(final String value) {
this(Integer.parseInt(value));
static {
for (int number = START_NUMBER; number <= FINISH_NUMBER; ++number) {
LOTTO_NUMBER_MAP.put(number, new LottoNumber(number));
}
}

public LottoNumber(final int value) {
private LottoNumber(final int value) {
validateRange(value);
this.value = value;
}

private void validateRange(final int value) {
public static LottoNumber of(final String value) {
return LottoNumber.of(Integer.parseInt(value));
}

public static LottoNumber of(final int value) {
validateRange(value);
return LottoNumber.LOTTO_NUMBER_MAP.get(value);
}

private static void validateRange(final int value) {
if (value < START_NUMBER || FINISH_NUMBER < value) {
throw new IllegalArgumentException("로또 숫자 범위를 벗어났습니다.");
}
Expand Down
21 changes: 19 additions & 2 deletions src/main/java/lottogame/domain/number/LottoNumbers.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,43 @@
package lottogame.domain.number;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;

public class LottoNumbers {

public static final int DRAWING_COUNT_LIMIT = 6;
public static final String DELIMITER = ",";

private final List<LottoNumber> lottoNumbers;

public LottoNumbers(final String lottoNumbers) {
this(getSplitLottoNumbersByString(lottoNumbers));
}

public LottoNumbers(final List<LottoNumber> lottoNumbers) {
validDrawingNumbers(lottoNumbers);
lottoNumbers.sort((Comparator.comparingInt(LottoNumber::getValue)));
this.lottoNumbers = new ArrayList<>(lottoNumbers);
}

private static List<LottoNumber> getSplitLottoNumbersByString(String lottoNumbers) {
lottoNumbers = lottoNumbers.replaceAll(" ", "");
final List<LottoNumber> lottoNumberGroup = new ArrayList<>();

for (String number : lottoNumbers.split(DELIMITER)) {
lottoNumberGroup.add(LottoNumber.of(number));
}
return lottoNumberGroup;
}
Comment on lines +25 to +33
Copy link
Author

Choose a reason for hiding this comment

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

기존 util 에 있던 문자열을 잘라내면서 lottoNumber로 만드는 작업을 LottoNumbers로 이관시켜줬어요.
이전에는 중복되는 기능이니까 유틸로 빼야지 ~ 하고 넘겼었는데, 다음부터는 이 책임을 적절히 수행할 수 있는 다른 객체가 있는지 한번더 찾아볼것 같아요.


public boolean contains(final LottoNumber lottoNumber) {
return lottoNumbers.contains(lottoNumber);
}

public List<LottoNumber> toList() {
return Collections.unmodifiableList(new ArrayList<>(this.lottoNumbers));
return new ArrayList<>(this.lottoNumbers);
}

private void validDrawingNumbers(final List<LottoNumber> lottoNumbers) {
Expand Down
47 changes: 33 additions & 14 deletions src/main/java/lottogame/domain/ticket/LottoTicket.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,59 @@

public class LottoTicket {

public static final int START_LOTTO_NUMBER = 1;
public static final int FINISH_LOTTO_NUMBER = 45;
public static final int COUNT_LOTTO_NUMBER = 6;
private static final int START_LOTTO_NUMBER = 1;
private static final int FINISH_LOTTO_NUMBER = 45;
private static final int COUNT_LOTTO_NUMBER = 6;

private final LottoNumbers lottoNumbers;
private final boolean isAuto;

public LottoTicket() {

private LottoTicket(final LottoNumbers lottoNumbers, final boolean isAuto) {
this.lottoNumbers = new LottoNumbers(lottoNumbers.toList());
this.isAuto = isAuto;
}

public static LottoTicket of() {
return new LottoTicket(getAutoNumbers(), true);
}

public static LottoTicket of(final LottoNumbers lottoNumbers) {
return new LottoTicket(lottoNumbers, false);
}

private static LottoNumbers getAutoNumbers() {
List<LottoNumber> lottoNumberGroup = new ArrayList<>();
for (int number : getShuffledNumbers(new ArrayList<>())) {
lottoNumberGroup.add(new LottoNumber(number));
for (int number : getShuffledNumbers()) {
lottoNumberGroup.add(LottoNumber.of(number));
}
lottoNumbers = new LottoNumbers(lottoNumberGroup);
return new LottoNumbers(lottoNumberGroup);
}

private List<Integer> getShuffledNumbers(List<Integer> numbers) {
private static List<Integer> getShuffledNumbers() {
List<Integer> numbers = new ArrayList<>();
Collections.shuffle(initNumbers(numbers));

List<Integer> shuffledNumbers = numbers.subList(0, COUNT_LOTTO_NUMBER);
Collections.sort(shuffledNumbers);
return shuffledNumbers;
return numbers.subList(0, COUNT_LOTTO_NUMBER);
}

private List<Integer> initNumbers(List<Integer> numbers) {
private static List<Integer> initNumbers(final List<Integer> numbers) {
for (int i = START_LOTTO_NUMBER; i <= FINISH_LOTTO_NUMBER; i++) {
numbers.add(i);
}
return numbers;
}


public List<LottoNumber> getLottoNumbers() {
return Collections.unmodifiableList(lottoNumbers.toList());
return new ArrayList<>(lottoNumbers.toList());
}

public boolean isContainNumber(final LottoNumber lottoNumber){
public boolean isContainNumber(LottoNumber lottoNumber) {
return lottoNumbers.contains(lottoNumber);
}

public boolean isAutoTicket() {
return isAuto;
}
}
26 changes: 21 additions & 5 deletions src/main/java/lottogame/domain/ticket/LottoTickets.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,41 @@
import lottogame.domain.machine.LottoWinningMachine;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class LottoTickets {

public static final int TICKET_PRICE = 1000;
private int autoTicketCount;

List<LottoTicket> lottoTickets = new ArrayList<>();
private final List<LottoTicket> lottoTickets = new ArrayList<>();

public void add(final LottoTicket lottoTicket) {
lottoTickets.add(lottoTicket);
countAutoTicket(lottoTicket);
}

private void countAutoTicket(final LottoTicket lottoTicket) {
if (lottoTicket.isAutoTicket()) {
autoTicketCount++;
}
}

public void concat(final LottoTickets lottoTickets) {
this.lottoTickets.addAll(lottoTickets.toList());
this.autoTicketCount += lottoTickets.getAutoTicketsCount();
}

public List<LottoTicket> toList() {
return Collections.unmodifiableList(lottoTickets);
return new ArrayList<>(lottoTickets);
}

public int getAutoTicketsCount() {
return autoTicketCount;
}

public int getTicketsCount() {
return lottoTickets.size();
public int getManualTicketsCount() {
return lottoTickets.size() - autoTicketCount;
}

public int getCostUsedToBuy() {
Expand Down
Loading