From 243d0119c4c70097a55c502941a5a6ddb8d24375 Mon Sep 17 00:00:00 2001 From: bominjang Date: Mon, 26 Jul 2021 23:53:03 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat=20:=20=EA=B2=B0=EC=A0=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TODO : test 케이스 작성, 코드 함수화 하기.. --- src/main/java/Application.java | 18 +++++++- src/main/java/domain/PayType.java | 27 ++++++++++++ src/main/java/repository/OrderRepository.java | 44 ++----------------- src/main/java/service/CafeOrderService.java | 43 +++++++++++++++--- src/main/java/view/InputView.java | 13 ++++-- src/main/java/view/OutputView.java | 22 +++++++--- 6 files changed, 110 insertions(+), 57 deletions(-) create mode 100644 src/main/java/domain/PayType.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 5f5f542..182df7a 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,5 +1,6 @@ import domain.Menu; //import jdk.internal.util.xml.impl.Input; +import domain.PayType; import repository.MenuRepository; import domain.Table; import repository.OrderRepository; @@ -9,6 +10,8 @@ import view.OutputView; import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; public class Application { // TODO 구현 진행 @@ -28,6 +31,9 @@ public static void main(String[] args) { { payOrders(tables, cafeOrderService); } + else if(func>3 || func<0){ + throw new NoSuchElementException("해당 기능은 존재하지 않습니다."); + } OutputView.printMain(); func = InputView.inputFunction(); } @@ -36,7 +42,17 @@ public static void main(String[] args) { private static void payOrders(List tables, CafeOrderService cafeOrderService) { OutputView.printTables(tables, cafeOrderService); int tableNum = InputView.inputPayTableNumber(); - OutputView.printOrders(cafeOrderService, tableNum); + if(cafeOrderService.isOrderedTable(tableNum)==false){ + OutputView.printNoOrder(); + return; + }; + Map bill = cafeOrderService.getBillByTable(tableNum); + OutputView.printOrders(bill); + OutputView.printPayMessage(tableNum); + int payTypeNumber = InputView.inputPayType(); + PayType payType = PayType.findByNumber(payTypeNumber); + long amountOfPayment = cafeOrderService.getAmountOfPayment(tableNum, payType, bill); + OutputView.printAmountOfPayment(amountOfPayment); } private static void orderMenu(List
tables, CafeOrderService cafeOrderService) diff --git a/src/main/java/domain/PayType.java b/src/main/java/domain/PayType.java new file mode 100644 index 0000000..580db55 --- /dev/null +++ b/src/main/java/domain/PayType.java @@ -0,0 +1,27 @@ +package domain; + +import java.util.Arrays; + +public enum PayType { + CARD(1, 0), CASH(2,10); + + private final int number; + private final int discountRate; + + PayType(int number, int discountRate){ + this.number = number; + this.discountRate = discountRate; + } + + public static PayType findByNumber(int number){ + return Arrays.stream(values()) + .filter(payType -> payType.number==number) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("결제 수단은 카드(1)와 현금(2)만 존재합니다.")); + } + + public int getDiscountRate(){ + return this.discountRate; + } + +} diff --git a/src/main/java/repository/OrderRepository.java b/src/main/java/repository/OrderRepository.java index e5ef8d2..c52f416 100644 --- a/src/main/java/repository/OrderRepository.java +++ b/src/main/java/repository/OrderRepository.java @@ -18,17 +18,6 @@ public void addOrder(final Order order) orders.add(order); } - public int countOrders(){ - return orders.size(); - } - - public int countMenusPerTable(int tableNum) - { - return (int)orders.stream() - .filter(order-> order.isEqualTable(tableNum)) - .count(); - } - public int countMenusNumber(int tableNum, int menuNum){ int count= (int)orders.stream() .filter(order->order.isEqualTable(tableNum)) @@ -37,33 +26,6 @@ public int countMenusNumber(int tableNum, int menuNum){ return count; } - //가장 수량이 많은 메뉴의 수량을 체크하는 메서드 - //need to edit - public int countNumberPerMenu(int tableNum) - { - List orders = findByTableNumber(tableNum); - if(orders.isEmpty()){ - return 0; - } - Map bill = orders.stream() - .map(order -> MenuRepository.findByNumber(order.getMenuNum())) - .collect(Collectors.groupingBy(order->order,HashMap::new, counting())); - List> entryList = new LinkedList(bill.entrySet()); - entryList.sort(Map.Entry.comparingByValue()); - - System.out.println(entryList.get(0).getValue().intValue()); - return entryList.get(0).getValue().intValue(); - } - - public boolean canOrder(int tableNum) - { - if(countNumberPerMenu(tableNum)<=MAX_NUMBER_PER_MENU){ - return true; - }else{ - return false; - } - } - public boolean canOrder(int tableNum, int menuNum, int menuCount){ int existedMenusNum = countMenusNumber(tableNum, menuNum); if(existedMenusNum+menuCount<=MAX_NUMBER_PER_MENU){ @@ -78,7 +40,7 @@ public List findByTableNumber(int tableNum) return orders.stream() .filter(order-> order.isEqualTable(tableNum)) - .collect(toList()); + .collect(toList()); } //해당 테이블에서 해당 메뉴의 수량을 출력하는 메소드 @@ -91,6 +53,8 @@ public Map getBill(int tableNum){ return bill; } - + public void finishedPayment(int tableNum){ + orders.removeIf(order->order.isEqualTable(tableNum)); + } } \ No newline at end of file diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index 720c2bf..529393e 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -1,15 +1,10 @@ package service; -import domain.Menu; -import domain.Order; +import domain.*; import repository.MenuRepository; import repository.OrderRepository; -import java.util.List; import java.util.Map; -import java.util.Optional; - -import static java.util.stream.Collectors.toList; public class CafeOrderService { private static final int DISCOUNT_FOR_CAKES = 3; @@ -44,7 +39,7 @@ public void orderMenu(int menuNum, int count, int tableNum) } } - public Map getOrdersByTable(int tableNum) { + public Map getBillByTable(int tableNum) { return orderRepository.getBill(tableNum); } @@ -64,4 +59,38 @@ public boolean checkMenuNum(int menuNum) { } } + public long getAmountOfPayment(int tableNum, PayType payType, Map bill) { + int numberOfCakes = getNumOfCakes(bill); + long amountOfPayment = getFinalPayment(bill, numberOfCakes, payType.getDiscountRate()); + orderRepository.finishedPayment(tableNum); + + return amountOfPayment; + } + + private int getNumOfCakes(Map bill) { + int numOfCakes = 0; + for (Map.Entry entry : bill.entrySet()){ + if(entry.getKey().getCategory()==Category.CAKE){ + numOfCakes += entry.getValue(); + } + } + return numOfCakes; + } + + public long getSumOfPayment(Map bill){ + long totalSumOfPayment = 0; + for (Map.Entry entry : bill.entrySet()){ + totalSumOfPayment += entry.getKey().getPrice()*entry.getValue(); + } + return totalSumOfPayment; + } + + private long getFinalPayment(Map bill, int numberOfCakes, int discountRate){ + long totalSumOfPayment = getSumOfPayment(bill); + if(numberOfCakes>=DISCOUNT_FOR_CAKES){ + totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES*(numberOfCakes/3); + } + totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment*((float)discountRate/100)); + return totalSumOfPayment; + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index be872d9..71f3c1f 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -6,7 +6,7 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); public static int inputFunction(){ - System.out.println("## 기능 선택"); + System.out.println("\n## 기능 선택"); return scanner.nextInt(); } @@ -16,17 +16,22 @@ public static int inputTableNumber() { } public static int inputPayTableNumber(){ - System.out.println("## 테이블 선택"); + System.out.println("\n## 테이블 선택"); return scanner.nextInt(); } public static int inputMenu(){ - System.out.println("## 메뉴 선택"); + System.out.println("\n## 메뉴 선택"); return scanner.nextInt(); } public static int inputCount(){ - System.out.println("## 수량 선택"); + System.out.println("\n## 수량 선택"); + return scanner.nextInt(); + } + + public static int inputPayType() { + System.out.println("## 신용카드는 1번, 현금 결제는 2번"); return scanner.nextInt(); } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0b8aac4..80721ab 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -62,10 +62,9 @@ private static void printTableNumbers(final List
tables) { System.out.println(); } - public static void printOrders(CafeOrderService cafeOrderService, int tableNum) { - System.out.println("## 주문 내역"); + public static void printOrders(Map bill) { + System.out.println("\n## 주문 내역"); System.out.println("메뉴 수량 금액"); - Map bill = cafeOrderService.getOrdersByTable(tableNum); bill.forEach((key, value)->{ System.out.println(key.getName()+" "+value+" "+key.getPrice()*value); }); @@ -73,10 +72,23 @@ public static void printOrders(CafeOrderService cafeOrderService, int tableNum) public static void printMaxAlert() { - System.out.println("## 한 테이블에 주문 할 수 있는 한 메뉴의 수량은 최대 30개입니다."); + System.out.println("\n## 한 테이블에 주문 할 수 있는 한 메뉴의 수량은 최대 30개입니다."); } public static void printMenuAlert() { - System.out.println("## 해당 메뉴는 존재하지 않는 메뉴입니다"); + System.out.println("\n## 해당 메뉴는 존재하지 않는 메뉴입니다"); + } + + public static void printPayMessage(int tableNum) { + System.out.println("\n## "+tableNum+"번 테이블의 결제를 진행합니다."); + } + + public static void printAmountOfPayment(long amountOfPayment) { + System.out.println("## 최종 결제 금액"); + System.out.println(amountOfPayment); + } + + public static void printNoOrder(){ + System.out.println("주문 정보가 없는 테이블입니다.\n"); } } From def2667d2485c04ebc5b462d9f8917a0ad5f7ed4 Mon Sep 17 00:00:00 2001 From: bominjang Date: Fri, 6 Aug 2021 01:11:49 +0900 Subject: [PATCH 2/6] =?UTF-8?q?edit=20:=20=EA=B0=9D=EC=B2=B4=EC=A7=80?= =?UTF-8?q?=ED=96=A5=20=EC=83=9D=ED=99=9C=EC=B2=B4=EC=A1=B0=EC=9B=90?= =?UTF-8?q?=EC=B9=99=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1차 --- src/main/java/Application.java | 6 +- src/main/java/domain/Menu.java | 6 ++ src/main/java/domain/Order.java | 24 ++++--- src/main/java/domain/PayType.java | 6 +- src/main/java/domain/Table.java | 2 + src/main/java/repository/MenuRepository.java | 9 ++- src/main/java/repository/OrderRepository.java | 39 +++++----- src/main/java/repository/TableRepository.java | 8 ++- src/main/java/service/CafeOrderService.java | 71 ++++++++++--------- src/main/java/view/OutputView.java | 4 ++ 10 files changed, 107 insertions(+), 68 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 182df7a..eedd465 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -59,20 +59,20 @@ private static void orderMenu(List
tables, CafeOrderService cafeOrderServ { OutputView.printTables(tables, cafeOrderService); int tableNum = InputView.inputTableNumber(); - boolean isValidTblNum = cafeOrderService.isValidTableNum(tableNum); + boolean isValidTblNum = cafeOrderService.isValidTableNumber(tableNum); if(isValidTblNum==false){ orderMenu(tables, cafeOrderService); } final List menus = MenuRepository.menus(); OutputView.printMenus(menus); int menuNum = InputView.inputMenu(); - boolean isValidMenuNum = cafeOrderService.checkMenuNum(menuNum); + boolean isValidMenuNum = cafeOrderService.isValidMenuNumber(menuNum); if(isValidMenuNum==false){ OutputView.printMenuAlert(); orderMenu(tables, cafeOrderService); } int menuCount = InputView.inputCount(); - boolean isValidMenuCount = cafeOrderService.canOrderMenu(tableNum, menuNum, menuCount); + boolean isValidMenuCount = cafeOrderService.checkMaximumCount(tableNum, menuNum, menuCount); if(isValidMenuCount==false){ OutputView.printMaxAlert(); return; diff --git a/src/main/java/domain/Menu.java b/src/main/java/domain/Menu.java index dfe44e9..d6da938 100644 --- a/src/main/java/domain/Menu.java +++ b/src/main/java/domain/Menu.java @@ -29,6 +29,12 @@ public int getPrice() { return price; } + public boolean isEqualNumber(int number){ + return this.number == number; + } + + public boolean isThisCake(){ return this.category==Category.CAKE;} + @Override public String toString() { return category + " " + number + " - " + name + " : " + price + "원"; diff --git a/src/main/java/domain/Order.java b/src/main/java/domain/Order.java index dce9ed6..e54efc6 100644 --- a/src/main/java/domain/Order.java +++ b/src/main/java/domain/Order.java @@ -1,23 +1,27 @@ package domain; public class Order { - private final int menuNum; - private final int tableNum; + private final int menuNumber; + private final int tableNumber; public Order(int menuNum, int tableNum) { - this.menuNum = menuNum; - this.tableNum = tableNum; + this.menuNumber = menuNum; + this.tableNumber = tableNum; } - public int getMenuNum() { - return this.menuNum; + public int getMenuNumber() { + return this.menuNumber; } - public int getTableNum() { - return tableNum; + public int getTableNumber() { + return tableNumber; } - public boolean isEqualTable(int tableNum){ - return this.tableNum == tableNum; + public boolean isEqualTable(int tableNumber){ + return this.tableNumber == tableNumber; + } + + public boolean isEqualMenuNumber(int menuNumber){ + return this.menuNumber==menuNumber; } } diff --git a/src/main/java/domain/PayType.java b/src/main/java/domain/PayType.java index 580db55..1b7370e 100644 --- a/src/main/java/domain/PayType.java +++ b/src/main/java/domain/PayType.java @@ -15,11 +15,15 @@ public enum PayType { public static PayType findByNumber(int number){ return Arrays.stream(values()) - .filter(payType -> payType.number==number) + .filter(payType -> isEqualPayType(payType, number)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("결제 수단은 카드(1)와 현금(2)만 존재합니다.")); } + private static boolean isEqualPayType(PayType payType, int number){ + return payType.number==number; + } + public int getDiscountRate(){ return this.discountRate; } diff --git a/src/main/java/domain/Table.java b/src/main/java/domain/Table.java index 0b0474c..3e78e7d 100644 --- a/src/main/java/domain/Table.java +++ b/src/main/java/domain/Table.java @@ -11,6 +11,8 @@ public int getNumber() { return number; } + public boolean isEqualNumber(int tableNumber){ return this.number==number;} + @Override public String toString() { return Integer.toString(number); diff --git a/src/main/java/repository/MenuRepository.java b/src/main/java/repository/MenuRepository.java index a6359a4..f1a7dbf 100644 --- a/src/main/java/repository/MenuRepository.java +++ b/src/main/java/repository/MenuRepository.java @@ -24,13 +24,20 @@ public class MenuRepository { menus.add(new Menu(24, "그린티 라떼", Category.BEVERAGE, 6000)); } + //해당 숫자에 해당하는 메뉴 객체를 return한다. public static Menu findByNumber(int number){ return menus.stream() - .filter(menu -> menu.getNumber()==number) + .filter(menu -> menu.isEqualNumber(number)) .findFirst() .orElseThrow(IllegalAccessError::new); } + //입력된 숫자에 해당하는 메뉴가 있는지 검사한다. + public static boolean checkMenuNumber(int number){ + Menu menu = findByNumber(number); + return menu.isEqualNumber(number); + } + public Optional findByName(String name){ return menus.stream() .filter(menu -> menu.getName().equals(name)) diff --git a/src/main/java/repository/OrderRepository.java b/src/main/java/repository/OrderRepository.java index c52f416..01c5afb 100644 --- a/src/main/java/repository/OrderRepository.java +++ b/src/main/java/repository/OrderRepository.java @@ -5,56 +5,59 @@ import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; import static java.util.stream.Collectors.*; +//주문 정보들을 저장하는 클래스 public class OrderRepository { private static final int MAX_NUMBER_PER_MENU = 30; private final List orders = new ArrayList<>(); + //주문을 받는다. public void addOrder(final Order order) { orders.add(order); } - public int countMenusNumber(int tableNum, int menuNum){ + //해당 테이블에서 주문한 해당 메뉴의 수량을 return한다. + public int countMenusNumber(int tableNumber, int menuNumber){ int count= (int)orders.stream() - .filter(order->order.isEqualTable(tableNum)) - .filter(order->menuNum==order.getMenuNum()) + .filter(order->order.isEqualTable(tableNumber)) + .filter(order->order.isEqualMenuNumber(menuNumber)) .count(); return count; } - public boolean canOrder(int tableNum, int menuNum, int menuCount){ - int existedMenusNum = countMenusNumber(tableNum, menuNum); - if(existedMenusNum+menuCount<=MAX_NUMBER_PER_MENU){ + //해당 테이블에서 주문할 수 있는 한 메뉴의 최대 수량을 넘는지 아닌지 검사한다. + public boolean checkMaximumPerMenu(int tableNumber, int menuNumber, int menuCount){ + int existedMenusCount = countMenusNumber(tableNumber, menuNumber); + if(existedMenusCount+menuCount<=MAX_NUMBER_PER_MENU){ return true; - }else{ - return false; } + return false; } - - public List findByTableNumber(int tableNum) + //해당 테이블에서 주문한 것들을 모두 return한다. + public List findByTableNumber(int tableNumber) { return orders.stream() - .filter(order-> order.isEqualTable(tableNum)) + .filter(order-> order.isEqualTable(tableNumber)) .collect(toList()); } - //해당 테이블에서 해당 메뉴의 수량을 출력하는 메소드 - public Map getBill(int tableNum){ - List orders = findByTableNumber(tableNum); + //해당 테이블에서 주문한 메뉴와 수량을 return한다. + public Map getBill(int tableNumber){ + List orders = findByTableNumber(tableNumber); Map bill = orders.stream() - .map(order -> MenuRepository.findByNumber(order.getMenuNum())) + .map(order -> MenuRepository.findByNumber(order.getMenuNumber())) .collect(Collectors.groupingBy(order->order,HashMap::new, counting())); return bill; } - public void finishedPayment(int tableNum){ - orders.removeIf(order->order.isEqualTable(tableNum)); + //지불이 완료되면 해당 테이블의 주문을 모두 삭제한다. + public void finishedPayment(int tableNumber){ + orders.removeIf(order->order.isEqualTable(tableNumber)); } } \ No newline at end of file diff --git a/src/main/java/repository/TableRepository.java b/src/main/java/repository/TableRepository.java index 0e44b90..b8710b7 100644 --- a/src/main/java/repository/TableRepository.java +++ b/src/main/java/repository/TableRepository.java @@ -19,8 +19,12 @@ public class TableRepository { tables.add(new Table(8)); } - public Optional
findByNumber(int number) { - return Optional.ofNullable(tables.get(number)); //Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 + //nubmer에 해당하는 Table을 return한다. + public static Optional
findByNumber(int number){ + return Optional.ofNullable(tables.stream() + .filter(table -> table.isEqualNumber(number)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(number+"번 테이블은 존재하지 않는 테이블입니다.")));//Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 } public static List
tables() { diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index 529393e..116ca40 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -3,6 +3,8 @@ import domain.*; import repository.MenuRepository; import repository.OrderRepository; +import repository.TableRepository; +import view.OutputView; import java.util.Map; @@ -16,79 +18,82 @@ public CafeOrderService(OrderRepository orderRepository) { this.orderRepository = orderRepository; } - public boolean isValidTableNum(int tableNum) + //해당 테이블이 존재하는 테이블인지 검사한다. + public boolean isValidTableNumber(int tableNumber) { - if(tableNum<0||tableNum==7||tableNum>9){ - System.out.println("## 존재하지 않는 테이블입니다. \n테이블을 다시 선택하세요\n"); - return false; - } - else{ + if(TableRepository.findByNumber(tableNumber).isPresent()){ return true; } + return false; } - public boolean canOrderMenu(int tableNum, int menuNum, int menuCount) + //주문하려는 메뉴의 수량이 누적 30개가 넘는지 확인한다. + public boolean checkMaximumCount(int tableNumber, int menuNumber, int menuCount) { - return orderRepository.canOrder(tableNum, menuNum, menuCount); + return orderRepository.checkMaximumPerMenu(tableNumber, menuNumber, menuCount); } - public void orderMenu(int menuNum, int count, int tableNum) + //메뉴의 번호, 수량, 테이블 번호를 입력받고 수량만큼의 주문을 추가한다. + public void orderMenu(int menuNumber, int count, int tableNumber) { for(int i=0;i getBillByTable(int tableNum) { - return orderRepository.getBill(tableNum); + //해당 테이블에서 주문한 것들에 대한 영수증을 return한다. + public Map getBillByTable(int tableNumber) { + return orderRepository.getBill(tableNumber); } - public boolean isOrderedTable(int tableNum){ - if(orderRepository.getBill(tableNum).isEmpty()){ + //해당 테이블에 주문이 들어간 테이블인지 검사한다. + public boolean isOrderedTable(int tableNumber){ + if(this.getBillByTable(tableNumber).isEmpty()){ return false; - }else{ - return true; } + return true; } - public boolean checkMenuNum(int menuNum) { - try{ - return MenuRepository.findByNumber(menuNum) instanceof Menu; - }catch (Exception e){ - return false; + //입력된 메뉴가 존재하는 메뉴인지 검사한다. + public boolean isValidMenuNumber(int menuNumber) { + if(MenuRepository.checkMenuNumber(menuNumber)){ + return true; } + return false; } - public long getAmountOfPayment(int tableNum, PayType payType, Map bill) { - int numberOfCakes = getNumOfCakes(bill); + //지불해야하는 총 금액을 return한다. + public long getAmountOfPayment(int tableNumber, PayType payType, Map bill) { + int numberOfCakes = getNumberOfCakes(bill); long amountOfPayment = getFinalPayment(bill, numberOfCakes, payType.getDiscountRate()); - orderRepository.finishedPayment(tableNum); + orderRepository.finishedPayment(tableNumber); return amountOfPayment; } - private int getNumOfCakes(Map bill) { - int numOfCakes = 0; + //해당 테이블에서 주문한 케익의 갯수를 return한다. + private int getNumberOfCakes(Map bill) { + int numberOfCakes = 0; for (Map.Entry entry : bill.entrySet()){ - if(entry.getKey().getCategory()==Category.CAKE){ - numOfCakes += entry.getValue(); - } + numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; } - return numOfCakes; + return numberOfCakes; } - public long getSumOfPayment(Map bill){ + //해당 테이블에서 주문한 메뉴들 가격의 총 합을 계산한다. + private long getSumOfPayment(Map bill){ long totalSumOfPayment = 0; for (Map.Entry entry : bill.entrySet()){ - totalSumOfPayment += entry.getKey().getPrice()*entry.getValue(); + totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); } return totalSumOfPayment; } + //할인을 적용한 가격을 계산한다. private long getFinalPayment(Map bill, int numberOfCakes, int discountRate){ long totalSumOfPayment = getSumOfPayment(bill); if(numberOfCakes>=DISCOUNT_FOR_CAKES){ - totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES*(numberOfCakes/3); + totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes/3); } totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment*((float)discountRate/100)); return totalSumOfPayment; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 80721ab..52d9923 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -91,4 +91,8 @@ public static void printAmountOfPayment(long amountOfPayment) { public static void printNoOrder(){ System.out.println("주문 정보가 없는 테이블입니다.\n"); } + + public static void printNoTableAlert() { + System.out.println("## 존재하지 않는 테이블입니다. \n테이블을 다시 선택하세요\n"); + } } From cd63784d1c421f8bc3382827546ef305073fa159 Mon Sep 17 00:00:00 2001 From: bominjang Date: Sun, 8 Aug 2021 20:38:02 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor=20:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=B1=85=EC=9E=84=20=ED=95=A0=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 6 +-- src/main/java/domain/Order.java | 2 +- src/main/java/domain/PayType.java | 1 + src/main/java/repository/OrderRepository.java | 34 +++++++++++++- src/main/java/repository/TableRepository.java | 1 + src/main/java/service/CafeOrderService.java | 45 ++++++------------- src/main/java/view/InputView.java | 1 + src/main/java/view/OutputView.java | 5 ++- 8 files changed, 55 insertions(+), 40 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index eedd465..efbcd7d 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -42,16 +42,16 @@ else if(func>3 || func<0){ private static void payOrders(List
tables, CafeOrderService cafeOrderService) { OutputView.printTables(tables, cafeOrderService); int tableNum = InputView.inputPayTableNumber(); - if(cafeOrderService.isOrderedTable(tableNum)==false){ + if(cafeOrderService.checkOrderedTable(tableNum)==false){ OutputView.printNoOrder(); return; }; Map bill = cafeOrderService.getBillByTable(tableNum); - OutputView.printOrders(bill); + OutputView.printBill(bill); OutputView.printPayMessage(tableNum); int payTypeNumber = InputView.inputPayType(); PayType payType = PayType.findByNumber(payTypeNumber); - long amountOfPayment = cafeOrderService.getAmountOfPayment(tableNum, payType, bill); + long amountOfPayment = cafeOrderService.getAmountOfPayment(tableNum, payType); OutputView.printAmountOfPayment(amountOfPayment); } diff --git a/src/main/java/domain/Order.java b/src/main/java/domain/Order.java index e54efc6..d0e9807 100644 --- a/src/main/java/domain/Order.java +++ b/src/main/java/domain/Order.java @@ -10,7 +10,7 @@ public Order(int menuNum, int tableNum) { } public int getMenuNumber() { - return this.menuNumber; + return menuNumber; } public int getTableNumber() { diff --git a/src/main/java/domain/PayType.java b/src/main/java/domain/PayType.java index 1b7370e..05cd1ce 100644 --- a/src/main/java/domain/PayType.java +++ b/src/main/java/domain/PayType.java @@ -2,6 +2,7 @@ import java.util.Arrays; +//지불 수단 public enum PayType { CARD(1, 0), CASH(2,10); diff --git a/src/main/java/repository/OrderRepository.java b/src/main/java/repository/OrderRepository.java index 01c5afb..0eec332 100644 --- a/src/main/java/repository/OrderRepository.java +++ b/src/main/java/repository/OrderRepository.java @@ -2,14 +2,16 @@ import domain.Menu; import domain.Order; +import domain.PayType; +import service.CafeOrderService; import java.util.*; import java.util.stream.Collectors; import static java.util.stream.Collectors.*; -//주문 정보들을 저장하는 클래스 -public class OrderRepository { +//주문 정보들을 저장하고 주문한 것들의 합을 계산한다. +public class OrderRepository{ private static final int MAX_NUMBER_PER_MENU = 30; private final List orders = new ArrayList<>(); @@ -60,4 +62,32 @@ public void finishedPayment(int tableNumber){ orders.removeIf(order->order.isEqualTable(tableNumber)); } + //해당 테이블이 주문된 테이블인지 검사한다. + public boolean isOrderedTable(int tableNumber){ + if(getBill(tableNumber).isEmpty()){ + return false; + } + return true; + } + + //해당 테이블에서 주문한 케익의 갯수를 계산한다. + public int getNumberOfCakes(int tableNumber) { + int numberOfCakes = 0; + Map bill = getBill(tableNumber); + for (Map.Entry entry : bill.entrySet()){ + numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; + } + return numberOfCakes; + } + + //해당 테이블에서 주문한 메뉴들 가격의 총 합을 계산한다. + public long getSumOfPayment(int tableNumber){ + long totalSumOfPayment = 0; + Map bill = getBill(tableNumber); + for (Map.Entry entry : bill.entrySet()){ + totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); + } + return totalSumOfPayment; + } + } \ No newline at end of file diff --git a/src/main/java/repository/TableRepository.java b/src/main/java/repository/TableRepository.java index b8710b7..53c1939 100644 --- a/src/main/java/repository/TableRepository.java +++ b/src/main/java/repository/TableRepository.java @@ -1,6 +1,7 @@ package repository; import domain.Table; +import service.CafeOrderService; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index 116ca40..b607669 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -4,11 +4,13 @@ import repository.MenuRepository; import repository.OrderRepository; import repository.TableRepository; +import view.InputView; import view.OutputView; import java.util.Map; -public class CafeOrderService { +//카페의 주문과 관련된 서비스를 제공하는 클래스 +public class CafeOrderService{ private static final int DISCOUNT_FOR_CAKES = 3; private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; @@ -33,7 +35,7 @@ public boolean checkMaximumCount(int tableNumber, int menuNumber, int menuCount) return orderRepository.checkMaximumPerMenu(tableNumber, menuNumber, menuCount); } - //메뉴의 번호, 수량, 테이블 번호를 입력받고 수량만큼의 주문을 추가한다. + //해당 수량만큼의 주문을 추가한다. public void orderMenu(int menuNumber, int count, int tableNumber) { for(int i=0;i getBillByTable(int tableNumber) { return orderRepository.getBill(tableNumber); } - //해당 테이블에 주문이 들어간 테이블인지 검사한다. - public boolean isOrderedTable(int tableNumber){ - if(this.getBillByTable(tableNumber).isEmpty()){ - return false; - } - return true; + //해당 테이블에 주문이 들어간 테이블인지 검사한다. --> 테이블 정보를 알고있는 객체면 좋을듯!! + public boolean checkOrderedTable(int tableNumber){ + return orderRepository.isOrderedTable(tableNumber); } //입력된 메뉴가 존재하는 메뉴인지 검사한다. @@ -63,35 +62,17 @@ public boolean isValidMenuNumber(int menuNumber) { } //지불해야하는 총 금액을 return한다. - public long getAmountOfPayment(int tableNumber, PayType payType, Map bill) { - int numberOfCakes = getNumberOfCakes(bill); - long amountOfPayment = getFinalPayment(bill, numberOfCakes, payType.getDiscountRate()); + public long getAmountOfPayment(int tableNumber, PayType payType) { + int numberOfCakes = orderRepository.getNumberOfCakes(tableNumber); + long amountOfPayment = getFinalPayment(tableNumber, numberOfCakes, payType.getDiscountRate()); orderRepository.finishedPayment(tableNumber); return amountOfPayment; } - //해당 테이블에서 주문한 케익의 갯수를 return한다. - private int getNumberOfCakes(Map bill) { - int numberOfCakes = 0; - for (Map.Entry entry : bill.entrySet()){ - numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; - } - return numberOfCakes; - } - - //해당 테이블에서 주문한 메뉴들 가격의 총 합을 계산한다. - private long getSumOfPayment(Map bill){ - long totalSumOfPayment = 0; - for (Map.Entry entry : bill.entrySet()){ - totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); - } - return totalSumOfPayment; - } - - //할인을 적용한 가격을 계산한다. - private long getFinalPayment(Map bill, int numberOfCakes, int discountRate){ - long totalSumOfPayment = getSumOfPayment(bill); + //할인을 적용한 최종 금액을 계산한다. + private long getFinalPayment(int tableNumber, int numberOfCakes, int discountRate){ + long totalSumOfPayment = orderRepository.getSumOfPayment(tableNumber); if(numberOfCakes>=DISCOUNT_FOR_CAKES){ totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes/3); } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 71f3c1f..d67dc47 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,6 +2,7 @@ import java.util.Scanner; +//사용자의 입력과 관련된 모든 일을 담당하는 클래스 public class InputView { private static final Scanner scanner = new Scanner(System.in); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 52d9923..fff0ad9 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -9,6 +9,7 @@ import java.util.Map; import java.util.Optional; +//출력과 관련된 모든 일을 담당하는 클래스 public class OutputView { private static final String TOP_LINE = "┌ ─ ┐"; private static final String TABLE_FORMAT = "| %s |"; @@ -46,7 +47,7 @@ private static void printLine(final String line, final int count) { private static void printLine(final String line, final List
tables, CafeOrderService cafeOrderService){ for(final Table table : tables) { - if (cafeOrderService.isOrderedTable(table.getNumber())) { + if (cafeOrderService.checkOrderedTable(table.getNumber())) { System.out.print(BOTTOM_LINE_ORDERED_TBL); } else { System.out.print(BOTTOM_LINE); @@ -62,7 +63,7 @@ private static void printTableNumbers(final List
tables) { System.out.println(); } - public static void printOrders(Map bill) { + public static void printBill(Map bill) { System.out.println("\n## 주문 내역"); System.out.println("메뉴 수량 금액"); bill.forEach((key, value)->{ From cf1e207077ac0ecbac753a7b28bf4072394fbaa9 Mon Sep 17 00:00:00 2001 From: bominjang Date: Mon, 30 Aug 2021 18:43:09 +0900 Subject: [PATCH 4/6] =?UTF-8?q?refactor=20:=20Bill=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20=EA=B0=9D=EC=B2=B4=EC=9D=98=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B6=84=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bill 객체를 생성 - 주문 넣는 방식 변경 (기존 : 메뉴의 수량 만큼 order 객체 추가 -> 변경 후 : 메뉴의 수량을 알고있는 order 객체 하나만 추가) - boolean 처리 단순화 등등..!! --- src/main/java/Application.java | 135 +++++++------- src/main/java/domain/Bill.java | 41 ++++ src/main/java/domain/Category.java | 20 +- src/main/java/domain/Menu.java | 78 ++++---- src/main/java/domain/Order.java | 42 +++-- src/main/java/domain/PayType.java | 43 ++--- src/main/java/domain/Table.java | 26 +-- src/main/java/repository/MenuRepository.java | 81 ++++---- src/main/java/repository/OrderRepository.java | 132 ++++++------- .../java/repository/PayTypeRepository.java | 22 +++ src/main/java/repository/TableRepository.java | 44 ++--- src/main/java/service/CafeOrderService.java | 121 ++++++------ src/main/java/view/InputView.java | 62 +++--- src/main/java/view/OutputView.java | 176 +++++++++--------- 14 files changed, 526 insertions(+), 497 deletions(-) create mode 100644 src/main/java/domain/Bill.java create mode 100644 src/main/java/repository/PayTypeRepository.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index efbcd7d..245c390 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,82 +1,81 @@ +import java.util.List; +import java.util.NoSuchElementException; + +import domain.Bill; import domain.Menu; -//import jdk.internal.util.xml.impl.Input; import domain.PayType; -import repository.MenuRepository; import domain.Table; +import repository.MenuRepository; import repository.OrderRepository; +import repository.PayTypeRepository; import repository.TableRepository; import service.CafeOrderService; import view.InputView; import view.OutputView; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; - public class Application { - // TODO 구현 진행 - public static void main(String[] args) { - OutputView.printMain(); - final CafeOrderService cafeOrderService = new CafeOrderService(new OrderRepository()); - final List
tables = TableRepository.tables(); - int func = InputView.inputFunction(); + final static int ORDER = 1; + final static int PAY = 2; + final static int STOP = 3; + + // TODO 구현 진행 + public static void main(String[] args) { + OutputView.printMain(); + final CafeOrderService cafeOrderService = new CafeOrderService(new OrderRepository()); + final List
tables = TableRepository.tables(); + int func = InputView.inputFunction(); - while(func!=3) - { - if(func == 1) - { - orderMenu(tables, cafeOrderService); - } - if(func == 2) - { - payOrders(tables, cafeOrderService); - } - else if(func>3 || func<0){ - throw new NoSuchElementException("해당 기능은 존재하지 않습니다."); - } - OutputView.printMain(); - func = InputView.inputFunction(); - } - } + while (func != STOP) { + if (func == ORDER) { + orderMenu(tables, cafeOrderService); + } + if (func == PAY) { + payOrders(tables, cafeOrderService); + } else if (func > STOP || func < ORDER) { + throw new NoSuchElementException("해당 기능은 존재하지 않습니다."); + } + OutputView.printMain(); + func = InputView.inputFunction(); + } + } - private static void payOrders(List
tables, CafeOrderService cafeOrderService) { - OutputView.printTables(tables, cafeOrderService); - int tableNum = InputView.inputPayTableNumber(); - if(cafeOrderService.checkOrderedTable(tableNum)==false){ - OutputView.printNoOrder(); - return; - }; - Map bill = cafeOrderService.getBillByTable(tableNum); - OutputView.printBill(bill); - OutputView.printPayMessage(tableNum); - int payTypeNumber = InputView.inputPayType(); - PayType payType = PayType.findByNumber(payTypeNumber); - long amountOfPayment = cafeOrderService.getAmountOfPayment(tableNum, payType); - OutputView.printAmountOfPayment(amountOfPayment); - } + private static void payOrders(List
tables, CafeOrderService cafeOrderService) { + OutputView.printTables(tables, cafeOrderService); + int tableNum = InputView.inputPayTableNumber(); + if (!cafeOrderService.checkOrderedTable(tableNum)) { + OutputView.printNoOrder(); + return; + } + Bill bill = cafeOrderService.getBillByTable(tableNum); + OutputView.printBill(bill); + OutputView.printPayMessage(tableNum); + int payTypeNumber = InputView.inputPayType(); + PayType payType = PayTypeRepository.findByNumber(payTypeNumber); + long amountOfPayment = cafeOrderService.getAmountOfPayment(bill, payType); + OutputView.printAmountOfPayment(amountOfPayment); + } - private static void orderMenu(List
tables, CafeOrderService cafeOrderService) - { - OutputView.printTables(tables, cafeOrderService); - int tableNum = InputView.inputTableNumber(); - boolean isValidTblNum = cafeOrderService.isValidTableNumber(tableNum); - if(isValidTblNum==false){ - orderMenu(tables, cafeOrderService); - } - final List menus = MenuRepository.menus(); - OutputView.printMenus(menus); - int menuNum = InputView.inputMenu(); - boolean isValidMenuNum = cafeOrderService.isValidMenuNumber(menuNum); - if(isValidMenuNum==false){ - OutputView.printMenuAlert(); - orderMenu(tables, cafeOrderService); - } - int menuCount = InputView.inputCount(); - boolean isValidMenuCount = cafeOrderService.checkMaximumCount(tableNum, menuNum, menuCount); - if(isValidMenuCount==false){ - OutputView.printMaxAlert(); - return; - } - cafeOrderService.orderMenu(menuNum, menuCount, tableNum); - } + private static void orderMenu(List
tables, CafeOrderService cafeOrderService) { + OutputView.printTables(tables, cafeOrderService); + int tableNumber = InputView.inputTableNumber(); + boolean isValidTableNumber = cafeOrderService.isValidTableNumber(tableNumber); + if (!isValidTableNumber) { + orderMenu(tables, cafeOrderService); + } + final List menus = MenuRepository.menus(); + OutputView.printMenus(menus); + int menuNumber = InputView.inputMenu(); + boolean isValidMenuNum = cafeOrderService.isValidMenuNumber(menuNumber); + if (!isValidMenuNum) { + OutputView.printMenuAlert(); + orderMenu(tables, cafeOrderService); + } + int menuCount = InputView.inputCount(); + boolean isMaxMenuCount = cafeOrderService.checkMaximumCount(tableNumber, menuNumber, menuCount); + if (!isMaxMenuCount) { + OutputView.printMaxAlert(); + return; + } + cafeOrderService.orderMenu(tableNumber, menuNumber, menuCount); + } } diff --git a/src/main/java/domain/Bill.java b/src/main/java/domain/Bill.java new file mode 100644 index 0000000..0725bfd --- /dev/null +++ b/src/main/java/domain/Bill.java @@ -0,0 +1,41 @@ +package domain; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import repository.MenuRepository; +import repository.OrderRepository; + +//주문 메뉴와 수량을 알고있는 객체. OrderRepository는 이 객체를 통해 주문을 추가한다. +public class Bill { + private final int tableNumber; + Map orderedMenus; + + public Bill(int tableNumber) { + this.tableNumber = tableNumber; + this.orderedMenus = Collections.emptyMap(); + } + + //해당 테이블에서 주문한 메뉴와 수량을 return한다. + public Bill(OrderRepository orderRepository, int tableNumber) { + List orders = orderRepository.findByTableNumber(tableNumber); + Map orderedMenus = orders.stream() + .filter(order -> order.getTableNumber() == tableNumber) + .collect(Collectors.toMap(order -> MenuRepository.findByNumber(order.getMenuNumber()), + order -> order.getMenuCount(), (c1, c2) -> c1 + c2)); + + this.tableNumber = tableNumber; + this.orderedMenus = orderedMenus; + } + + public int getTableNumber() { + return tableNumber; + } + + public Map getOrderedMenus() { + return this.orderedMenus; + } + +} diff --git a/src/main/java/domain/Category.java b/src/main/java/domain/Category.java index e0469f8..d3da92e 100644 --- a/src/main/java/domain/Category.java +++ b/src/main/java/domain/Category.java @@ -1,17 +1,17 @@ package domain; public enum Category { - CAKE("케이크"), - BEVERAGE("음료"); + CAKE("케이크"), + BEVERAGE("음료"); - private final String name; + private final String name; - Category(final String name) { - this.name = name; - } + Category(final String name) { + this.name = name; + } - @Override - public String toString() { - return "[" + name + "]"; - } + @Override + public String toString() { + return "[" + name + "]"; + } } diff --git a/src/main/java/domain/Menu.java b/src/main/java/domain/Menu.java index d6da938..c6d0c3a 100644 --- a/src/main/java/domain/Menu.java +++ b/src/main/java/domain/Menu.java @@ -1,42 +1,44 @@ package domain; public class Menu { - private final int number; - private final String name; - private final Category category; - private final int price; - - public Menu(final int number, final String name, final Category category, final int price) { - this.number = number; - this.name = name; - this.category = category; - this.price = price; - } - - public int getNumber() { - return number; - } - - public String getName() { - return name; - } - - public Category getCategory() { - return category; - } - - public int getPrice() { - return price; - } - - public boolean isEqualNumber(int number){ - return this.number == number; - } - - public boolean isThisCake(){ return this.category==Category.CAKE;} - - @Override - public String toString() { - return category + " " + number + " - " + name + " : " + price + "원"; - } + private final int number; + private final String name; + private final Category category; + private final int price; + + public Menu(final int number, final String name, final Category category, final int price) { + this.number = number; + this.name = name; + this.category = category; + this.price = price; + } + + public int getNumber() { + return number; + } + + public String getName() { + return name; + } + + public Category getCategory() { + return category; + } + + public int getPrice() { + return price; + } + + public boolean isEqualNumber(int number) { + return this.number == number; + } + + public boolean isThisCake() { + return this.category == Category.CAKE; + } + + @Override + public String toString() { + return category + " " + number + " - " + name + " : " + price + "원"; + } } diff --git a/src/main/java/domain/Order.java b/src/main/java/domain/Order.java index d0e9807..59fc121 100644 --- a/src/main/java/domain/Order.java +++ b/src/main/java/domain/Order.java @@ -1,27 +1,33 @@ package domain; public class Order { - private final int menuNumber; - private final int tableNumber; + private final int tableNumber; + private final int menuNumber; + private final int menuCount; - public Order(int menuNum, int tableNum) { - this.menuNumber = menuNum; - this.tableNumber = tableNum; - } + public Order(int tableNumber, int menuNumber, int menuCount) { + this.tableNumber = tableNumber; + this.menuNumber = menuNumber; + this.menuCount = menuCount; + } - public int getMenuNumber() { - return menuNumber; - } + public int getMenuNumber() { + return this.menuNumber; + } - public int getTableNumber() { - return tableNumber; - } + public int getTableNumber() { + return this.tableNumber; + } - public boolean isEqualTable(int tableNumber){ - return this.tableNumber == tableNumber; - } + public int getMenuCount() { + return this.menuCount; + } - public boolean isEqualMenuNumber(int menuNumber){ - return this.menuNumber==menuNumber; - } + public boolean isEqualTable(int tableNumber) { + return this.tableNumber == tableNumber; + } + + public boolean isEqualMenuNumber(int menuNumber) { + return this.menuNumber == menuNumber; + } } diff --git a/src/main/java/domain/PayType.java b/src/main/java/domain/PayType.java index 05cd1ce..f69a551 100644 --- a/src/main/java/domain/PayType.java +++ b/src/main/java/domain/PayType.java @@ -1,32 +1,21 @@ package domain; -import java.util.Arrays; - //지불 수단 -public enum PayType { - CARD(1, 0), CASH(2,10); - - private final int number; - private final int discountRate; - - PayType(int number, int discountRate){ - this.number = number; - this.discountRate = discountRate; - } - - public static PayType findByNumber(int number){ - return Arrays.stream(values()) - .filter(payType -> isEqualPayType(payType, number)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("결제 수단은 카드(1)와 현금(2)만 존재합니다.")); - } - - private static boolean isEqualPayType(PayType payType, int number){ - return payType.number==number; - } - - public int getDiscountRate(){ - return this.discountRate; - } +public class PayType { + private final int number; + private final int discountRate; + + public PayType(int number, int discountRate) { + this.number = number; + this.discountRate = discountRate; + } + + public boolean isEqualPayType(int number) { + return this.number == number; + } + + public int getDiscountRate() { + return this.discountRate; + } } diff --git a/src/main/java/domain/Table.java b/src/main/java/domain/Table.java index 3e78e7d..d19f51d 100644 --- a/src/main/java/domain/Table.java +++ b/src/main/java/domain/Table.java @@ -1,20 +1,22 @@ package domain; public class Table { - private final int number; + private final int number; - public Table(final int number) { - this.number = number; - } + public Table(final int number) { + this.number = number; + } - public int getNumber() { - return number; - } + public int getNumber() { + return number; + } - public boolean isEqualNumber(int tableNumber){ return this.number==number;} + public boolean isEqualNumber(int tableNumber) { + return this.number == tableNumber; + } - @Override - public String toString() { - return Integer.toString(number); - } + @Override + public String toString() { + return Integer.toString(number); + } } diff --git a/src/main/java/repository/MenuRepository.java b/src/main/java/repository/MenuRepository.java index f1a7dbf..c0e4ed5 100644 --- a/src/main/java/repository/MenuRepository.java +++ b/src/main/java/repository/MenuRepository.java @@ -1,49 +1,50 @@ package repository; -import domain.Category; -import domain.Menu; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; +import domain.Category; +import domain.Menu; + public class MenuRepository { - private static final List menus = new ArrayList<>(); - - static { - menus.add(new Menu(1, "가나슈", Category.CAKE, 7000)); - menus.add(new Menu(2, "당근 케이크", Category.CAKE, 6500)); - menus.add(new Menu(3, "아이스 박스", Category.CAKE, 8000)); - menus.add(new Menu(4, "티라미수", Category.CAKE, 5500)); - menus.add(new Menu(5, "치즈 케이크", Category.CAKE, 7000)); - menus.add(new Menu(6, "얼그레이 케이크", Category.CAKE, 7000)); - menus.add(new Menu(21, "아메리카노", Category.BEVERAGE, 4500)); - menus.add(new Menu(22, "에스프레소", Category.BEVERAGE, 4000)); - menus.add(new Menu(23, "카푸치노", Category.BEVERAGE, 5000)); - menus.add(new Menu(24, "그린티 라떼", Category.BEVERAGE, 6000)); - } - - //해당 숫자에 해당하는 메뉴 객체를 return한다. - public static Menu findByNumber(int number){ - return menus.stream() - .filter(menu -> menu.isEqualNumber(number)) - .findFirst() - .orElseThrow(IllegalAccessError::new); - } - - //입력된 숫자에 해당하는 메뉴가 있는지 검사한다. - public static boolean checkMenuNumber(int number){ - Menu menu = findByNumber(number); - return menu.isEqualNumber(number); - } - - public Optional findByName(String name){ - return menus.stream() - .filter(menu -> menu.getName().equals(name)) - .findAny(); - } - public static List menus() { - return Collections.unmodifiableList(menus); - } + private static final List menus = new ArrayList<>(); + + static { + menus.add(new Menu(1, "가나슈", Category.CAKE, 7000)); + menus.add(new Menu(2, "당근 케이크", Category.CAKE, 6500)); + menus.add(new Menu(3, "아이스 박스", Category.CAKE, 8000)); + menus.add(new Menu(4, "티라미수", Category.CAKE, 5500)); + menus.add(new Menu(5, "치즈 케이크", Category.CAKE, 7000)); + menus.add(new Menu(6, "얼그레이 케이크", Category.CAKE, 7000)); + menus.add(new Menu(21, "아메리카노", Category.BEVERAGE, 4500)); + menus.add(new Menu(22, "에스프레소", Category.BEVERAGE, 4000)); + menus.add(new Menu(23, "카푸치노", Category.BEVERAGE, 5000)); + menus.add(new Menu(24, "그린티 라떼", Category.BEVERAGE, 6000)); + } + + //해당 숫자에 해당하는 메뉴 객체를 return한다. + public static Menu findByNumber(int number) { + return menus.stream() + .filter(menu -> menu.isEqualNumber(number)) + .findFirst() + .orElseThrow(IllegalAccessError::new); + } + + //입력된 숫자에 해당하는 메뉴가 있는지 검사한다. + public static boolean checkMenuNumber(int number) { + Menu menu = findByNumber(number); + return menu.isEqualNumber(number); + } + + public static List menus() { + return Collections.unmodifiableList(menus); + } + + public Optional findByName(String name) { + return menus.stream() + .filter(menu -> menu.getName().equals(name)) + .findAny(); + } } diff --git a/src/main/java/repository/OrderRepository.java b/src/main/java/repository/OrderRepository.java index 0eec332..edab05b 100644 --- a/src/main/java/repository/OrderRepository.java +++ b/src/main/java/repository/OrderRepository.java @@ -1,93 +1,69 @@ package repository; -import domain.Menu; -import domain.Order; -import domain.PayType; -import service.CafeOrderService; - -import java.util.*; -import java.util.stream.Collectors; - import static java.util.stream.Collectors.*; -//주문 정보들을 저장하고 주문한 것들의 합을 계산한다. -public class OrderRepository{ - private static final int MAX_NUMBER_PER_MENU = 30; - private final List orders = new ArrayList<>(); +import java.util.ArrayList; +import java.util.List; +import java.util.Map; - //주문을 받는다. - public void addOrder(final Order order) - { - orders.add(order); - } +import domain.Bill; +import domain.Menu; +import domain.Order; - //해당 테이블에서 주문한 해당 메뉴의 수량을 return한다. - public int countMenusNumber(int tableNumber, int menuNumber){ - int count= (int)orders.stream() - .filter(order->order.isEqualTable(tableNumber)) - .filter(order->order.isEqualMenuNumber(menuNumber)) - .count(); - return count; - } +//주문 정보들을 저장하고 주문한 것들의 합을 계산한다. +public class OrderRepository { + private static final int MAX_NUMBER_PER_MENU = 30; + private final List orders = new ArrayList<>(); - //해당 테이블에서 주문할 수 있는 한 메뉴의 최대 수량을 넘는지 아닌지 검사한다. - public boolean checkMaximumPerMenu(int tableNumber, int menuNumber, int menuCount){ - int existedMenusCount = countMenusNumber(tableNumber, menuNumber); - if(existedMenusCount+menuCount<=MAX_NUMBER_PER_MENU){ - return true; - } - return false; - } - //해당 테이블에서 주문한 것들을 모두 return한다. - public List findByTableNumber(int tableNumber) - { - return - orders.stream() - .filter(order-> order.isEqualTable(tableNumber)) - .collect(toList()); - } + //주문을 받는다. + public void addOrder(final Order order) { + orders.add(order); + } - //해당 테이블에서 주문한 메뉴와 수량을 return한다. - public Map getBill(int tableNumber){ - List orders = findByTableNumber(tableNumber); - Map bill = orders.stream() - .map(order -> MenuRepository.findByNumber(order.getMenuNumber())) - .collect(Collectors.groupingBy(order->order,HashMap::new, counting())); + //해당 테이블에서 주문한 해당 메뉴의 수량을 return한다. + public int countMenusNumber(int tableNumber, int menuNumber) { + return orders.stream() + .filter(order -> order.isEqualTable(tableNumber)) + .filter(order -> order.isEqualMenuNumber(menuNumber)) + .mapToInt(order -> order.getMenuCount()) + .sum(); + } - return bill; - } + //해당 테이블에서 주문할 수 있는 한 메뉴의 최대 수량을 넘는지 아닌지 검사한다. + public boolean checkMaximumPerMenu(int tableNumber, int menuNumber, int menuCount) { + int existedMenusCount = countMenusNumber(tableNumber, menuNumber); + return existedMenusCount + menuCount <= MAX_NUMBER_PER_MENU; + } - //지불이 완료되면 해당 테이블의 주문을 모두 삭제한다. - public void finishedPayment(int tableNumber){ - orders.removeIf(order->order.isEqualTable(tableNumber)); - } + //해당 테이블에서 주문한 것들을 모두 return한다. + public List findByTableNumber(int tableNumber) { + return + orders.stream() + .filter(order -> order.isEqualTable(tableNumber)) + .collect(toList()); + } - //해당 테이블이 주문된 테이블인지 검사한다. - public boolean isOrderedTable(int tableNumber){ - if(getBill(tableNumber).isEmpty()){ - return false; - } - return true; - } + //지불이 완료되면 해당 테이블의 주문을 모두 삭제한다. + public void finishedPayment(int tableNumber) { + orders.removeIf(order -> order.isEqualTable(tableNumber)); + } - //해당 테이블에서 주문한 케익의 갯수를 계산한다. - public int getNumberOfCakes(int tableNumber) { - int numberOfCakes = 0; - Map bill = getBill(tableNumber); - for (Map.Entry entry : bill.entrySet()){ - numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; - } - return numberOfCakes; - } + //해당 테이블에서 주문한 케익의 갯수를 계산한다. + public int getNumberOfCakes(Bill bill) { + int numberOfCakes = 0; + for (Map.Entry entry : bill.getOrderedMenus().entrySet()) { + numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; + } + return numberOfCakes; + } - //해당 테이블에서 주문한 메뉴들 가격의 총 합을 계산한다. - public long getSumOfPayment(int tableNumber){ - long totalSumOfPayment = 0; - Map bill = getBill(tableNumber); - for (Map.Entry entry : bill.entrySet()){ - totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); - } - return totalSumOfPayment; - } + //해당 테이블에서 주문한 메뉴들 가격의 총 합을 계산한다. + public long getSumOfPayment(Bill bill) { + long totalSumOfPayment = 0; + for (Map.Entry entry : bill.getOrderedMenus().entrySet()) { + totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); + } + return totalSumOfPayment; + } } \ No newline at end of file diff --git a/src/main/java/repository/PayTypeRepository.java b/src/main/java/repository/PayTypeRepository.java new file mode 100644 index 0000000..8dbe2d9 --- /dev/null +++ b/src/main/java/repository/PayTypeRepository.java @@ -0,0 +1,22 @@ +package repository; + +import java.util.ArrayList; +import java.util.List; + +import domain.PayType; + +public class PayTypeRepository { + public static final List payTypes = new ArrayList<>(); + + static { + payTypes.add(new PayType(1, 0)); + payTypes.add(new PayType(2, 10)); + } + + public static PayType findByNumber(int number) { + return payTypes.stream() + .filter(payType -> payType.isEqualPayType(number)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("결제 수단은 카드(1)와 현금(2)만 존재합니다.")); + } +} diff --git a/src/main/java/repository/TableRepository.java b/src/main/java/repository/TableRepository.java index 53c1939..9b07836 100644 --- a/src/main/java/repository/TableRepository.java +++ b/src/main/java/repository/TableRepository.java @@ -1,34 +1,34 @@ package repository; -import domain.Table; -import service.CafeOrderService; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; +import domain.Table; + public class TableRepository { - private static final List
tables = new ArrayList<>(); + private static final List
tables = new ArrayList<>(); - static { - tables.add(new Table(1)); - tables.add(new Table(2)); - tables.add(new Table(3)); - tables.add(new Table(5)); - tables.add(new Table(6)); - tables.add(new Table(8)); - } + static { + tables.add(new Table(1)); + tables.add(new Table(2)); + tables.add(new Table(3)); + tables.add(new Table(5)); + tables.add(new Table(6)); + tables.add(new Table(8)); + } - //nubmer에 해당하는 Table을 return한다. - public static Optional
findByNumber(int number){ - return Optional.ofNullable(tables.stream() - .filter(table -> table.isEqualNumber(number)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(number+"번 테이블은 존재하지 않는 테이블입니다.")));//Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 - } + //nubmer에 해당하는 Table을 return한다. + public static Optional
findByNumber(int number) { + return Optional.ofNullable(tables.stream() + .filter(table -> table.isEqualNumber(number)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException( + number + "번 테이블은 존재하지 않는 테이블입니다.")));//Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 + } - public static List
tables() { - return Collections.unmodifiableList(tables); - } + public static List
tables() { + return Collections.unmodifiableList(tables); + } } diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index b607669..f00accc 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -1,82 +1,77 @@ package service; -import domain.*; +import java.util.Map; + +import domain.Bill; +import domain.Menu; +import domain.Order; +import domain.PayType; import repository.MenuRepository; import repository.OrderRepository; import repository.TableRepository; -import view.InputView; -import view.OutputView; - -import java.util.Map; //카페의 주문과 관련된 서비스를 제공하는 클래스 -public class CafeOrderService{ - private static final int DISCOUNT_FOR_CAKES = 3; - private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; +public class CafeOrderService { + private static final int DISCOUNT_FOR_CAKES = 3; + private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; + + private final OrderRepository orderRepository; - private final OrderRepository orderRepository; + public CafeOrderService(OrderRepository orderRepository) { + this.orderRepository = orderRepository; + } - public CafeOrderService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; - } + //해당 테이블이 존재하는 테이블인지 검사한다. + public boolean isValidTableNumber(int tableNumber) { + if (TableRepository.findByNumber(tableNumber).isPresent()) { + return true; + } + return false; + } - //해당 테이블이 존재하는 테이블인지 검사한다. - public boolean isValidTableNumber(int tableNumber) - { - if(TableRepository.findByNumber(tableNumber).isPresent()){ - return true; - } - return false; - } + //주문하려는 메뉴의 수량이 누적 30개가 넘는지 확인한다. + public boolean checkMaximumCount(int tableNumber, int menuNumber, int menuCount) { + return orderRepository.checkMaximumPerMenu(tableNumber, menuNumber, menuCount); + } - //주문하려는 메뉴의 수량이 누적 30개가 넘는지 확인한다. - public boolean checkMaximumCount(int tableNumber, int menuNumber, int menuCount) - { - return orderRepository.checkMaximumPerMenu(tableNumber, menuNumber, menuCount); - } + // 주문을 추가한다. + public void orderMenu(int tableNumber, int menuNumber, int menuCount) { + orderRepository.addOrder(new Order(tableNumber, menuNumber, menuCount)); + } - //해당 수량만큼의 주문을 추가한다. - public void orderMenu(int menuNumber, int count, int tableNumber) - { - for(int i=0;i getBillByTable(int tableNumber) { - return orderRepository.getBill(tableNumber); - } + //OrderedTable이면 True return + public boolean checkOrderedTable(int tableNumber) { + Map orderedMenus = getBillByTable(tableNumber).getOrderedMenus(); - //해당 테이블에 주문이 들어간 테이블인지 검사한다. --> 테이블 정보를 알고있는 객체면 좋을듯!! - public boolean checkOrderedTable(int tableNumber){ - return orderRepository.isOrderedTable(tableNumber); - } + return orderedMenus != null && !orderedMenus.isEmpty(); + } - //입력된 메뉴가 존재하는 메뉴인지 검사한다. - public boolean isValidMenuNumber(int menuNumber) { - if(MenuRepository.checkMenuNumber(menuNumber)){ - return true; - } - return false; - } + //입력된 메뉴가 존재하는 메뉴인지 검사한다. + public boolean isValidMenuNumber(int menuNumber) { + return MenuRepository.checkMenuNumber(menuNumber) ? true : false; + } - //지불해야하는 총 금액을 return한다. - public long getAmountOfPayment(int tableNumber, PayType payType) { - int numberOfCakes = orderRepository.getNumberOfCakes(tableNumber); - long amountOfPayment = getFinalPayment(tableNumber, numberOfCakes, payType.getDiscountRate()); - orderRepository.finishedPayment(tableNumber); + //지불해야하는 총 금액을 return한다. + public long getAmountOfPayment(Bill bill, PayType payType) { + int numberOfCakes = orderRepository.getNumberOfCakes(bill); + long amountOfPayment = getFinalPayment(bill, numberOfCakes, payType.getDiscountRate()); + orderRepository.finishedPayment(bill.getTableNumber()); - return amountOfPayment; - } + return amountOfPayment; + } - //할인을 적용한 최종 금액을 계산한다. - private long getFinalPayment(int tableNumber, int numberOfCakes, int discountRate){ - long totalSumOfPayment = orderRepository.getSumOfPayment(tableNumber); - if(numberOfCakes>=DISCOUNT_FOR_CAKES){ - totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes/3); - } - totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment*((float)discountRate/100)); - return totalSumOfPayment; - } + //할인을 적용한 최종 금액을 계산한다. + private long getFinalPayment(Bill bill, int numberOfCakes, int discountRate) { + long totalSumOfPayment = orderRepository.getSumOfPayment(bill); + if (numberOfCakes >= DISCOUNT_FOR_CAKES) { + totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes / 3); + } + totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment * ((float)discountRate / 100)); + return totalSumOfPayment; + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index d67dc47..3923d0b 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -4,35 +4,35 @@ //사용자의 입력과 관련된 모든 일을 담당하는 클래스 public class InputView { - private static final Scanner scanner = new Scanner(System.in); - - public static int inputFunction(){ - System.out.println("\n## 기능 선택"); - return scanner.nextInt(); - } - - public static int inputTableNumber() { - System.out.println("## 주문할 테이블을 선택하세요."); - return scanner.nextInt(); - } - - public static int inputPayTableNumber(){ - System.out.println("\n## 테이블 선택"); - return scanner.nextInt(); - } - - public static int inputMenu(){ - System.out.println("\n## 메뉴 선택"); - return scanner.nextInt(); - } - - public static int inputCount(){ - System.out.println("\n## 수량 선택"); - return scanner.nextInt(); - } - - public static int inputPayType() { - System.out.println("## 신용카드는 1번, 현금 결제는 2번"); - return scanner.nextInt(); - } + private static final Scanner scanner = new Scanner(System.in); + + public static int inputFunction() { + System.out.println("\n## 기능 선택"); + return scanner.nextInt(); + } + + public static int inputTableNumber() { + System.out.println("## 주문할 테이블을 선택하세요."); + return scanner.nextInt(); + } + + public static int inputPayTableNumber() { + System.out.println("\n## 테이블 선택"); + return scanner.nextInt(); + } + + public static int inputMenu() { + System.out.println("\n## 메뉴 선택"); + return scanner.nextInt(); + } + + public static int inputCount() { + System.out.println("\n## 수량 선택"); + return scanner.nextInt(); + } + + public static int inputPayType() { + System.out.println("## 신용카드는 1번, 현금 결제는 2번"); + return scanner.nextInt(); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index fff0ad9..783fc83 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,99 +1,95 @@ package view; +import java.util.List; + +import domain.Bill; import domain.Menu; import domain.Table; -import repository.OrderRepository; import service.CafeOrderService; -import java.util.List; -import java.util.Map; -import java.util.Optional; - //출력과 관련된 모든 일을 담당하는 클래스 public class OutputView { - private static final String TOP_LINE = "┌ ─ ┐"; - private static final String TABLE_FORMAT = "| %s |"; - private static final String BOTTOM_LINE = "└ ─ ┘"; - private static final String BOTTOM_LINE_ORDERED_TBL= "└ \\$ ┘"; - - public static void printMain() - { - System.out.println("## 메인화면"); - System.out.println("1 - 주문등록"); - System.out.println("2 - 결제하기"); - System.out.println("3 - 종료"); - } - - public static void printTables(final List
tables, final CafeOrderService cafeOrderService) { - System.out.println("## 테이블 목록"); - final int size = tables.size(); - printLine(TOP_LINE, size); - printTableNumbers(tables); - printLine(BOTTOM_LINE, tables, cafeOrderService); - } - - public static void printMenus(final List menus) { - for (final Menu menu : menus) { - System.out.println(menu); - } - } - - private static void printLine(final String line, final int count) { - for (int index = 0; index < count; index++) { - System.out.print(line); - } - System.out.println(); - } - - private static void printLine(final String line, final List
tables, CafeOrderService cafeOrderService){ - for(final Table table : tables) { - if (cafeOrderService.checkOrderedTable(table.getNumber())) { - System.out.print(BOTTOM_LINE_ORDERED_TBL); - } else { - System.out.print(BOTTOM_LINE); - } - } - System.out.println(); - } - - private static void printTableNumbers(final List
tables) { - for (final Table table : tables) { - System.out.printf(TABLE_FORMAT, table); - } - System.out.println(); - } - - public static void printBill(Map bill) { - System.out.println("\n## 주문 내역"); - System.out.println("메뉴 수량 금액"); - bill.forEach((key, value)->{ - System.out.println(key.getName()+" "+value+" "+key.getPrice()*value); - }); - } - - public static void printMaxAlert() - { - System.out.println("\n## 한 테이블에 주문 할 수 있는 한 메뉴의 수량은 최대 30개입니다."); - } - public static void printMenuAlert() - { - System.out.println("\n## 해당 메뉴는 존재하지 않는 메뉴입니다"); - } - - public static void printPayMessage(int tableNum) { - System.out.println("\n## "+tableNum+"번 테이블의 결제를 진행합니다."); - } - - public static void printAmountOfPayment(long amountOfPayment) { - System.out.println("## 최종 결제 금액"); - System.out.println(amountOfPayment); - } - - public static void printNoOrder(){ - System.out.println("주문 정보가 없는 테이블입니다.\n"); - } - - public static void printNoTableAlert() { - System.out.println("## 존재하지 않는 테이블입니다. \n테이블을 다시 선택하세요\n"); - } + private static final String TOP_LINE = "┌ ─ ┐"; + private static final String TABLE_FORMAT = "| %s |"; + private static final String BOTTOM_LINE = "└ ─ ┘"; + private static final String BOTTOM_LINE_ORDERED_TBL = "└ \\$ ┘"; + + public static void printMain() { + System.out.println("## 메인화면"); + System.out.println("1 - 주문등록"); + System.out.println("2 - 결제하기"); + System.out.println("3 - 종료"); + } + + public static void printTables(final List
tables, final CafeOrderService cafeOrderService) { + System.out.println("## 테이블 목록"); + final int size = tables.size(); + printLine(TOP_LINE, size); + printTableNumbers(tables); + printLine(BOTTOM_LINE, tables, cafeOrderService); + } + + public static void printMenus(final List menus) { + for (final Menu menu : menus) { + System.out.println(menu); + } + } + + private static void printLine(final String line, final int count) { + for (int index = 0; index < count; index++) { + System.out.print(line); + } + System.out.println(); + } + + private static void printLine(final String line, final List
tables, CafeOrderService cafeOrderService) { + for (final Table table : tables) { + if (cafeOrderService.checkOrderedTable(table.getNumber())) { + System.out.print(BOTTOM_LINE_ORDERED_TBL); + continue; + } + System.out.print(BOTTOM_LINE); + } + System.out.println(); + } + + private static void printTableNumbers(final List
tables) { + for (final Table table : tables) { + System.out.printf(TABLE_FORMAT, table); + } + System.out.println(); + } + + public static void printBill(Bill bill) { + System.out.println("\n## 주문 내역"); + System.out.println("메뉴 수량 금액"); + bill.getOrderedMenus().forEach((key, value) -> { + System.out.println(key.getName() + " " + value + " " + key.getPrice() * value); + }); + } + + public static void printMaxAlert() { + System.out.println("\n## 한 테이블에 주문 할 수 있는 한 메뉴의 수량은 최대 30개입니다."); + } + + public static void printMenuAlert() { + System.out.println("\n## 해당 메뉴는 존재하지 않는 메뉴입니다"); + } + + public static void printPayMessage(int tableNum) { + System.out.println("\n## " + tableNum + "번 테이블의 결제를 진행합니다."); + } + + public static void printAmountOfPayment(long amountOfPayment) { + System.out.println("## 최종 결제 금액"); + System.out.println(amountOfPayment); + } + + public static void printNoOrder() { + System.out.println("주문 정보가 없는 테이블입니다.\n"); + } + + public static void printNoTableAlert() { + System.out.println("## 존재하지 않는 테이블입니다. \n테이블을 다시 선택하세요\n"); + } } From 315dc175c52e38b133c10df5b5d3c313633f2e2d Mon Sep 17 00:00:00 2001 From: bominjang Date: Tue, 14 Sep 2021 15:46:53 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor=20:=20=EC=82=AC=EC=9D=B4=ED=81=B4?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - OrderRepository와 bill 사이의 사이클을 제거함. - OrderRepository가 갖고있던 책임을 변경. --- src/main/java/Application.java | 33 +++++------ src/main/java/domain/Bill.java | 57 ++++++++++++++++++- src/main/java/repository/OrderRepository.java | 39 +------------ src/main/java/service/CafeOrderService.java | 37 +++++------- 4 files changed, 83 insertions(+), 83 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 245c390..73303c2 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -6,7 +6,6 @@ import domain.PayType; import domain.Table; import repository.MenuRepository; -import repository.OrderRepository; import repository.PayTypeRepository; import repository.TableRepository; import service.CafeOrderService; @@ -21,34 +20,35 @@ public class Application { // TODO 구현 진행 public static void main(String[] args) { OutputView.printMain(); - final CafeOrderService cafeOrderService = new CafeOrderService(new OrderRepository()); + final CafeOrderService cafeOrderService = new CafeOrderService(); final List
tables = TableRepository.tables(); - int func = InputView.inputFunction(); + int selectedFunction = InputView.inputFunction(); - while (func != STOP) { - if (func == ORDER) { + while (selectedFunction != STOP) { + if (selectedFunction == ORDER) { orderMenu(tables, cafeOrderService); } - if (func == PAY) { + if (selectedFunction == PAY) { payOrders(tables, cafeOrderService); - } else if (func > STOP || func < ORDER) { + } + if (!cafeOrderService.isValidFunction(selectedFunction, STOP, ORDER)) { throw new NoSuchElementException("해당 기능은 존재하지 않습니다."); } OutputView.printMain(); - func = InputView.inputFunction(); + selectedFunction = InputView.inputFunction(); } } private static void payOrders(List
tables, CafeOrderService cafeOrderService) { OutputView.printTables(tables, cafeOrderService); - int tableNum = InputView.inputPayTableNumber(); - if (!cafeOrderService.checkOrderedTable(tableNum)) { + int tableNumber = InputView.inputPayTableNumber(); + if (!cafeOrderService.checkOrderedTable(tableNumber)) { OutputView.printNoOrder(); return; } - Bill bill = cafeOrderService.getBillByTable(tableNum); + Bill bill = cafeOrderService.getBillByTable(tableNumber); OutputView.printBill(bill); - OutputView.printPayMessage(tableNum); + OutputView.printPayMessage(tableNumber); int payTypeNumber = InputView.inputPayType(); PayType payType = PayTypeRepository.findByNumber(payTypeNumber); long amountOfPayment = cafeOrderService.getAmountOfPayment(bill, payType); @@ -58,21 +58,18 @@ private static void payOrders(List
tables, CafeOrderService cafeOrderServ private static void orderMenu(List
tables, CafeOrderService cafeOrderService) { OutputView.printTables(tables, cafeOrderService); int tableNumber = InputView.inputTableNumber(); - boolean isValidTableNumber = cafeOrderService.isValidTableNumber(tableNumber); - if (!isValidTableNumber) { + if (!cafeOrderService.isValidTableNumber(tableNumber)) { orderMenu(tables, cafeOrderService); } final List menus = MenuRepository.menus(); OutputView.printMenus(menus); int menuNumber = InputView.inputMenu(); - boolean isValidMenuNum = cafeOrderService.isValidMenuNumber(menuNumber); - if (!isValidMenuNum) { + if (!cafeOrderService.isValidMenuNumber(menuNumber)) { OutputView.printMenuAlert(); orderMenu(tables, cafeOrderService); } int menuCount = InputView.inputCount(); - boolean isMaxMenuCount = cafeOrderService.checkMaximumCount(tableNumber, menuNumber, menuCount); - if (!isMaxMenuCount) { + if (!cafeOrderService.checkMaximumCount(tableNumber, menuNumber, menuCount)) { OutputView.printMaxAlert(); return; } diff --git a/src/main/java/domain/Bill.java b/src/main/java/domain/Bill.java index 0725bfd..091e2b5 100644 --- a/src/main/java/domain/Bill.java +++ b/src/main/java/domain/Bill.java @@ -8,17 +8,21 @@ import repository.MenuRepository; import repository.OrderRepository; -//주문 메뉴와 수량을 알고있는 객체. OrderRepository는 이 객체를 통해 주문을 추가한다. +//주문 메뉴와 수량을 알고있는 객체. 계산과 관련된 것을 책임진다. public class Bill { + private static final int DISCOUNT_FOR_CAKES = 3; + private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; + private static final int MAX_NUMBER_PER_MENU = 30; + private final int tableNumber; - Map orderedMenus; + private Map orderedMenus; public Bill(int tableNumber) { this.tableNumber = tableNumber; this.orderedMenus = Collections.emptyMap(); } - //해당 테이블에서 주문한 메뉴와 수량을 return한다. + //생성 public Bill(OrderRepository orderRepository, int tableNumber) { List orders = orderRepository.findByTableNumber(tableNumber); Map orderedMenus = orders.stream() @@ -38,4 +42,51 @@ public Map getOrderedMenus() { return this.orderedMenus; } + //최대수량 검사 + public boolean checkMaximumPerMenu(int menuNumber, int menuCount) { + int existedMenusCount = this.countMenusNumber(menuNumber); + return existedMenusCount + menuCount <= MAX_NUMBER_PER_MENU; + } + + //해당 테이블에서 주문한 해당 메뉴의 수량을 return한다. + public int countMenusNumber(int menuNumber) { + int menuCount = 0; + for (Menu key : orderedMenus.keySet()) { + if (key.getNumber() != menuNumber) + continue; + menuCount = orderedMenus.get(key); + break; + } + return menuCount; + } + + //해당 테이블의 bill을 통해 주문한 케익의 갯수를 계산한다. + public int getNumberOfCakes() { + int numberOfCakes = 0; + for (Map.Entry entry : this.orderedMenus.entrySet()) { + numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; + } + return numberOfCakes; + } + + //해당 테이블의 bill을 통해 주문한 메뉴들 가격의 총 합을 계산한다. + public long getSumOfPayment() { + long totalSumOfPayment = 0; + for (Map.Entry entry : this.orderedMenus.entrySet()) { + totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); + } + return totalSumOfPayment; + } + + //할인을 적용한 최종 금액을 계산한다. + public long getDiscountedPayment(int discountRate) { + long totalSumOfPayment = this.getSumOfPayment(); + int numberOfCakes = this.getNumberOfCakes(); + if (numberOfCakes >= DISCOUNT_FOR_CAKES) { + totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes / 3); + } + totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment * ((float)discountRate / 100)); + return totalSumOfPayment; + } + } diff --git a/src/main/java/repository/OrderRepository.java b/src/main/java/repository/OrderRepository.java index edab05b..1d91874 100644 --- a/src/main/java/repository/OrderRepository.java +++ b/src/main/java/repository/OrderRepository.java @@ -4,15 +4,11 @@ import java.util.ArrayList; import java.util.List; -import java.util.Map; -import domain.Bill; -import domain.Menu; import domain.Order; -//주문 정보들을 저장하고 주문한 것들의 합을 계산한다. +//주문 정보들을 저장하고, 정보를 제공해준다. public class OrderRepository { - private static final int MAX_NUMBER_PER_MENU = 30; private final List orders = new ArrayList<>(); //주문을 받는다. @@ -20,21 +16,6 @@ public void addOrder(final Order order) { orders.add(order); } - //해당 테이블에서 주문한 해당 메뉴의 수량을 return한다. - public int countMenusNumber(int tableNumber, int menuNumber) { - return orders.stream() - .filter(order -> order.isEqualTable(tableNumber)) - .filter(order -> order.isEqualMenuNumber(menuNumber)) - .mapToInt(order -> order.getMenuCount()) - .sum(); - } - - //해당 테이블에서 주문할 수 있는 한 메뉴의 최대 수량을 넘는지 아닌지 검사한다. - public boolean checkMaximumPerMenu(int tableNumber, int menuNumber, int menuCount) { - int existedMenusCount = countMenusNumber(tableNumber, menuNumber); - return existedMenusCount + menuCount <= MAX_NUMBER_PER_MENU; - } - //해당 테이블에서 주문한 것들을 모두 return한다. public List findByTableNumber(int tableNumber) { return @@ -48,22 +29,4 @@ public void finishedPayment(int tableNumber) { orders.removeIf(order -> order.isEqualTable(tableNumber)); } - //해당 테이블에서 주문한 케익의 갯수를 계산한다. - public int getNumberOfCakes(Bill bill) { - int numberOfCakes = 0; - for (Map.Entry entry : bill.getOrderedMenus().entrySet()) { - numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; - } - return numberOfCakes; - } - - //해당 테이블에서 주문한 메뉴들 가격의 총 합을 계산한다. - public long getSumOfPayment(Bill bill) { - long totalSumOfPayment = 0; - for (Map.Entry entry : bill.getOrderedMenus().entrySet()) { - totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); - } - return totalSumOfPayment; - } - } \ No newline at end of file diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index f00accc..e690320 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -12,26 +12,25 @@ //카페의 주문과 관련된 서비스를 제공하는 클래스 public class CafeOrderService { - private static final int DISCOUNT_FOR_CAKES = 3; - private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; - private final OrderRepository orderRepository; - public CafeOrderService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; + public CafeOrderService() { + this.orderRepository = new OrderRepository(); + } + + //사용자가 선택한 기능이 valid한지 검사한다. + public static boolean isValidFunction(int selectedFunction, int STOP, int ORDER) { + return selectedFunction <= STOP || selectedFunction >= ORDER; } //해당 테이블이 존재하는 테이블인지 검사한다. public boolean isValidTableNumber(int tableNumber) { - if (TableRepository.findByNumber(tableNumber).isPresent()) { - return true; - } - return false; + return TableRepository.findByNumber(tableNumber).isPresent() ? true : false; } //주문하려는 메뉴의 수량이 누적 30개가 넘는지 확인한다. public boolean checkMaximumCount(int tableNumber, int menuNumber, int menuCount) { - return orderRepository.checkMaximumPerMenu(tableNumber, menuNumber, menuCount); + return new Bill(orderRepository, tableNumber).checkMaximumPerMenu(menuNumber, menuCount); } // 주문을 추가한다. @@ -44,7 +43,7 @@ public Bill getBillByTable(int tableNumber) { return new Bill(orderRepository, tableNumber); } - //OrderedTable이면 True return + //OrderedTable이면 return true public boolean checkOrderedTable(int tableNumber) { Map orderedMenus = getBillByTable(tableNumber).getOrderedMenus(); @@ -56,22 +55,12 @@ public boolean isValidMenuNumber(int menuNumber) { return MenuRepository.checkMenuNumber(menuNumber) ? true : false; } - //지불해야하는 총 금액을 return한다. + //최종 금액을 return 하고, orderRepository에서 주문을 삭제한다. public long getAmountOfPayment(Bill bill, PayType payType) { - int numberOfCakes = orderRepository.getNumberOfCakes(bill); - long amountOfPayment = getFinalPayment(bill, numberOfCakes, payType.getDiscountRate()); + long discountedPayment = bill.getDiscountedPayment(payType.getDiscountRate()); orderRepository.finishedPayment(bill.getTableNumber()); - return amountOfPayment; + return discountedPayment; } - //할인을 적용한 최종 금액을 계산한다. - private long getFinalPayment(Bill bill, int numberOfCakes, int discountRate) { - long totalSumOfPayment = orderRepository.getSumOfPayment(bill); - if (numberOfCakes >= DISCOUNT_FOR_CAKES) { - totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes / 3); - } - totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment * ((float)discountRate / 100)); - return totalSumOfPayment; - } } From d171c80e3a37db965696ab07a8229d7e01692c14 Mon Sep 17 00:00:00 2001 From: bominjang Date: Tue, 14 Sep 2021 16:17:32 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor=20:=20application=EC=97=90=20repos?= =?UTF-8?q?itory=20=EB=85=B8=EC=B6=9C=20=EC=97=86=EC=95=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 28 +++++++------------ src/main/java/repository/TableRepository.java | 2 +- src/main/java/service/CafeOrderService.java | 7 +++++ src/main/java/view/OutputView.java | 8 ++++-- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 73303c2..6011e2f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,13 +1,7 @@ -import java.util.List; import java.util.NoSuchElementException; import domain.Bill; -import domain.Menu; import domain.PayType; -import domain.Table; -import repository.MenuRepository; -import repository.PayTypeRepository; -import repository.TableRepository; import service.CafeOrderService; import view.InputView; import view.OutputView; @@ -21,15 +15,14 @@ public class Application { public static void main(String[] args) { OutputView.printMain(); final CafeOrderService cafeOrderService = new CafeOrderService(); - final List
tables = TableRepository.tables(); int selectedFunction = InputView.inputFunction(); while (selectedFunction != STOP) { if (selectedFunction == ORDER) { - orderMenu(tables, cafeOrderService); + orderMenu(cafeOrderService); } if (selectedFunction == PAY) { - payOrders(tables, cafeOrderService); + payOrders(cafeOrderService); } if (!cafeOrderService.isValidFunction(selectedFunction, STOP, ORDER)) { throw new NoSuchElementException("해당 기능은 존재하지 않습니다."); @@ -39,8 +32,8 @@ public static void main(String[] args) { } } - private static void payOrders(List
tables, CafeOrderService cafeOrderService) { - OutputView.printTables(tables, cafeOrderService); + private static void payOrders(CafeOrderService cafeOrderService) { + OutputView.printTables(cafeOrderService); int tableNumber = InputView.inputPayTableNumber(); if (!cafeOrderService.checkOrderedTable(tableNumber)) { OutputView.printNoOrder(); @@ -50,23 +43,22 @@ private static void payOrders(List
tables, CafeOrderService cafeOrderServ OutputView.printBill(bill); OutputView.printPayMessage(tableNumber); int payTypeNumber = InputView.inputPayType(); - PayType payType = PayTypeRepository.findByNumber(payTypeNumber); + PayType payType = cafeOrderService.findPayType(payTypeNumber); long amountOfPayment = cafeOrderService.getAmountOfPayment(bill, payType); OutputView.printAmountOfPayment(amountOfPayment); } - private static void orderMenu(List
tables, CafeOrderService cafeOrderService) { - OutputView.printTables(tables, cafeOrderService); + private static void orderMenu(CafeOrderService cafeOrderService) { + OutputView.printTables(cafeOrderService); int tableNumber = InputView.inputTableNumber(); if (!cafeOrderService.isValidTableNumber(tableNumber)) { - orderMenu(tables, cafeOrderService); + orderMenu(cafeOrderService); } - final List menus = MenuRepository.menus(); - OutputView.printMenus(menus); + OutputView.printMenus(); int menuNumber = InputView.inputMenu(); if (!cafeOrderService.isValidMenuNumber(menuNumber)) { OutputView.printMenuAlert(); - orderMenu(tables, cafeOrderService); + orderMenu(cafeOrderService); } int menuCount = InputView.inputCount(); if (!cafeOrderService.checkMaximumCount(tableNumber, menuNumber, menuCount)) { diff --git a/src/main/java/repository/TableRepository.java b/src/main/java/repository/TableRepository.java index 9b07836..d9af50b 100644 --- a/src/main/java/repository/TableRepository.java +++ b/src/main/java/repository/TableRepository.java @@ -28,7 +28,7 @@ public static Optional
findByNumber(int number) { number + "번 테이블은 존재하지 않는 테이블입니다.")));//Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 } - public static List
tables() { + public static List
getTables() { return Collections.unmodifiableList(tables); } } diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index e690320..1421c0e 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -8,6 +8,7 @@ import domain.PayType; import repository.MenuRepository; import repository.OrderRepository; +import repository.PayTypeRepository; import repository.TableRepository; //카페의 주문과 관련된 서비스를 제공하는 클래스 @@ -23,6 +24,12 @@ public static boolean isValidFunction(int selectedFunction, int STOP, int ORDER) return selectedFunction <= STOP || selectedFunction >= ORDER; } + //payType을 return한다. + public static PayType findPayType(int payTypenumber){ + return PayTypeRepository.findByNumber(payTypenumber); + } + + //해당 테이블이 존재하는 테이블인지 검사한다. public boolean isValidTableNumber(int tableNumber) { return TableRepository.findByNumber(tableNumber).isPresent() ? true : false; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 783fc83..a7a0aa9 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -5,6 +5,8 @@ import domain.Bill; import domain.Menu; import domain.Table; +import repository.MenuRepository; +import repository.TableRepository; import service.CafeOrderService; //출력과 관련된 모든 일을 담당하는 클래스 @@ -21,15 +23,17 @@ public static void printMain() { System.out.println("3 - 종료"); } - public static void printTables(final List
tables, final CafeOrderService cafeOrderService) { + public static void printTables(final CafeOrderService cafeOrderService) { System.out.println("## 테이블 목록"); + final List
tables = TableRepository.getTables(); final int size = tables.size(); printLine(TOP_LINE, size); printTableNumbers(tables); printLine(BOTTOM_LINE, tables, cafeOrderService); } - public static void printMenus(final List menus) { + public static void printMenus() { + final List menus = MenuRepository.menus(); for (final Menu menu : menus) { System.out.println(menu); }