indent를 지킨다는 규칙이 너무 버거웠습니다.
indent를 지키기 위해 마지막에 수정을 하다보니 코드가 더 더러워진 느낌입니다.
issueLotto 메서드 에서는 로또 발행만 하고
compareLottoWithLastLottoNumber 에서 발행한 로또 번호와 당첨 번호를 비교하는 작업만 진행려고 하였습니다.
코드를 짜다보니 for, for, if 문으로 indent가 3이 되버렸고, 이를 피하기 위해 코드를 산재하다 보니
issueLotto 부분이 너무 커진 느낌이 있습니다.
어떻게 변경을 할 지 조금 더 생각해 보도록 하겠습니다.
import step2.domain.LottoMachine;
import step2.view.InputView;
public class LottoApp {
public static void main(String[] args) {
InputView inputView = new InputView();
int numOfLotto = inputView.requestInput();
String lastLottoNum = inputView.requestLottoNumber();
LottoMachine lottoMachine = new LottoMachine(lastLottoNum, numOfLotto);
lottoMachine.run();
}
}
package step2.domain;
import step2.view.ResultView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class LottoMachine {
private static String[] lastLottoNumArray;
private static ArrayList<String> lottoNumberList = new ArrayList<String>(Arrays.asList("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42"));
private static final int COUNT_OF_LOTTO = 6;
private static int numOfLotto;
private static int[] matchedLottoRecordArray = new int[COUNT_OF_LOTTO+1];
private static ResultView resultView = new ResultView();
public LottoMachine(String lastLottoNum, int numOfLotto) {
this.lastLottoNumArray = checkValidInput(lastLottoNum);
this.numOfLotto = numOfLotto;
}
public LottoMachine() {
}
public void run() {
for (int i = 0; i < numOfLotto; i++) {
issueLotto();
}
resultView.printMatchedLottoRecord(matchedLottoRecordArray, numOfLotto);
}
public static int compareLottoWithLastLottoNumber(String issuedLotto ) {
int isMatch = 0;
for (String lastLottoNumber: lastLottoNumArray) {
// isMatch += isEqual(issuedLotto, lastLottoNumber);
isMatch += isEqual(issuedLotto, lastLottoNumber);
}
return isMatch;
}
public static int isEqual(String issuedLottoNumer, String lastLottoNumber) {
if (issuedLottoNumer.equals(lastLottoNumber)) {
return 1;
}
return 0;
}
public static String[] issueLotto() {
int matchedNumber = 0;
Collections.shuffle(lottoNumberList);
String[] lotto = new String[COUNT_OF_LOTTO];
for (int i = 0; i < COUNT_OF_LOTTO; i++) {
String issuedLottoNum = lottoNumberList.get(i);
lotto[i] = issuedLottoNum;
matchedNumber += compareLottoWithLastLottoNumber(issuedLottoNum);
}
resultView.printIssuedLottoNumber(lotto);
matchedLottoRecordArray[matchedNumber]++;
System.out.println(matchedNumber);
return lotto;
}
private String[] checkValidInput(String lastLottoNum) {
String[] lastLottoNumArray = stringSpliter(lastLottoNum);
if (lastLottoNumArray.length != COUNT_OF_LOTTO) {
throw new IllegalArgumentException("로또 당첨번호는 6개를 입력하세요. 당첨번호는 ', '로 구분을 하고 있습니다.");
}
return lastLottoNumArray;
}
private String[] stringSpliter(String lastLottoNum) {
return lastLottoNum.split(", ");
}
}
package step2.view;
import java.util.Scanner;
public class InputView {
static final String INPUT_MESSAGE = "구입 금액을 입력해주세요.";
static final String INPUT_INFO_MESSAGE = "개를 구매했습니다.";
static final String INPUT_LAST_LOTTO_NUMBER = "지난 주 당첨 번호를 입력해 주세요.";
private static final int chargeOfLotto = 1000;
static Scanner sc = new Scanner(System.in);
public int requestInput() {
System.out.println(INPUT_MESSAGE);
int charge = sc.nextInt();
sc.nextLine();
int numOfLotto = charge/chargeOfLotto;
System.out.println(numOfLotto+INPUT_INFO_MESSAGE);
return numOfLotto;
}
public String requestLottoNumber() {
System.out.println(INPUT_LAST_LOTTO_NUMBER);
String lastLottoNum = sc.nextLine();
return lastLottoNum;
}
}
package step2.view;
import java.util.ArrayList;
import java.util.Arrays;
public class ResultView {
static int[] charge = {0,0,0,5000,50000,1500000,2000000000};
public void printIssuedLottoNumber(String[] lotto) {
System.out.println(Arrays.toString(lotto));
}
public void printMatchedLottoRecord(int[] matchedLottoRecordArray, int numOfLotto) {
int totalRevenue = 0;
System.out.println("당첨 통계");
System.out.println("-------");
for (int i = 3; i <= 6; i++) {
// System.out.println(num+"개 일치 ("+charge[num]+") "+matchedLottoRecordArray[i]+"개");
System.out.printf("%s 개 일치 (%s) %s개\n",i,charge[i],matchedLottoRecordArray[i]);
totalRevenue += charge[i] * matchedLottoRecordArray[i];
}
System.out.println(totalRevenue);
System.out.println(numOfLotto);
double yield = totalRevenue / (double)(numOfLotto * 1000);
printResultMessage(yield);
}
private void printResultMessage(double yield) {
if (yield < 1) {
System.out.printf("총 수익률은 %s입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)",yield);
return;
}
if (yield >= 1) {
System.out.printf("총 수익률은 %s입니다.(기준이 1이기 때문에 결과적으로 이익이라는 의미임)",yield);
return;
}
}
}
'강의 > TDD, Clean Code with Java 12기' 카테고리의 다른 글
[로또] step2 - 로또(자동) - 피드백 (20일차) (0) | 2021.08.08 |
---|---|
[로또] step1 - 문자열 덧셈 계산기 - 피드백(20일 차) (0) | 2021.08.08 |
[로또] step2 - 로또(자동) (17일차) (0) | 2021.08.05 |
[로또] step1 - 문자열 덧셈 계산기 (15일 차) (0) | 2021.08.03 |
Step5 - 자동차 경주(우승자) - 피드백 (15일차) (0) | 2021.08.03 |