-
MVC 패턴을 활용하여 클래스 나누기
-
사용자로부터 입력값읇 받는다.
2-1. 입력값이 유효한 값인지 검증한다.
가능한 에러 상황들
-
날짜
-
빈 값
-
정수가 아닌 값
-
정수이지만 1~31 사이의 값이 아닐 때
-
-
메뉴목록
-
빈 값
-
형식( "메뉴-수량,메뉴-수량,...")에 맞지 않는 값
-
형식은 맞지만 주어진 메뉴에 없는 음식일 때
-
각 메뉴당 가능한 수량이 1~20 이고, 전체 수량의 최댓값이 20이다.
-
메뉴가 중복될 때
-
-
-
사용자에게 출력값을 보여준다.
-
정해진 기간동안 해당하는 이벤트를 구분해서 할인과 혜택을 계산할 수 있다.
5-1. 디데이 이벤트 할인 가격을 계산할 수 있다.
5-2. 요일별로 맞는 메뉴 할인할 수 있다.
5-3. 특별 할인을 할 수 있다.
5-4. 할인 전 총 금액을 계산할 수 있다.
5-5. 총 가격이 12만원 이상일 때 샴페인 1병을 증정한다.
5-6. 총 혜택 가격을 계산할 수 있다.
5-7. 총 할인 가격 및 계산해야 할 가격을 계산할 수 있다.
-
에러 상황 때 에러를 내고, 에러 문구를 보여준다. (시작은 [ERROR] )
- 고객들이 식당에 방문할 날짜와 메뉴를 미리 선택하면 이벤트 플래너가 주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용을 보여주기를 기대합니다.
- 12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
- 방문할 날짜는 1 이상 31 이하의 숫자로만 입력받아 주세요.
- 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.
- 주문하실 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
- 고객이 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 메뉴의 개수는 1 이상의 숫자만 입력되도록 해주세요. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.
- 주문 메뉴의 출력 순서는 자유롭게 출력해 주세요.
- 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 보여 주세요.
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격
- 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액
- 증정 메뉴
- 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음"으로 보여 주세요.
- 혜택 내역
- 고객에게 적용된 이벤트 내역만 보여 주세요.
- 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 보여 주세요.
- 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 자유롭게 출력해주세요.
- 이벤트 배지
- 이벤트 배지가 부여되지 않는 경우, "없음"으로 보여 주세요.
- Node.js 18.17.1 버전에서 실행 가능해야 한다. Node.js 18.17.1에서 정상적으로 동작하지 않을 경우 0점 처리한다.
- 프로그램 실행의 시작점은
App.js
의run
메서드이다. 아래와 같이 프로그램을 실행시킬 수 있어야 한다. -
package.json
을 변경할 수 없고 외부 라이브러리(jQuery, Lodash 등)를 사용하지 않는다. 순수 Vanilla JS로만 구현한다. - JavaScript 코드 컨벤션을 지키면서 프로그래밍 한다
- 프로그램 종료 시
process.exit()
를 호출하지 않는다. - 프로그램 구현이 완료되면
ApplicationTest
의 모든 테스트가 성공해야 한다. 테스트가 실패할 경우 0점 처리한다. - 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다.
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
- Jest를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- else를 지양한다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- 때로는 if/else, switch문을 사용하는 것이 더 깔끔해 보일 수 있다. 어느 경우에 쓰는 것이 적절할지 스스로 고민해 본다.
- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(Console.readLineAsync, Console.print) 로직에 대한 단위 테스트는 제외한다.
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- 사용자가 잘못된 값을 입력할 경우
throw
문을 사용해 예외를 발생시킨다. 그런 다음, "[ERROR]"로 시작하는 에러 메시지를 출력하고 해당 부분부터 입력을 다시 받는다.
- 아래에 제공되는
InputView
,OutputView
객체를 활용해 구현한다.- 입력과 출력을 담당하는 객체를 별도로 구현한다.
-
InputView
,OutputView
의 파일 경로는 변경할 수 있다. -
InputView
,OutputView
의 메서드의 이름과 인자는 필요에 따라 추가하거나 변경할 수 있다. - 값 출력을 위해 필요한 메서드를 추가할 수 있다.