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

[치킨] 김연진 미션 제출합니다. #1

Open
wants to merge 39 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ab02098
docs: 기능 구현 목록 작성
homebdy Aug 30, 2023
ed7606f
feat(OutputView): 메인 화면 출력
homebdy Aug 30, 2023
989d80f
feat(InputView): 기능 선택 입력
homebdy Aug 30, 2023
89450ff
feat(MainOptions): 존재하지 않는 기능 입력 시 예외 발생
homebdy Aug 30, 2023
40642fa
feat(ChickenController): 게임 종료 기능 구현
homebdy Aug 30, 2023
ad5d302
feat(InputView): 테이블 선택 입력 기능 구현
homebdy Aug 30, 2023
3b72405
feat(InputView): 선택할 메뉴 번호 입력
homebdy Aug 30, 2023
6333c3b
feat(MenuRepository): 존재하지 않는 메뉴 입력시 예외 발생
homebdy Aug 30, 2023
e8b0541
feat(MenuRepository): 존재하지 않는 테이블 입력시 예외 발생
homebdy Aug 30, 2023
cfc805e
feat(InputView): 구매 수량 입력
homebdy Aug 31, 2023
d735ddb
feat(Table): 주문 추가 기능 구현
homebdy Aug 31, 2023
2ceeffc
feat(Table): 똑같은 메뉴를 100마리 이상 시킬 경우 예외 발생
homebdy Aug 31, 2023
48beaec
refactor(TableRepository): 메서드 이름 변경
homebdy Aug 31, 2023
c4f64a6
feat(OutputView): 주문 목록 출력
homebdy Aug 31, 2023
74517bb
feat(InputView): 결제 수단 입력
homebdy Aug 31, 2023
78ff40a
feat(Payment): 최종 금액 계산
homebdy Aug 31, 2023
f3a5cb9
feat(OutputView): 최종 결제 금액 출력
homebdy Aug 31, 2023
82bd501
feat(OutputView): 줄 바꿈 출력
homebdy Aug 31, 2023
9f0ed0e
feat(InputValidator): 숫자가 아닌 다른 입력이 들어올 경우 예외 발생
homebdy Aug 31, 2023
b06de76
feat(InputValidator): 잘못 입력한 부분부터 재시작 기능 구현
homebdy Aug 31, 2023
6703bbf
feat(ChickenController): 예외 처리
homebdy Aug 31, 2023
76dccbc
feat(OutputView): 주문이 존재하는 테이블 출력
homebdy Sep 1, 2023
7a68a08
refactor(ChickenController): 메서드 분리
homebdy Sep 1, 2023
b052239
refactor(Order): 주문 내역 관리 기능 분리
homebdy Sep 1, 2023
b33f18d
refactor(Table): 결제 기능 수정
homebdy Sep 1, 2023
d5d171a
refactor(Table): 하드코딩 제거
homebdy Sep 1, 2023
8f35e73
refactor(Table): 접근 제어자 수정
homebdy Sep 1, 2023
f494e83
test(Category): 카테고리 확인 테스트
homebdy Sep 1, 2023
ce2290a
test(MainOption): 기능 선택 입력 테스트
homebdy Sep 1, 2023
488af65
test(MenuRepository): menu 반환 기능 테스트
homebdy Sep 1, 2023
36ff702
test(Order): 주문 테스트
homebdy Sep 1, 2023
9386998
test(Order): 주문 금액 반환 기능 테스트
homebdy Sep 1, 2023
385386f
test(Order): 예외 테스트
homebdy Sep 1, 2023
abe4f8b
test(TableRepository): 예외 테스트
homebdy Sep 1, 2023
a0a9c26
test(Table): 주문 및 결제 테스트
homebdy Sep 1, 2023
4f9aed9
feat(PaymentType): 결제 수단 선택시 존재하지 않는 수단을 선택할 경우 예외 발생
homebdy Sep 1, 2023
1845944
test(ChickenService): 서비스 테스트
homebdy Sep 1, 2023
b2efa00
test(InputValidator): 입력 예외 처리 테스트
homebdy Sep 1, 2023
afb2eba
docs: 구현 완료 기능 업데이트
homebdy Sep 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
## 출력

- [x] 메인 화면
- [x] 테이블 목록
- [x] 치킨 메뉴 목록
- [x] 주문 목록
- [x] 최종 결제 금액

## 입력

- [x] 기능 선택
- [x] 테이블 선택 입력
- [x] 선택할 메뉴 번호
- [x] 구매할 수량 입력
- [x] 카드, 현금 선택 입력

## 테이블들을 생성

- [x] 숫자를 입력하면 테이블을 만든다.
- [x] 테이블의 정보를 가져온다.

## 테이블의 주문을 관리

- [x] 주문이 들어올 경우 해당 테이블에 주문을 추가한다.
- [x] 결제를 할 경우 총 금액을 계산한다.
- [x] 결제가 완료되면 초기화 한다.
- [x] 주문 목록을 확인한다.

## 결제

- [x] 카드와 현금 중 하나로 최종 금액을 결제한다.
- [x] 할인률 계산

## 예외
- [x] 메인 기능 선택 시 1, 2, 3 이외 다른 숫자 입력
- [x] 존재하지 않는 테이블 입력
- [x] 존재하지 않는 메뉴 입력
- [x] 똑같은 치킨을 100마리 이상 시킬 경우
- [x] 존재하지 않는 결제 선택지 선택
20 changes: 4 additions & 16 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,9 @@
import domain.Menu;
import domain.MenuRepository;
import domain.Table;
import domain.TableRepository;
import view.InputView;
import view.OutputView;

import java.util.List;
import controller.ChickenController;

public class Application {
// TODO 구현 진행
public static void main(String[] args) {
final List<Table> tables = TableRepository.tables();
OutputView.printTables(tables);

final int tableNumber = InputView.inputTableNumber();

final List<Menu> menus = MenuRepository.menus();
OutputView.printMenus(menus);
public static void main(String[] args) {
ChickenController controller = new ChickenController();
controller.run();
}
}
23 changes: 23 additions & 0 deletions src/main/java/constant/ExceptionMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package constant;

public enum ExceptionMessage {

INCORRECT_MAIN_OPTION("존재하지 않는 기능입니다."),
NOT_EXIST_MENU("존재하지 않는 메뉴입니다."),
NOT_EXIST_TABLE("존재하지 않는 테이블입니다."),
ORDER_QUANTITY_EXCEEDED("주문 수량을 초과하였습니다."),
NOT_NUMBER("숫자만 입력 가능합니다."),
NOT_EXIST_PAYMENT_TYPE("존재하지 않는 테이블입니다."),;

private static final String PREFIX = "[ERROR] ";
private final String message;

ExceptionMessage(String message) {
this.message = message;
}

@Override
public String toString() {
return PREFIX + message;
}
}
26 changes: 26 additions & 0 deletions src/main/java/constant/OutputMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package constant;

public enum OutputMessage {

MAIN_OPTION("메인화면"),
OPTION_SELECT("원하는 기능을 선택하세요."),
TABLE_SELECT("테이블을 선택하세요."),
MENU("등록할 메뉴를 선택하세요."),
QUANTITY("메뉴의 수량을 입력하세요."),
ORDER_HISTORY("주문 내역"),
PAYMENT_START("%s번 테이블의 결제를 진행합니다"),
PAYMENT_METHOD("신용 카드는 1번, 현금은 2번"),
TOTAL_PRICE("최종 결제할 금액");

private static final String PREFIX = "## ";
private final String message;

OutputMessage(String message) {
this.message = message;
}

@Override
public String toString() {
return PREFIX + this.message;
}
}
28 changes: 28 additions & 0 deletions src/main/java/constant/PaymentType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package constant;

import java.util.Arrays;

public enum PaymentType {

CARD(1, 1),
CASH(2, 0.95);

private final int number;
private final double discountRate;

PaymentType(int number, double discountRate) {
this.number = number;
this.discountRate = discountRate;
}

public static PaymentType getPaymentType(int number) {
return Arrays.stream(PaymentType.values())
.filter(paymentType -> paymentType.number == number)
.findAny()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_EXIST_PAYMENT_TYPE.toString()));
}

public double getDiscountRate() {
return discountRate;
}
}
21 changes: 21 additions & 0 deletions src/main/java/constant/PrintElement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package constant;

public enum PrintElement {

HYPHEN(" - "),
NEW_LINE("\n"),
HISTORY_CONFIG("메뉴 수량 금액"),
BLANK(" "),
TOTAL_PRICE("%d원\n");

private final String message;

PrintElement(String message) {
this.message = message;
}

@Override
public String toString() {
return this.message;
}
}
55 changes: 55 additions & 0 deletions src/main/java/controller/ChickenController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package controller;

import domain.*;
import service.ChickenService;
import view.InputView;
import view.OutputView;

public class ChickenController {

private final ChickenService service = new ChickenService();

public void run() {
try {
startSelling();
} catch (IllegalArgumentException exception) {
OutputView.printExceptionMessage(exception.getMessage());
}
}

private void startSelling() {
while (true) {
OutputView.printMainOption();
MainOptions option = InputView.inputMainOption();
if (option.isTermination()) {
break;
}
orderMenu(option);
payment(option);
}
}

private void orderMenu(MainOptions options) {
if (options.isOrder()) {
int tableNumber = findTable();
OutputView.printMenus(MenuRepository.menus());
Menu menu = InputView.inputMenu();
int quantity = InputView.inputQuantity();
service.order(tableNumber, menu, quantity);
}
}

private void payment(MainOptions options) {
if (options.isPayment()) {
Table table = service.findByTableNumber(findTable());
OutputView.printOrderHistory(table);
OutputView.printPayment(table);
OutputView.printTotalPrice(service.payment(table, InputView.inputPayment()));
}
}

private int findTable() {
OutputView.printTables(TableRepository.tables());
return InputView.inputTableNumber();
}
}
4 changes: 4 additions & 0 deletions src/main/java/domain/Category.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ public enum Category {
this.name = name;
}

public boolean isChicken() {
return this == CHICKEN;
}

@Override
public String toString() {
return "[" + name + "]";
Expand Down
52 changes: 52 additions & 0 deletions src/main/java/domain/MainOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package domain;

import constant.ExceptionMessage;
import constant.PrintElement;

import java.util.Arrays;

public enum MainOptions {

ORDER_REGISTRATION(1, "주문등록"),
PAYMENT(2, "결제하기"),
TERMINATION(3, "프로그램 종료");

private final int choice;
private final String title;

MainOptions(int choice, String title) {
this.choice = choice;
this.title = title;
}

public static MainOptions getMainOptions(int input) {
return Arrays.stream(MainOptions.values())
.filter(option -> input == option.choice)
.findAny()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INCORRECT_MAIN_OPTION.toString()));
}

public boolean isTermination() {
return this == TERMINATION;
}

public boolean isOrder() {
return this == ORDER_REGISTRATION;
}

public boolean isPayment() {
return this == PAYMENT;
}

public static String printValues() {
StringBuilder stringBuilder = new StringBuilder();
Arrays.stream(MainOptions.values())
.forEach((value) ->
stringBuilder.append(value.choice)
.append(PrintElement.HYPHEN)
.append(value.title)
.append(PrintElement.NEW_LINE)
);
return stringBuilder.toString();
}
}
16 changes: 16 additions & 0 deletions src/main/java/domain/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,22 @@ public Menu(final int number, final String name, final Category category, final
this.price = price;
}

public boolean isExist(int number) {
return number == this.number;
}

public boolean isChicken() {
return category.isChicken();
}

public String getName() {
return name;
}

public int getPrice() {
return price;
}

@Override
public String toString() {
return category + " " + number + " - " + name + " : " + price + "원";
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/domain/MenuRepository.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package domain;

import constant.ExceptionMessage;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
Expand All @@ -18,6 +20,13 @@ public class MenuRepository {
menus.add(new Menu(22, "사이다", Category.BEVERAGE, 1_000));
}

public static Menu findMenuByNumber(int number) {
return menus.stream()
.filter((menu) -> menu.isExist(number))
.findAny()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_EXIST_MENU.toString()));
}

public static List<Menu> menus() {
return Collections.unmodifiableList(menus);
}
Expand Down
Loading