diff --git a/src/main/java/lottogame/controller/LottoPurchaseRequest.java b/src/main/java/lottogame/controller/LottoPurchaseRequest.java new file mode 100644 index 0000000000..090298c568 --- /dev/null +++ b/src/main/java/lottogame/controller/LottoPurchaseRequest.java @@ -0,0 +1,22 @@ +package lottogame.controller; + +import java.util.List; +import lottogame.model.price.LottoPurchasePrice; +import lottogame.model.winner.WinnerResult; + +public record LottoPurchaseRequest( + LottoPurchasePrice lottoPurchasePrice, + List manualLottos +) { + + public int calculateAutoLottoCount(int perLottoPrice) { + int totalLottoCount = this.lottoPurchasePrice.calculateLottoCount(perLottoPrice); + int manualLottoCount = this.manualLottos.size(); + + return totalLottoCount - manualLottoCount; + } + + public double getRateOfReturn(WinnerResult winnerResult) { + return this.lottoPurchasePrice.calculateRateOfReturn(winnerResult.sumTotalWinReturn()); + } +} diff --git a/src/main/java/lottogame/controller/LottoStore.java b/src/main/java/lottogame/controller/LottoStore.java index 81f41a168d..403837c6b9 100644 --- a/src/main/java/lottogame/controller/LottoStore.java +++ b/src/main/java/lottogame/controller/LottoStore.java @@ -1,52 +1,62 @@ package lottogame.controller; import static lottogame.model.lotto.LottoMachine.PER_LOTTO_PRICE; -import static lottogame.view.Casher.askBeforeWinNums; +import static lottogame.model.lotto.LottoNum.of; import static lottogame.view.Casher.askBonusNum; import static lottogame.view.Casher.askBuyPrice; +import static lottogame.view.Casher.askLottoNums; +import static lottogame.view.Casher.askManualLottos; import static lottogame.view.Casher.informBuyCount; import static lottogame.view.Casher.informPublishedLottos; import static lottogame.view.Casher.informWinResult; +import java.util.List; import java.util.Set; -import lottogame.model.lotto.Lotto; import lottogame.model.lotto.LottoMachine; import lottogame.model.lotto.LottoNum; import lottogame.model.lotto.Lottos; import lottogame.model.lotto.WinningLottoNums; +import lottogame.model.lotto.generator.LottosGenerator; import lottogame.model.price.LottoPurchasePrice; import lottogame.model.winner.WinnerResult; public class LottoStore { + public static final int PER_LOTTO_PRICE = 1_000; public void start() { - LottoPurchasePrice lottoPurchasePrice = getLottoPurchasePrice(); - LottoMachine lottoMachine = new LottoMachine(); + LottoPurchaseRequest lottoPurchaseRequest = getPurchaseInfosFromUser(); - Lottos lottos = buyLottos(lottoMachine, lottoPurchasePrice); + Lottos lottos = buyLottos(lottoPurchaseRequest); - WinnerResult winnerResult = lottos.compareAndElectWinResult( - getWinningLottoNums(lottoMachine)); + WinnerResult winnerResult = lottos.compareAndElectWinResult(getWinningLottoNums()); - informWinResult(winnerResult, lottoPurchasePrice); + informWinResult(winnerResult, lottoPurchaseRequest.getRateOfReturn(winnerResult)); } - private LottoPurchasePrice getLottoPurchasePrice() { + private LottoPurchaseRequest getPurchaseInfosFromUser() { LottoPurchasePrice lottoPurchasePrice = new LottoPurchasePrice(askBuyPrice()); - informBuyCount(lottoPurchasePrice.calculateLottoCount(PER_LOTTO_PRICE)); + List manualLottos = askManualLottos(); - return lottoPurchasePrice; + informBuyCount( + lottoPurchasePrice.calculateLottoCount(PER_LOTTO_PRICE), + manualLottos.size() + ); + + return new LottoPurchaseRequest(lottoPurchasePrice, manualLottos); } - private Lottos buyLottos(LottoMachine lottoMachine, LottoPurchasePrice lottoPurchasePrice) { - Lottos lottos = lottoMachine.publish(lottoPurchasePrice); + private Lottos buyLottos(LottoPurchaseRequest lottoPurchaseRequest) { + Lottos lottos = LottoMachine.createTotallyLottos( + lottoPurchaseRequest.calculateAutoLottoCount(PER_LOTTO_PRICE), lottoPurchaseRequest.manualLottos()); + informPublishedLottos(lottos.convertRawString()); + return lottos; } - private WinningLottoNums getWinningLottoNums(LottoMachine lottoMachine) { - Set lottoByNums = lottoMachine.createLottoByNums(askBeforeWinNums()); - LottoNum bonusNum = lottoMachine.getLottoNum(askBonusNum()); + private WinningLottoNums getWinningLottoNums() { + Set lottoByNums = LottoMachine.createLottoNums(askLottoNums()); + LottoNum bonusNum = of(askBonusNum()); return new WinningLottoNums(lottoByNums, bonusNum); } diff --git a/src/main/java/lottogame/model/lotto/LottoMachine.java b/src/main/java/lottogame/model/lotto/LottoMachine.java index 7e84f159c8..55b54a24ac 100644 --- a/src/main/java/lottogame/model/lotto/LottoMachine.java +++ b/src/main/java/lottogame/model/lotto/LottoMachine.java @@ -1,72 +1,47 @@ package lottogame.model.lotto; import static java.util.stream.IntStream.range; -import static lottogame.model.lotto.LottoNum.MAX_NUM; -import static lottogame.model.lotto.LottoNum.MIN_NUM; +import static lottogame.model.util.StringUtils.splitAndParseToInt; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Random; import java.util.Set; import java.util.stream.Collectors; -import lottogame.model.price.LottoPurchasePrice; +import lottogame.model.lotto.generator.AutoLottoGenerator; +import lottogame.model.lotto.generator.ManualLottosGenerator; public class LottoMachine { - public static final int MIN_NUM = 1; - public static final int MAX_NUM = 45; public static final int LOTTO_NUM_COUNT = 6; public static final int PER_LOTTO_PRICE = 1_000; + public static final String DELIMITER = ", "; - private static final Random RANDOM = new Random(); + public static Lottos createTotallyLottos(int autoLottoCount, List manualLottoNums) { + Lottos autoLottos = new AutoLottoGenerator(autoLottoCount).generateLottos(); + Lottos manualLottos = new ManualLottosGenerator(manualLottoNums).generateLottos(); - private static final Map LOTTO_NUM_POOL = new HashMap<>(); - - static { - range(MIN_NUM, MAX_NUM + 1).forEach( - num -> LOTTO_NUM_POOL.put(num, new LottoNum(num)) - ); + return autoLottos.merge(manualLottos); } - public Lottos publish(LottoPurchasePrice lottoPurchasePrice) { - List lottos = range(0, lottoPurchasePrice.calculateLottoCount(PER_LOTTO_PRICE)) - .mapToObj(idx -> - new Lotto( - createLottoByCount(LOTTO_NUM_COUNT) - ) - ).toList(); - - return new Lottos(lottos); - } - - public LottoNum getLottoNum(int num) { - return LOTTO_NUM_POOL.get(num); - } - - private Set createLottoByCount(int numCount) { - if (numCount <= 0) { - throw new IllegalArgumentException("생성할 로또의 로또번호 갯수를 입력해 주세요."); - } - - Set lottoNums = new HashSet<>(); - while (lottoNums.size() < numCount) { - LottoNum lottoNum = getLottoNum(RANDOM.nextInt(MIN_NUM, MAX_NUM)); - lottoNums.add(lottoNum); + public static Set createLottoNums(Set rawNums) { + if (rawNums.isEmpty() || rawNums.size() != LOTTO_NUM_COUNT) { + throw new IllegalArgumentException("생성할 로또의 로또번호 갯수를 정확히 입력해 주세요."); } - return lottoNums; + return rawNums.stream() + .map(LottoNum::of) + .collect(Collectors.toSet()); } - public Set createLottoByNums(Set rawNums) { - if (rawNums.isEmpty() || rawNums.size() != LOTTO_NUM_COUNT) { + public static Set createLottoNums(String rawNums) { + if (rawNums.isEmpty()) { throw new IllegalArgumentException("생성할 로또의 로또번호 갯수를 정확히 입력해 주세요."); } - return rawNums.stream() - .map(LOTTO_NUM_POOL::get) - .collect(Collectors.toSet()); + return createLottoNums(splitAndParseToInt(rawNums, DELIMITER)); } + + } diff --git a/src/main/java/lottogame/model/lotto/LottoNum.java b/src/main/java/lottogame/model/lotto/LottoNum.java index 601ea9ddb9..48260b2f13 100644 --- a/src/main/java/lottogame/model/lotto/LottoNum.java +++ b/src/main/java/lottogame/model/lotto/LottoNum.java @@ -1,14 +1,29 @@ package lottogame.model.lotto; +import static java.util.stream.IntStream.range; + +import java.util.HashMap; +import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +public class LottoNum implements Comparable { -public class LottoNum implements Comparable{ public static final int MIN_NUM = 1; public static final int MAX_NUM = 45; + private static final Map CACHE = new HashMap<>(); + private final int num; - public LottoNum(int num) { + static { + range(MIN_NUM, MAX_NUM + 1).forEach( + num -> CACHE.put(num, new LottoNum(num)) + ); + } + + private LottoNum(int num) { if (isOutOfLottoRange(num)) { throw new IllegalArgumentException("1부터 45사이의 숫자만 입력해주세요."); } @@ -16,19 +31,37 @@ public LottoNum(int num) { this.num = num; } - private boolean isOutOfLottoRange(int num) { - return num < MIN_NUM || num > MAX_NUM; + public static LottoNum of(int num) { + if (isOutOfLottoRange(num)) { + throw new IllegalArgumentException("1부터 45사이의 숫자만 입력해주세요."); + } + + return CACHE.get(num); } - @Override - public int compareTo(LottoNum o) { - return Integer.compare(this.num, o.num); + public static Set convertToBundle(Set lottoNums) { + if (Objects.isNull(lottoNums) || lottoNums.isEmpty()) { + throw new IllegalArgumentException("비정상적인 파라미터 입니다."); + } + + return lottoNums.stream() + .map(LottoNum::of) + .collect(Collectors.toSet()); + } + + private static boolean isOutOfLottoRange(int num) { + return num < MIN_NUM || num > MAX_NUM; } public String toString() { return String.valueOf(num); } + @Override + public int compareTo(LottoNum o) { + return Integer.compare(num, o.num); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/lottogame/model/lotto/Lottos.java b/src/main/java/lottogame/model/lotto/Lottos.java index e563eaee8c..7511f9cc61 100644 --- a/src/main/java/lottogame/model/lotto/Lottos.java +++ b/src/main/java/lottogame/model/lotto/Lottos.java @@ -1,7 +1,8 @@ package lottogame.model.lotto; +import java.util.ArrayList; import java.util.List; -import lottogame.model.winner.WinStandard; +import lottogame.model.winner.Rank; import lottogame.model.winner.WinnerResult; public class Lottos { @@ -15,8 +16,8 @@ public Lottos(List lottos) { public WinnerResult compareAndElectWinResult(final WinningLottoNums winningLottoNums) { WinnerResult winnerResult = new WinnerResult(); for (Lotto lotto : lottos) { - WinStandard winStandard = winningLottoNums.checkIfWin(lotto); - winnerResult.addWinResult(winStandard); + Rank RANK = winningLottoNums.checkIfWin(lotto); + winnerResult.addWinResult(RANK); } return winnerResult; @@ -31,4 +32,11 @@ public List convertRawString() { .map(Lotto::toString) .toList(); } + + public Lottos merge(Lottos additionalLottos) { + List mergedLottos = new ArrayList<>(this.lottos); + mergedLottos.addAll(additionalLottos.lottos); + + return new Lottos(mergedLottos); + } } diff --git a/src/main/java/lottogame/model/lotto/WinningLottoNums.java b/src/main/java/lottogame/model/lotto/WinningLottoNums.java index 146e063e8a..d5844cf259 100644 --- a/src/main/java/lottogame/model/lotto/WinningLottoNums.java +++ b/src/main/java/lottogame/model/lotto/WinningLottoNums.java @@ -1,7 +1,7 @@ package lottogame.model.lotto; import java.util.Set; -import lottogame.model.winner.WinStandard; +import lottogame.model.winner.Rank; public class WinningLottoNums { private final Lotto winLotto; @@ -20,10 +20,10 @@ public WinningLottoNums(Lotto winLotto, LottoNum bonusNums) { this.bonusNums = bonusNums; } - public WinStandard checkIfWin(Lotto otherLotto) { + public Rank checkIfWin(Lotto otherLotto) { int matchCount = this.winLotto.findMatchCountBy(otherLotto); boolean isMatchBonus = otherLotto.isContain(bonusNums); - return WinStandard.findBy(matchCount, isMatchBonus); + return Rank.findBy(matchCount, isMatchBonus); } } diff --git a/src/main/java/lottogame/model/lotto/generator/AutoLottoGenerator.java b/src/main/java/lottogame/model/lotto/generator/AutoLottoGenerator.java new file mode 100644 index 0000000000..afb0377dfb --- /dev/null +++ b/src/main/java/lottogame/model/lotto/generator/AutoLottoGenerator.java @@ -0,0 +1,50 @@ +package lottogame.model.lotto.generator; + +import static java.util.stream.IntStream.*; +import static lottogame.model.lotto.LottoMachine.LOTTO_NUM_COUNT; +import static lottogame.model.lotto.LottoNum.of; + +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; +import lottogame.model.lotto.Lotto; +import lottogame.model.lotto.LottoNum; +import lottogame.model.lotto.Lottos; + +public class AutoLottoGenerator implements LottosGenerator{ + public static final int MIN_NUM = 1; + public static final int MAX_NUM = 45; + + private static final Random RANDOM = new Random(); + + private final int autoLottoCount; + + public AutoLottoGenerator(int autoLottoCount) { + this.autoLottoCount = autoLottoCount; + } + + @Override + public Lottos generateLottos() { + List lottos = range(0, autoLottoCount) + .mapToObj(idx -> createLottoByCount()) + .map(Lotto::new) + .toList(); + + return new Lottos(lottos); + } + + private Set createLottoByCount() { + Set lottoNums = new HashSet<>(); + while (lottoNums.size() < LOTTO_NUM_COUNT) { + LottoNum lottoNum = of(getRandomNum()); + lottoNums.add(lottoNum); + } + + return lottoNums; + } + + private int getRandomNum() { + return RANDOM.nextInt(MIN_NUM, MAX_NUM); + } +} diff --git a/src/main/java/lottogame/model/lotto/generator/LottosGenerator.java b/src/main/java/lottogame/model/lotto/generator/LottosGenerator.java new file mode 100644 index 0000000000..cad55a6298 --- /dev/null +++ b/src/main/java/lottogame/model/lotto/generator/LottosGenerator.java @@ -0,0 +1,9 @@ +package lottogame.model.lotto.generator; + +import lottogame.model.lotto.Lottos; + +public interface LottosGenerator { + + Lottos generateLottos(); + +} diff --git a/src/main/java/lottogame/model/lotto/generator/ManualLottosGenerator.java b/src/main/java/lottogame/model/lotto/generator/ManualLottosGenerator.java new file mode 100644 index 0000000000..9445bec801 --- /dev/null +++ b/src/main/java/lottogame/model/lotto/generator/ManualLottosGenerator.java @@ -0,0 +1,38 @@ +package lottogame.model.lotto.generator; + +import static java.util.Objects.isNull; +import static lottogame.model.lotto.LottoMachine.DELIMITER; +import static lottogame.model.lotto.LottoNum.convertToBundle; +import static lottogame.model.util.StringUtils.splitAndParseToInt; + +import java.util.List; +import java.util.Set; +import lottogame.model.lotto.Lotto; +import lottogame.model.lotto.LottoNum; +import lottogame.model.lotto.Lottos; + +public class ManualLottosGenerator implements LottosGenerator { + + private final List manualLottos; + + public ManualLottosGenerator(List manualLottos) { + if (isNull(manualLottos) || manualLottos.isEmpty()) { + throw new IllegalArgumentException("수동로또 번호를 적어주세요."); + } + + this.manualLottos = manualLottos; + } + + @Override + public Lottos generateLottos() { + List manualLottos = this.manualLottos.stream() + .map(lottoNums -> { + Set manualLottoNums = convertToBundle( + splitAndParseToInt(lottoNums, DELIMITER)); + + return new Lotto(manualLottoNums); + }).toList(); + + return new Lottos(manualLottos); + } +} diff --git a/src/main/java/lottogame/model/price/LottoPurchasePrice.java b/src/main/java/lottogame/model/price/LottoPurchasePrice.java index 9fc712fcb3..d29acd28cc 100644 --- a/src/main/java/lottogame/model/price/LottoPurchasePrice.java +++ b/src/main/java/lottogame/model/price/LottoPurchasePrice.java @@ -1,6 +1,13 @@ package lottogame.model.price; +import static java.lang.Math.floor; + +import lottogame.model.winner.WinnerResult; + public class LottoPurchasePrice { + private static final int UP_TWO_DECIMAL_PLACE = 100; + private static final double DOWN_TWO_DECIMAL_PLACE = 100.0; + private final int price; public LottoPurchasePrice(int price) { @@ -19,15 +26,14 @@ public int calculateLottoCount(int perLottoPrice) { return price / perLottoPrice; } + public double calculateRateOfReturn(int totalWinReturn) { if (totalWinReturn < 0) { throw new IllegalArgumentException("잘못된 값입니다."); } - return (double) totalWinReturn / this.price; - } + double rateOfReturn = (double) totalWinReturn / this.price * UP_TWO_DECIMAL_PLACE; - public int price() { - return this.price; + return floor(rateOfReturn) / DOWN_TWO_DECIMAL_PLACE; } } diff --git a/src/main/java/lottogame/model/util/StringUtils.java b/src/main/java/lottogame/model/util/StringUtils.java new file mode 100644 index 0000000000..c98f82dd5c --- /dev/null +++ b/src/main/java/lottogame/model/util/StringUtils.java @@ -0,0 +1,16 @@ +package lottogame.model.util; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class StringUtils { + + public static Set splitAndParseToInt(String rawValue, String delimiter) { + Set inputLottoNums = Arrays.stream(rawValue.split(delimiter)) + .map(Integer::parseInt) + .collect(Collectors.toSet()); + + return inputLottoNums; + } +} diff --git a/src/main/java/lottogame/model/winner/WinStandard.java b/src/main/java/lottogame/model/winner/Rank.java similarity index 74% rename from src/main/java/lottogame/model/winner/WinStandard.java rename to src/main/java/lottogame/model/winner/Rank.java index 2f1b36a3c3..f92cd2d4a0 100644 --- a/src/main/java/lottogame/model/winner/WinStandard.java +++ b/src/main/java/lottogame/model/winner/Rank.java @@ -4,7 +4,7 @@ import java.util.Map; import java.util.stream.Collectors; -public enum WinStandard { +public enum Rank { FIRST("1등", 6, false, 2_000_000_000), SECOND("2등", 5, true, 30_000_000), THIRD("3등", 5, false, 1_500_000), @@ -19,15 +19,15 @@ public enum WinStandard { private final boolean isBonus; private final int returnOfWin; - WinStandard(String desc, int value, boolean isBonus, int returnOfWin) { + Rank(String desc, int value, boolean isBonus, int returnOfWin) { this.desc = desc; this.value = value; this.isBonus = isBonus; this.returnOfWin = returnOfWin; } - public static WinStandard findBy(int value, boolean isBonus) { - return Arrays.stream(WinStandard.values()) + public static Rank findBy(int value, boolean isBonus) { + return Arrays.stream(Rank.values()) .filter(winStandard -> winStandard.value == value) .filter(winStandard -> winStandard.isBonus == isBonus) .findFirst().orElse(NOTHING); @@ -37,12 +37,8 @@ public boolean isNothing() { return this == NOTHING; } - public int returnOfWin() { - return this.returnOfWin; - } - - public static Map getInitWinStandardMap() { - return Arrays.stream(WinStandard.values()) + public static Map getInitWinStandardMap() { + return Arrays.stream(Rank.values()) .filter(winStandard -> !winStandard.isNothing()) .collect(Collectors.toMap( winStandard -> winStandard, @@ -53,4 +49,8 @@ public static Map getInitWinStandardMap() { public int value() { return this.value; } + + public int calculateWinReturn(int winCount) { + return this.returnOfWin * winCount; + } } diff --git a/src/main/java/lottogame/model/winner/WinnerResult.java b/src/main/java/lottogame/model/winner/WinnerResult.java index b556b7aee4..ca204af803 100644 --- a/src/main/java/lottogame/model/winner/WinnerResult.java +++ b/src/main/java/lottogame/model/winner/WinnerResult.java @@ -9,18 +9,18 @@ public class WinnerResult { - private Map winStandardToWinCount; + private Map winStandardToWinCount; public WinnerResult() { this(getInitWinStandardMap()); } - public WinnerResult(Map winStandardToWinCount) { + public WinnerResult(Map winStandardToWinCount) { this.winStandardToWinCount = winStandardToWinCount; } - private static Map getInitWinStandardMap() { - return Arrays.stream(WinStandard.values()) + private static Map getInitWinStandardMap() { + return Arrays.stream(Rank.values()) .filter(winStandard -> !winStandard.isNothing()) .collect(Collectors.toMap( Function.identity(), @@ -28,28 +28,28 @@ private static Map getInitWinStandardMap() { )); } - public void addWinResult(WinStandard winStandard) { - if (isNull(winStandard)) { + public void addWinResult(Rank rank) { + if (isNull(rank)) { return; } - if (winStandard.isNothing()) { + if (rank.isNothing()) { return; } - Integer countBy = this.winStandardToWinCount.getOrDefault(winStandard, 0); + Integer countBy = this.winStandardToWinCount.getOrDefault(rank, 0); this.winStandardToWinCount.put( - winStandard, + rank, countBy + 1 ); } - public int findWinCount(WinStandard winStandard) { - if (isNull(winStandard) || winStandard.isNothing()) { + public int findWinCount(Rank rank) { + if (isNull(rank) || rank.isNothing()) { return 0; } - return this.winStandardToWinCount.get(winStandard); + return this.winStandardToWinCount.get(rank); } public int sumTotalWinReturn() { @@ -58,7 +58,7 @@ public int sumTotalWinReturn() { .sum(); } - private int calculateWinReturnBy(WinStandard winStandard) { - return winStandard.returnOfWin() * this.winStandardToWinCount.get(winStandard); + private int calculateWinReturnBy(Rank rank) { + return rank.calculateWinReturn(this.findWinCount(rank)); } } diff --git a/src/main/java/lottogame/view/Casher.java b/src/main/java/lottogame/view/Casher.java index cf6b1314b3..be9295f579 100644 --- a/src/main/java/lottogame/view/Casher.java +++ b/src/main/java/lottogame/view/Casher.java @@ -1,17 +1,18 @@ package lottogame.view; -import static java.lang.Math.floor; -import static lottogame.model.winner.WinStandard.FIFTH; -import static lottogame.model.winner.WinStandard.FIRST; -import static lottogame.model.winner.WinStandard.FOURTH; -import static lottogame.model.winner.WinStandard.SECOND; -import static lottogame.model.winner.WinStandard.THIRD; +import static lottogame.model.lotto.LottoMachine.LOTTO_NUM_COUNT; +import static lottogame.model.winner.Rank.FIFTH; +import static lottogame.model.winner.Rank.FIRST; +import static lottogame.model.winner.Rank.FOURTH; +import static lottogame.model.winner.Rank.SECOND; +import static lottogame.model.winner.Rank.THIRD; +import static lottogame.view.InputView.inputString; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import lottogame.model.price.LottoPurchasePrice; import lottogame.model.winner.WinnerResult; public class Casher { @@ -21,25 +22,41 @@ public class Casher { private static final String THIRD_WIN_MESSAGE = "5개 일치 (1500000원)- "; private static final String FOURTH_WIN_MESSAGE = "4개 일치 (50000원)- "; private static final String FIFTH_WIN_MESSAGE = "3개 일치 (5000원)- "; - private static final int UP_TWO_DECIMAL_PLACE = 100; - private static final double DOWN_TWO_DECIMAL_PLACE = 100.0; public static int askBuyPrice() { OutputView.printQuestionByBuyPrice(); return InputView.inputInt(); } - public static void informBuyCount(int buyCount) { - OutputView.printBuyLottoCount(buyCount); + public static void informBuyCount(int autoCount, int manualCount) { + OutputView.printBuyLottoCount(autoCount, manualCount); } - public static Set askBeforeWinNums() { + public static List askManualLottos() { + return askManualLottoNums(askManualLottoCount()); + } + + private static int askManualLottoCount() { + OutputView.printQuestionManualLottoCount(); + + return InputView.inputInt(); + } + + private static List askManualLottoNums(int manualCount) { + List rawManualNums = new ArrayList<>(); + + OutputView.printQuestionManualLottoNums(); + for (int i = 0; i < manualCount; i++) { + rawManualNums.add(inputString()); + } + + return rawManualNums; + } + + public static String askLottoNums() { OutputView.printQuestionBeforeWinNums(); - String rawValue = InputView.inputString(); - return Arrays.stream(rawValue.split(", ")) - .map(Integer::parseInt) - .collect(Collectors.toSet()); + return inputString(); } public static int askBonusNum() { @@ -53,21 +70,14 @@ public static void informPublishedLottos(List perLottoNums) { } } - public static void informWinResult(WinnerResult winnerResult, LottoPurchasePrice lottoPurchasePrice) { + public static void informWinResult(WinnerResult winnerResult, double rateOfReturn) { String msg = FIRST_WIN_MESSAGE + winnerResult.findWinCount(FIRST) + "개\n" + SECOND_WIN_MESSAGE + winnerResult.findWinCount(SECOND) + "개\n" + THIRD_WIN_MESSAGE + winnerResult.findWinCount(THIRD) + "개\n" + FOURTH_WIN_MESSAGE + winnerResult.findWinCount(FOURTH) + "개\n" + FIFTH_WIN_MESSAGE + winnerResult.findWinCount(FIFTH) + "개\n" - + "총 수익률은 " + polishedRateOfReturn(winnerResult, lottoPurchasePrice) + "입니다."; + + "총 수익률은 " + rateOfReturn + "입니다."; OutputView.printWinResultMsg(msg); } - - private static String polishedRateOfReturn(WinnerResult winnerResult, LottoPurchasePrice lottoPurchasePrice) { - int totalWinReturn = winnerResult.sumTotalWinReturn(); - double rateOfReturn = lottoPurchasePrice.calculateRateOfReturn(totalWinReturn) * UP_TWO_DECIMAL_PLACE; - - return String.valueOf(floor(rateOfReturn) / DOWN_TWO_DECIMAL_PLACE); - } } diff --git a/src/main/java/lottogame/view/OutputView.java b/src/main/java/lottogame/view/OutputView.java index 5e076b531d..f2e610e4f9 100644 --- a/src/main/java/lottogame/view/OutputView.java +++ b/src/main/java/lottogame/view/OutputView.java @@ -1,13 +1,25 @@ package lottogame.view; -public class OutputView { +public class +OutputView { public static void printQuestionByBuyPrice() { System.out.println("구입금액을 입력해 주세요"); } - public static void printBuyLottoCount(int count) { - System.out.println(count + "개를 구매했습니다."); + public static void printQuestionManualLottoCount() { + System.out.println("수동으로 구매할 로또 수를 입력해주세요"); + } + + public static void printQuestionManualLottoNums() { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + + public static void printBuyLottoCount(int autoCount, int manualCount) { + System.out.println( + "수동으로 " + manualCount + "장 " + + "자동으로 " +autoCount + "개를 구매했습니다." + ); } public static void printPerLottoNums(String perLottoNums) { diff --git a/src/test/java/lottogame/controller/LottoPurchaseRequestTest.java b/src/test/java/lottogame/controller/LottoPurchaseRequestTest.java new file mode 100644 index 0000000000..1ddc5e47d5 --- /dev/null +++ b/src/test/java/lottogame/controller/LottoPurchaseRequestTest.java @@ -0,0 +1,23 @@ +package lottogame.controller; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import lottogame.model.price.LottoPurchasePrice; +import org.junit.jupiter.api.Test; + +class LottoPurchaseRequestTest { + + @Test + void 자동로또의_갯수를_계산할_수_있다() { + List manualList = List.of("1, 2, 3, 4, 5, 6"); + + LottoPurchaseRequest lottoPurchaseRequest = new LottoPurchaseRequest( + new LottoPurchasePrice(10000), manualList + ); + + assertThat( + lottoPurchaseRequest.calculateAutoLottoCount(1000) + ).isEqualTo(9); + } +} \ No newline at end of file diff --git a/src/test/java/lottogame/fixture/LottoFixture.java b/src/test/java/lottogame/fixture/LottoFixture.java index 3d0e2fba15..8d5b8cd37b 100644 --- a/src/test/java/lottogame/fixture/LottoFixture.java +++ b/src/test/java/lottogame/fixture/LottoFixture.java @@ -17,7 +17,7 @@ public class LottoFixture { private static Set createLottoNumsInRange(int start, int end) { Set lottoNums = new HashSet<>(); for (int i = start; i <= end; i++) { - lottoNums.add(new LottoNum(i)); + lottoNums.add(LottoNum.of(i)); } return lottoNums; diff --git a/src/test/java/lottogame/model/lotto/LottoMachineTest.java b/src/test/java/lottogame/model/lotto/LottoMachineTest.java index 1c227dc7fb..88fb8873db 100644 --- a/src/test/java/lottogame/model/lotto/LottoMachineTest.java +++ b/src/test/java/lottogame/model/lotto/LottoMachineTest.java @@ -1,39 +1,55 @@ package lottogame.model.lotto; -import static lottogame.model.lotto.LottoMachine.PER_LOTTO_PRICE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.List; import java.util.Set; -import lottogame.model.price.LottoPurchasePrice; import org.junit.jupiter.api.Test; class LottoMachineTest { @Test - void 사용자의금액만큼_로또를_발행할_수_있다() { - LottoMachine lottoMachine = new LottoMachine(); - LottoPurchasePrice lottoPurchasePrice = new LottoPurchasePrice(14000); - Lottos lotto = lottoMachine.publish(lottoPurchasePrice); + void 사용자의_요청값만큼_자동_수동로또를_발행할_수_있다() { + Lottos lotto = LottoMachine.createTotallyLottos(5, List.of("1, 2, 3, 4, 5, 6")); assertThat( lotto.size() - ).isEqualTo( - lottoPurchasePrice.calculateLottoCount(PER_LOTTO_PRICE) - ); + ).isEqualTo(6); } @Test - void 요청받은_갯수만큼_로또번호목록을_생성할_수_있다() { + void SET으로_요청받은_갯수만큼_로또번호목록을_생성할_수_있다() { assertThat( - new LottoMachine().createLottoByNums(Set.of(1, 2, 3, 4, 5, 6)).size() + LottoMachine.createLottoNums(Set.of(1, 2, 3, 4, 5, 6)).size() ).isEqualTo(6); } @Test - void 요청받은_갯수가_0이하면_예외처리_할_수_있다() { + void SET으로_요청받은_갯수가_0이하면_예외처리_할_수_있다() { + assertThatThrownBy( + () -> LottoMachine.createLottoNums(Set.of()) + ).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 문자열로_요청받은_갯수만큼_로또번호목록을_생성할_수_있다() { + assertThat( + LottoMachine.createLottoNums("1, 2, 3, 4, 5, 6") + ).contains( + LottoNum.of(1), + LottoNum.of(2), + LottoNum.of(3), + LottoNum.of(4), + LottoNum.of(5), + LottoNum.of(6) + ); + } + + @Test + void 문자열로_요청받은_갯수가_ENPTY라면_예외처리_할_수_있다() { assertThatThrownBy( - () -> new LottoMachine().createLottoByNums(Set.of()) + () -> LottoMachine.createLottoNums("").size() ).isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file diff --git a/src/test/java/lottogame/model/lotto/LottoNumTest.java b/src/test/java/lottogame/model/lotto/LottoNumTest.java index dea325802e..2a94a446c6 100644 --- a/src/test/java/lottogame/model/lotto/LottoNumTest.java +++ b/src/test/java/lottogame/model/lotto/LottoNumTest.java @@ -2,6 +2,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.Set; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -11,7 +14,23 @@ class LottoNumTest { @ValueSource(ints = {0, 46}) void 로또번호가_1미만이거나_45를초과하면_예외처리를_할_수_있다(int num) { assertThatThrownBy( - () -> new LottoNum(num) + () -> LottoNum.of(num) ).isInstanceOf(IllegalArgumentException.class); } + + @Test + void 정수형인_로또번호_Set을_LottoNum_Set으로_변환할_수_있다() { + Assertions.assertThat( + LottoNum.convertToBundle(Set.of(1,2,3,4,5,6)) + ).contains( + LottoNum.of(1), + LottoNum.of(2), + LottoNum.of(3), + LottoNum.of(4), + LottoNum.of(5), + LottoNum.of(6) + ); + } + + } \ No newline at end of file diff --git a/src/test/java/lottogame/model/lotto/LottoTest.java b/src/test/java/lottogame/model/lotto/LottoTest.java index 2f811fb4b5..86ba214d98 100644 --- a/src/test/java/lottogame/model/lotto/LottoTest.java +++ b/src/test/java/lottogame/model/lotto/LottoTest.java @@ -38,7 +38,7 @@ class LottoTest { Lotto lotto = new Lotto(로또번호리스트를_오름차순으로_생성한다(6)); assertThat( - lotto.isContain(new LottoNum(num)) + lotto.isContain(LottoNum.of(num)) ).isEqualTo(expect); } } \ No newline at end of file diff --git a/src/test/java/lottogame/model/lotto/LottosTest.java b/src/test/java/lottogame/model/lotto/LottosTest.java index d1f08076ae..2510bd9a90 100644 --- a/src/test/java/lottogame/model/lotto/LottosTest.java +++ b/src/test/java/lottogame/model/lotto/LottosTest.java @@ -2,11 +2,11 @@ import static lottogame.fixture.LottoFixture.로또번호리스트를_오름차순으로_생성한다; import static lottogame.fixture.LottoFixture.로또번호리스트를_지정해서_생성한다; -import static lottogame.model.winner.WinStandard.FIRST; -import static lottogame.model.winner.WinStandard.FIFTH; -import static lottogame.model.winner.WinStandard.THIRD; -import static lottogame.model.winner.WinStandard.SECOND; -import static lottogame.model.winner.WinStandard.FOURTH; +import static lottogame.model.winner.Rank.FIRST; +import static lottogame.model.winner.Rank.FIFTH; +import static lottogame.model.winner.Rank.THIRD; +import static lottogame.model.winner.Rank.SECOND; +import static lottogame.model.winner.Rank.FOURTH; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; @@ -26,7 +26,7 @@ class LottosTest { ) ); Lotto winLotto = new Lotto(로또번호리스트를_오름차순으로_생성한다(6)); - WinningLottoNums winningLottoNums = new WinningLottoNums(winLotto, new LottoNum(45)); + WinningLottoNums winningLottoNums = new WinningLottoNums(winLotto, LottoNum.of(45)); WinnerResult winnerResult = lottos.compareAndElectWinResult(winningLottoNums); @@ -45,7 +45,7 @@ class LottosTest { ); WinningLottoNums winningLottoNums = new WinningLottoNums( new Lotto(로또번호리스트를_오름차순으로_생성한다(6)), - new LottoNum(7) + LottoNum.of(7) ); WinnerResult winnerResult = lottos.compareAndElectWinResult(winningLottoNums); @@ -61,4 +61,21 @@ class LottosTest { assertThat(lottos.size()).isEqualTo(1); } + + // TODO 사실 이렇게 단순히 사이즈만 테스트 할 수 밖에 없는 상황에서 살짝 불안감을 느낍니다. 이 테스트가 과연 충분할까? 거짓 양성을 심어놓는거 아닐까? 같은 생각들이요. + // 아래 같은 상황은 merge라는 구현방법 자체를 다시 생각해봐야하는 신호일까요? + @Test + void 두개의_로또목록을_병합할_수_있다() { + Lottos baseLottos = new Lottos( + List.of(new Lotto(로또번호리스트를_오름차순으로_생성한다(6))) + ); + Lottos additionalLottos = new Lottos( + List.of(new Lotto(로또번호리스트를_지정해서_생성한다(7, 12))) + ); + + Lottos mergedLottos = baseLottos.merge(additionalLottos); + + assertThat(mergedLottos.size()).isEqualTo(2); + } + } \ No newline at end of file diff --git a/src/test/java/lottogame/model/lotto/WinningLottoNumsTest.java b/src/test/java/lottogame/model/lotto/WinningLottoNumsTest.java index 8fc932ed5a..297e39013a 100644 --- a/src/test/java/lottogame/model/lotto/WinningLottoNumsTest.java +++ b/src/test/java/lottogame/model/lotto/WinningLottoNumsTest.java @@ -5,8 +5,7 @@ import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; -import lottogame.model.winner.WinStandard; -import org.assertj.core.api.Assertions; +import lottogame.model.winner.Rank; import org.junit.jupiter.api.Test; class WinningLottoNumsTest { @@ -15,46 +14,46 @@ class WinningLottoNumsTest { void 입력받은_당첨번호목록과_로또번호가_1등인지_비교할_수_있다() { WinningLottoNums winningLottoNums = new WinningLottoNums( new Lotto(로또번호리스트를_오름차순으로_생성한다(6)), - new LottoNum(7) + LottoNum.of(7) ); Lotto lotto = new Lotto(로또번호리스트를_오름차순으로_생성한다(6)); assertThat( winningLottoNums.checkIfWin(lotto) - ).isEqualTo(WinStandard.FIRST); + ).isEqualTo(Rank.FIRST); } @Test void 입력받은_당첨번호목록과_로또번호가_꽝인지_비교할_수_있다() { WinningLottoNums winningLottoNums = new WinningLottoNums( new Lotto(로또번호리스트를_지정해서_생성한다(6, 11)), - new LottoNum(45) + LottoNum.of(45) ); Lotto lotto = new Lotto(로또번호리스트를_오름차순으로_생성한다(6)); assertThat( winningLottoNums.checkIfWin(lotto) - ).isEqualTo(WinStandard.NOTHING); + ).isEqualTo(Rank.NOTHING); } @Test void 입력받은_당첨번호목록과_보너스볼이_2등인지_비교할_수_있다() { WinningLottoNums winningLottoNums = new WinningLottoNums( new Lotto(로또번호리스트를_지정해서_생성한다(2, 7)), - new LottoNum(1) + LottoNum.of(1) ); Lotto lotto = new Lotto(로또번호리스트를_오름차순으로_생성한다(6)); assertThat( winningLottoNums.checkIfWin(lotto) - ).isEqualTo(WinStandard.SECOND); + ).isEqualTo(Rank.SECOND); } @Test void 입력받은_당첨번호목록에_보너스볼이_존재하면_예외처리_할_수_있다() { assertThatThrownBy( - () -> new WinningLottoNums(new Lotto(로또번호리스트를_지정해서_생성한다(2, 7)), new LottoNum(3)) + () -> new WinningLottoNums(new Lotto(로또번호리스트를_지정해서_생성한다(2, 7)), LottoNum.of(3)) ).isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file diff --git a/src/test/java/lottogame/model/lotto/generator/AutoLottoGeneratorTest.java b/src/test/java/lottogame/model/lotto/generator/AutoLottoGeneratorTest.java new file mode 100644 index 0000000000..5c21c56cd0 --- /dev/null +++ b/src/test/java/lottogame/model/lotto/generator/AutoLottoGeneratorTest.java @@ -0,0 +1,18 @@ +package lottogame.model.lotto.generator; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class AutoLottoGeneratorTest { + + + @Test + void 사용자의금액만큼_자동로또를_발행할_수_있다() { + AutoLottoGenerator autoLottoGenerator = new AutoLottoGenerator(15); + + assertThat( + autoLottoGenerator.generateLottos().size() + ).isEqualTo(15); + } +} \ No newline at end of file diff --git a/src/test/java/lottogame/model/lotto/generator/ManualLottosGeneratorTest.java b/src/test/java/lottogame/model/lotto/generator/ManualLottosGeneratorTest.java new file mode 100644 index 0000000000..6330685dd9 --- /dev/null +++ b/src/test/java/lottogame/model/lotto/generator/ManualLottosGeneratorTest.java @@ -0,0 +1,20 @@ +package lottogame.model.lotto.generator; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.Test; + +class ManualLottosGeneratorTest { + + @Test + void 입력받은_수동로또번호로_수동로또목록을_발행할_수_있다() { + List lottos = List.of("1, 2, 3, 4, 5, 6", "2, 3, 4, 5, 6, 7"); + + ManualLottosGenerator generator = new ManualLottosGenerator(lottos); + + assertThat( + generator.generateLottos().size() + ).isEqualTo(2); + } +} \ No newline at end of file diff --git a/src/test/java/lottogame/model/util/StringUtilsTest.java b/src/test/java/lottogame/model/util/StringUtilsTest.java new file mode 100644 index 0000000000..916ae186de --- /dev/null +++ b/src/test/java/lottogame/model/util/StringUtilsTest.java @@ -0,0 +1,17 @@ +package lottogame.model.util; + + +import static lottogame.model.lotto.LottoMachine.DELIMITER; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class StringUtilsTest { + + @Test + void 입력받은_로또문자열을_구분자에맞게_나누고_정수형으로_변환할_수_있다() { + assertThat( + StringUtils.splitAndParseToInt("1, 2, 3, 4, 5, 6", DELIMITER) + ).contains(1, 2, 3, 4, 5, 6); + } +} \ No newline at end of file diff --git a/src/test/java/lottogame/model/winner/RankTest.java b/src/test/java/lottogame/model/winner/RankTest.java new file mode 100644 index 0000000000..2e61a0e8c1 --- /dev/null +++ b/src/test/java/lottogame/model/winner/RankTest.java @@ -0,0 +1,66 @@ +package lottogame.model.winner; + +import static lottogame.model.winner.Rank.*; +import static lottogame.model.winner.Rank.FIRST; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Map; +import org.junit.jupiter.api.Test; + +class RankTest { + + @Test + void 일등을_집계할_수_있다() { + assertThat( + findBy(6, false) + ).isEqualTo(FIRST); + } + + @Test + void 이등을_집계할_수_있다() { + assertThat( + findBy(5, true) + ).isEqualTo(SECOND); + } + + @Test + void 삼등을_집계할_수_있다() { + assertThat( + findBy(5, false) + ).isEqualTo(THIRD); + } + + @Test + void 사등을_집계할_수_있다() { + assertThat( + findBy(4, false) + ).isEqualTo(FOURTH); + } + + @Test + void 오등을_집계할_수_있다() { + assertThat( + findBy(3, false) + ).isEqualTo(FIFTH); + } + + @Test + void 각등수를_키값으로하고_값이_0인_Map을_생성할_수_있다() { + Map result = getInitWinStandardMap(); + + assertThat(result.get(FIRST)).isEqualTo(0); + assertThat(result.get(SECOND)).isEqualTo(0); + assertThat(result.get(THIRD)).isEqualTo(0); + assertThat(result.get(FOURTH)).isEqualTo(0); + assertThat(result.get(FIFTH)).isEqualTo(0); + } + + @Test + void 등수의_당첨갯수를_통해_총_당첨금액을_계산할_수_있다() { + assertThat(FIRST.calculateWinReturn(2)).isEqualTo(2_000_000_000 * 2); + assertThat(SECOND.calculateWinReturn(2)).isEqualTo(30_000_000 * 2); + assertThat(THIRD.calculateWinReturn(2)).isEqualTo(1_500_000 * 2); + assertThat(FOURTH.calculateWinReturn(2)).isEqualTo(50_000 * 2); + assertThat(FIFTH.calculateWinReturn(2)).isEqualTo(5_000 * 2); + } +} \ No newline at end of file diff --git a/src/test/java/lottogame/model/winner/WinStandardTest.java b/src/test/java/lottogame/model/winner/WinStandardTest.java deleted file mode 100644 index f52f863264..0000000000 --- a/src/test/java/lottogame/model/winner/WinStandardTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package lottogame.model.winner; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Map; -import org.junit.jupiter.api.Test; - -class WinStandardTest { - - @Test - void 일등을_집계할_수_있다() { - assertThat( - WinStandard.findBy(6, false) - ).isEqualTo(WinStandard.FIRST); - } - - @Test - void 이등을_집계할_수_있다() { - assertThat( - WinStandard.findBy(5, true) - ).isEqualTo(WinStandard.SECOND); - } - - @Test - void 삼등을_집계할_수_있다() { - assertThat( - WinStandard.findBy(5, false) - ).isEqualTo(WinStandard.THIRD); - } - - @Test - void 사등을_집계할_수_있다() { - assertThat( - WinStandard.findBy(4, false) - ).isEqualTo(WinStandard.FOURTH); - } - - @Test - void 오등을_집계할_수_있다() { - assertThat( - WinStandard.findBy(3, false) - ).isEqualTo(WinStandard.FIFTH); - } - - @Test - void 각등수를_키값으로하고_값이_0인_Map을_생성할_수_있다() { - Map result = WinStandard.getInitWinStandardMap(); - - assertThat(result.get(WinStandard.FIRST)).isEqualTo(0); - assertThat(result.get(WinStandard.SECOND)).isEqualTo(0); - assertThat(result.get(WinStandard.THIRD)).isEqualTo(0); - assertThat(result.get(WinStandard.FOURTH)).isEqualTo(0); - assertThat(result.get(WinStandard.FIFTH)).isEqualTo(0); - } -} \ No newline at end of file diff --git a/src/test/java/lottogame/model/winner/WinnerResultTest.java b/src/test/java/lottogame/model/winner/WinnerResultTest.java index 0b0c941283..08b847ed16 100644 --- a/src/test/java/lottogame/model/winner/WinnerResultTest.java +++ b/src/test/java/lottogame/model/winner/WinnerResultTest.java @@ -1,14 +1,14 @@ package lottogame.model.winner; -import static lottogame.model.winner.WinStandard.FIFTH; -import static lottogame.model.winner.WinStandard.FIRST; -import static lottogame.model.winner.WinStandard.FOURTH; -import static lottogame.model.winner.WinStandard.NOTHING; -import static lottogame.model.winner.WinStandard.THIRD; +import static lottogame.model.winner.Rank.FIFTH; +import static lottogame.model.winner.Rank.FIRST; +import static lottogame.model.winner.Rank.FOURTH; +import static lottogame.model.winner.Rank.NOTHING; +import static lottogame.model.winner.Rank.SECOND; +import static lottogame.model.winner.Rank.THIRD; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; -import lottogame.model.price.LottoPurchasePrice; import org.junit.jupiter.api.Test; class WinnerResultTest { @@ -36,10 +36,11 @@ class WinnerResultTest { @Test void 당첨결과에따른_총상금을_계산_할_수_있다() { WinnerResult winnerResult = new WinnerResult(); - winnerResult.addWinResult(FIFTH); + winnerResult.addWinResult(FIRST); + winnerResult.addWinResult(SECOND); assertThat( winnerResult.sumTotalWinReturn() - ).isEqualTo(FIFTH.returnOfWin()); + ).isEqualTo(2_000_000_000 + 30_000_000); } } \ No newline at end of file diff --git "a/\352\263\240\353\257\274.md" "b/\352\263\240\353\257\274.md" new file mode 100644 index 0000000000..5e39d89f0f --- /dev/null +++ "b/\352\263\240\353\257\274.md" @@ -0,0 +1,29 @@ + +## 고민을 명확하게 정의하고 기록을 남기기 위한 md 파일입니다 + + +## 4단계 진행 중 고민 + +로또의 발급 방식이 자동/수동 개념으로 분리 +* LottoMachine 에서 하나의 행위로 Lottos를 외부로 제공할 것인지? 외부에서 LottoMachine에게 수동,자동 생성 행위를 각각 요청해서 합칠건지? + * LottoMachine의 역할은? = 로또를 발행하는것. + * LottoMachine의 책임은? = 로또를 발행하는것. + * 역할과 책임의 차이가 뭐지? + * LottoMachine의 책임은? = 로또를 발행하는것 = 생성자 역할. + * 자동로또의 발행은 LottoMachine의 역할과 책임인가? => Y + * 수동로또의 발행은 LottoMachine의 역할과 책임인가? => Y + * 수/자동로또를 병합해 하나의 Lottos를 발행하는건 LottoMachine의 역할과 책임인가? => Y or N? + * 연장선이라고 생각할 수 있을것 같음 = LottoMachine을 더 능동적인 객체로 만들어줌. = LottoStroe는 컨트롤러 역할의 객체임으로 LottoMachine 보다 수동적이어도 상관없다고 판단 + * 추후 수/자동 로또의 요구사항이 확장된다면 둘을 분리해서 생성/관리가 필요할텐데 확장성 면에서 분리가 좋지 않나? + * 오버엔지니어링 으로 판단. + * 로또의 요구사항 변화는 '사용자 입력값' 이 주요했음 -> 기존기능이 외부변화에 얼마나 잘 대응하는지 = 캡슐화가 얼마나 잘되어있는지 가 중요 + * 해당 내용은 고려하지 않고 캡슐화에 집중하는게 낫다고 판단 + +LottoMachine 내부 메서드의 복잡도 +* 로또를 생성하는 동작은 비슷한데 약간의 차이로 각각의 메서드로 분리되어 있다 +* 이걸 조금더 보기좋게 다듬을순 없을까? +* 리턴값을 Lotto로 통일할까? + * 결론은 굳이? 다. LottoMachine의 역할은 Lotto와 관련된 모든 클래스를 생성하는 역할이다. + * 즉 Lottos, Lotto, LottoNum 뭐든 필요에 의해서 생성할 수 있고 생성하는 행위를 제공할 수 있다. + * 따라서 필요한 경우 혹은 요구사항상 추상화레벨을 올려야 하는 개념이 생기는 경우에 언제든지 해당 개념을 위한 행위를 추가해 사용하면 된다. + * 단 초반에는 최대한 로우레벨의 데이터를 응답하는게 확장성 면에서 좋다고 생각된다. \ No newline at end of file