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

[자판기] 유재건 미션 제출합니다. #163

Open
wants to merge 24 commits into
base: main
Choose a base branch
from

Conversation

JaegeonYu
Copy link

No description provided.


public class Change {
private final int amount;
private final int[] coins;
Copy link
Member

Choose a reason for hiding this comment

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

Map을 이용하면 더 좋을것 같습니다.

예를들면
Map<Coin, Integer> coins 처럼 구성할 수 있을 것 같아요

}

private int[] makeCoins(int amount) {
int[] coins = new int[4];
Copy link
Member

@Choi-JJunho Choi-JJunho Dec 4, 2022

Choose a reason for hiding this comment

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

Enum으로 관리하면 좋을것 같아요
만약에 1000원단위가 생기면 손대야할 부분이 너무 많아질것 같아요

this.amount = amount;
}
public static int getRandomCoin(){
List<Integer> coins = new ArrayList<>();
Copy link
Member

Choose a reason for hiding this comment

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

호출 할때마다 List를 새로 생성하면 자원 낭비가 될것같네요
상수로 빼서 관리해도 될거같아요.

private final `List<Integer>` coins = List.of(
    COIN_10.amount,
    COIN_50.amount,
    COIN_100.amount,
    COIN_500.amount
)

coins.add(COIN_500.amount);
return Randoms.pickNumberInList(coins);
}
public static int getIndex(int coin){
Copy link
Member

Choose a reason for hiding this comment

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

java의 Enum은 선언된 순서대로 index값을 가집니다.
참고해보시면 좋을것같아요.


// 추가 기능 구현
public static boolean isDivideMinCoin(String input) {
if (Integer.parseInt(input) % COIN_10.amount == 0) return true;
Copy link
Member

Choose a reason for hiding this comment

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

try catch가 없어서 NumberFormat Exception에 대처하기 어려워보이네요
해당 메소드가 숫자를 검증하는 역할까지 가진다는 것에서 책임이 너무 많아지는것 같아요

차라리 파라미터로 primitive type (int)으로 받고 처리하는건 어떨까요?

this.amount = amount;
}

public int buyProduct(String name){
Copy link
Member

Choose a reason for hiding this comment

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

buyProduct 함수가 isExistProduct의 역할을 같이 수행하는것 같네요

아래에서 isExistProduct로 상품잔여개수에 대한 판별을 하는데 굳이 RUN_OUT을 추가로 반환해줄 필요가

해당 부분에서는 개수가 부족할때 예외를 던지는 방식으로 시도해보는것을 어떨까요

int buyPrice = 0;
for(int index = 0 ; index < products.size();index++){
int buy = products.get(index).buyProduct(buyProduct);
if(buy!=RUN_OUT){
Copy link
Member

Choose a reason for hiding this comment

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

코드 포맷팅 해주시면 좋을거같아요

public boolean checkContinue(int amount){
if(minAmount > amount) return false;
for(int index = 0; index < products.size(); index++){
if(!products.get(index).isExistProduct())return false;
Copy link
Member

Choose a reason for hiding this comment

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

products.get(index).isExistProduct() 부분에서 products.get(index) 부분을 한번 변수로 분리해주는것이 좋아보여요.

amountPrice -= products.buy(buyProduct);
}
public boolean isFinish(){
return products.checkContinue(amountPrice);
Copy link
Member

Choose a reason for hiding this comment

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

getter를 통해 상태를 가져오고 처리하는 방식은 어떨까요?



@Override
public String toString() {
Copy link
Member

@Choi-JJunho Choi-JJunho Dec 4, 2022

Choose a reason for hiding this comment

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

lastPrint()의 내용이 VendingMachine.toString()에 더 적합해보입니다.

아래 구문은 getAmountPrice()정도로 사용할 수 있을것 같네요

try {
productsInput = Console.readLine();
String[] splitProduct = productsInput.split(";");
for (String product : splitProduct) {
Copy link
Member

Choose a reason for hiding this comment

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

함수내용이 너무 길어지면 메소드 분리를 생각해볼 수 있습니다.

인텔리제이의 Ctrl + Alt + M 기능을 이용해 메소드를 쉽게 분리할 수 있습니다.

if (!Coin.isDivideMinCoin(inputChange)) throw new IllegalArgumentException("[ERROR] 잔돈이 나눠지지 않습니다.");
}

private void inputDigitValidation(String input) {

Choose a reason for hiding this comment

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

입력 값에 대한 오류처리가 많다면 따로 validator 클래스를 생성해서 분리해놓는게 좋을 것 같습니다.

}

private void validateProductQuantity(int quantity) {
if (quantity <= 0) throw new IllegalArgumentException("[ERROR] 수량은 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으로 바꿔주실거죠??🥺



private void validateProductPrice(int price) {
if (price > 100 && Coin.isDivideMinCoin(String.valueOf(price))) return;
Copy link
Member

Choose a reason for hiding this comment

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

Magic Number도 상수로 치환해주실거죠??🥺

int minPrice = Integer.MAX_VALUE;
while (productsInput.equals("")) {
outputView.askProductPrint();
try {

Choose a reason for hiding this comment

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

우테코 피드백에서 함수의 길이가 길어지면 기능을 분리해보라고 하셨는데, 함수를 생성해 분리해보는건 어떨까용


public int inputChange() {
outputView.askPricePrint();
String inputChange = "";
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

@Choi-JJunho Choi-JJunho left a comment

Choose a reason for hiding this comment

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

불꽃 리팩토링 가봅시다🔥

buyPrice = buy;
}
}
if(buyPrice == 0)throw new IllegalArgumentException("[ERROR] 해당 제품이 존재하지 않습니다.");

Choose a reason for hiding this comment

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

구매하는 역할과 예외처리하는 역할을 buy메서드가 동시에 하고 있는 것 같아요. 역할을 분리해보는게 어떨까용

import java.util.List;

public class InputView {
private final OutputView outputView = new OutputView();

Choose a reason for hiding this comment

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

생성자를 사용해서 외부에서 outputview클래스를 받아오면 객체 생성 횟수를 줄일 수 있을 거 같아요.
VendingMachineService 클래스에서도 outputview클래스를 생성하셨더라구요. 그 객체를 받아 와서 그대로 사용하는게 좋을 것 같아요.

Comment on lines +28 to +30
for(int index = 0; index < products.size(); index++){
if(!products.get(index).isExistProduct())return false;
}
Copy link

Choose a reason for hiding this comment

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

for (Product product : products) return product.isExistProduct()

이런식으로 정리하면 깔끔할꺼 같아요!

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.

5 participants