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

[크리스마스 프로모션] 코드 리뷰 #3

Open
wants to merge 35 commits into
base: review
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
8d732d1
docs(README): 개요, 기능 목록, 시스템 흐름, 주의사항, 목표 추가
zoodung Nov 10, 2023
d33e450
docs(README): 개요 수정
zoodung Nov 10, 2023
76f1021
docs(README): 기능 목록 수정
zoodung Nov 10, 2023
b1b6e4c
feat(Discount): 크리스마스 디데이 할인 기능 구현
zoodung Nov 11, 2023
f2e956c
feat(Discount): 평일 할인 기능 구현
zoodung Nov 11, 2023
a298cd6
docs(README): 크리스마스 디데이 할인 적용 기간 수정
zoodung Nov 11, 2023
c853580
feat(Discount): 주말 할인 기능 구현
zoodung Nov 11, 2023
219b9ec
feat(Discount): 특별 할인 기능 구현
zoodung Nov 11, 2023
6b3d95f
feat(Discount): 증정 이벤트 기능 구현
zoodung Nov 11, 2023
2b219df
refactor: Discount 클래스 DecemberEvent로 수정
zoodung Nov 11, 2023
aac4092
feat(Badge): 배지 부여 기능 구현
zoodung Nov 11, 2023
6f31b08
feat(ChristmasController): 예상 방문 날짜 입력 기능 구현
zoodung Nov 11, 2023
9310269
Docs(README): 예상 방문 날짜 입력의 에외 처리, 목표 수정
zoodung Nov 11, 2023
a5a6d48
feat(ChristmasController): 메뉴와 개수 입력 기능 구현
zoodung Nov 12, 2023
eec1792
docs(README): 메뉴와 개수 입력 기능 수정
zoodung Nov 12, 2023
4c8aebd
feat: 이벤트 적용 기능 구현
zoodung Nov 12, 2023
acba3a7
feat: 혜택 미리 보기 기능 구현
zoodung Nov 12, 2023
f54ed0d
docs(README): 핵심기능7 추가, 목표 사항 수정
zoodung Nov 12, 2023
64c83a4
refactor(Customer): sortOrderMenu()를 StoreMenu로 분리
zoodung Nov 12, 2023
48c6511
refactor(DecemberEvent, StoreMenu): increaseMenuCount함수 추가, sortOrder…
zoodung Nov 13, 2023
fd175e4
refactor(DecemberEvent): applyWeekdayDiscount(), applyWeekendDiscount…
zoodung Nov 13, 2023
a46ec95
refactor: Customer를 데이터 클래스로 수정, OrederItems 데이터 클래스 선언, 리팩토링에 따른 입력기…
zoodung Nov 13, 2023
e68a44b
refactor: EventHelper 클래스 생성, 리팩토링 전의 customer의 계산, 이벤트 적용 역할을 위임
zoodung Nov 13, 2023
147e7b5
refactor(OutputView): 리팩토링에 따른 타입 등 수정
zoodung Nov 13, 2023
c9a8cc4
refactor: Customer 데이터클래스에서 클래스로 수정, 멤버들이 입력되면 주문의 총액을 구하고 이벤트 적용 요청 처리
zoodung Nov 13, 2023
c8646ce
refactor: 미리보기 안내 메세지 출력 추가
zoodung Nov 13, 2023
1681431
refactor: 배지 부여 기능에 필요한 총혜택 금액 오류 수정
zoodung Nov 13, 2023
a6b0f80
refactor: 미리보기 안내 메세지 날짜 출력 오류 수정
zoodung Nov 13, 2023
db77872
refactor(EventHelperTest): 이벤트 적용 기능 테스트의 배지 검사 조건 수정
zoodung Nov 13, 2023
43d2925
docs(README): 기능 목록, 시스템 흐름, 주의 사항, 목표 수정
zoodung Nov 13, 2023
09e819c
refactor(DecemberEvent): 증정 이벤트 기준 금액 조건 수정
zoodung Nov 14, 2023
4d3d15f
docs(README): 시스템 흐름 수정
zoodung Nov 14, 2023
834e322
refactor(Customer): 이벤트 적용 기준 금액 조건 수정
zoodung Nov 14, 2023
e037292
docs(README): 기능 목록, 시스템 흐름 수정
zoodung Nov 14, 2023
b1c264b
docs(README): 개요 및 목표 수정
zoodung Nov 15, 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
120 changes: 120 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# 미션 - 크리스마스 프로모션
<hr/>

## 🔍 개요 및 목표
- 크리스마스 프로모션은 중복 가능한 할인과 증정, 배지 부여를 통한 예비 혜택의 기대 심리가 결합된
프로모션으로 중복된 할인과 증정을 허용해 고객 입장에서 혜택을 체감할 수 있어야 하며 주최측에서는
지난 5년 중 최고 판매 금액 달성과 참여 고객중 5%이상의 인원이 다음 프로모션에 재참여 할 수
있도록 유도하는 것을 목표로 한다.
<hr/>

## 📝 기능 목록

### 이벤트
#### 핵심 기능 1. 크리스마스 디데이 할인
- [x] 적용 기간: 2023.12.1 ~ 2023.12.25 (매일)
- [x] 1000원 + ((날짜 - 1) * 100원) 중복 할인을 적용한다.
#### 핵심 기능 2. 평일 할인
- [x] 적용 기간: 2023.12.1 ~ 2023.12.31 (일요일~목요일)
- [x] (디저트 메뉴 총 주문 수량 * 2023)원 중복 할인을 적용한다.
#### 핵심 기능 3. 주말할인
- [x] 적용 기간: 2023.12.1 ~ 2023.12.31 (금요일~토요일)
- [x] (메인 메뉴 총 주문 수량 * 2023)원 중복 할인원 중복 할인을 적용한다.
#### 핵심 기능 4. 특별 할인
- [x] 적용 기간: 2023.12.1 ~ 2023.12.31 (일요일, 크리스마스 당일)
- [x] 총 주문 금액 1000원 중복 할인을 적용한다.
#### 핵심 기능 5. 증정 이벤트
- [x] 적용 기간: 2023.12.1 ~ 2023.12.31
- [x] 할인 전 총 주문 금액이 12만 원 이상일 때, 샴페인 1개 증정한다.
#### 핵심 기능 6. 배지 부여
- [x] 적용 기간: 2023.12.1 ~ 2023.12.31
- [x] 총 혜택 금액 5천 원 이상 : 별
- [x] 총 혜택 금액 1만 원 이상 : 트리
- [x] 총 혜택 금액 2만 원 이상 : 산타
#### 핵심 기능 7. 이벤트 적용
- [x] 총 주문 금액 10,000원 이상이면 핵심 기능 1, 2, 3, 4, 5, 6을 적용한다.

### 입력
#### 입력 기능 1. 예상 방문 날짜 입력
- [x] 유효한 예상 방문 날짜를 입력한다.
- [x] 예외 처리
- 양의 정수를 입력하지 않은 경우
- 1~31 범위에 해당하지 않는 경우
- 에러 메세지는 "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요.” 로 통일한다.
#### 입력 기능 2. 메뉴와 수량 입력
- [x] 유효한 메뉴와 수량을 입력한다.
- [x] 예외 처리
- 공백인 경우
- 메뉴 형식에서 하이픈이 없는 경우
- 존재하지 않는 메뉴 이름을 입력한 경우
- 메뉴 형식의 수량이 양의 정수가 아닌 경우
- 메뉴의 수량이 1보다 적은 경우
- 입력한 주문의 총 수량이 20개를 초과한 경우
- 중복되는 메뉴 이름을 입력한 경우
- 음료 메뉴만 입력한 경우
- 에러 메세지는 “[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요." 로 통일한다.

### 출력
#### 출력 기능 1. 혜택 미리 보기
- [x] 혜택 미리보기 안내 메세지 출력
- [x] <주문 메뉴> 출력
- 출력 순서는 메뉴의 에피타이저, 메인, 디저트, 음료 순서로 정렬하여 출력한다.
- [x] <할인 전 총주문 금액> 출력
- [x] <증정 메뉴> 출력
- 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음"으로 출력한다.
- [x] <혜택 내역> 출력
- 고객에게 적용된 이벤트 내역만 출력한다.
- 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 출력한다.
- 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 핵심 기능 상위 순서부터 출력한다.
- [x] <총헤택 금액> 출력
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격
- [x] <할인 후 예상 결제 금액> 출력
- 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액
- [x] <12월 이벤트 배지> 출력
- 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 출력한다.
- 이벤트 배지가 부여되지 않는 경우, "없음"으로 출력한다.
<hr/>

## 🕒 시스템 흐름
1. 고객이 식당에 방문할 날짜를 미리 선택해 입력한다.
1) 예외 처리 후 유효한 입력을 customer의 visitDate에 저장한다.
2. 고객이 식당에 주문할 메뉴를 미리 선택해 입력한다.
1) 예외 처리 후 유효한 입력을 customer의 orderMenu에 저장한다.
3. 이벤트 적용을 요청한다.
1) 고객의 주문 금액이 10,000원 이상이면 요청에 대한 이벤트 적용 처리를 수행한다.
2) 고객의 주문 금액이 10,000원 미만이면 요청에 대한 이벤트 적용 처리는 수행되지 않는다.
4. 이벤트 플래너가 해당하는 미리보기 내용을 출력한다.
1) 주문 메뉴
2) 할인 전 총주문 금액
3) 증정 메뉴
4) 혜택 내역
5) 총혜택 금액
6) 할인 후 예상 결제 금액
7) 12월 이벤트 배지
<hr/>

## 🚨 구현 과정 주의 사항
- [x] 입력과 출력은 InputView, OutputView 클래스로 별도 구현한다.
- [x] 적용된 이벤트가 하나도 없는 경우를 고려한다.
- [x] 모든 에러 메시지는 "[ERROR]"로 시작한다.
- [x] 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고,
"[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
- [x] indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다.
- [x] 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- [x] JUnit 5와 AssertJ를 이용해 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.
- [x] else 사용을 지양한다.
- [x] 도메인 로직에 단위 테스트를 구현해야 한다.
<hr/>

## 🏁 목표
- [x] 테스트 주도 개발(TDD)로 구현한다.
- [x] 테스트 코드에서 반복적으로 하는 부분을 중복되지 않게 한다.
- [x] Enum Class 를 적극 활용한다.
- [x] README를 구체적으로 작성하고 살아있는 문서 작성을 위해 노력한다.
- [x] 필드의 수를 최소화한다.
- [x] 객체는 객체스럽게 사용한다.
- [x] 객체의 필드는 private으로 접근을 제한하고 val을 사용해 값의 변경을 제한한다.
- [x] Controller가 아닌 InputView에서 입력을 처리한다.
- [x] 예외 처리 과정에서 "^\\d+$" 를 통해 유효한 숫자를 검사한다.
- [x] getter사용을 지양하기 위해 노력하며 객체에게 메세지를 던진다.
<hr/>
4 changes: 3 additions & 1 deletion src/main/kotlin/christmas/Application.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package christmas

import christmas.controller.ChristmasController

fun main() {
TODO("프로그램 구현")
ChristmasController().run()
}
58 changes: 58 additions & 0 deletions src/main/kotlin/christmas/controller/ChristmasController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package christmas.controller

import christmas.model.Customer
import christmas.model.EventHelper
import christmas.model.OrderItems
import christmas.model.StoreMenu.Companion.sortOrderMenu
import christmas.model.StoreMenu.Companion.splitOrderMenu
import christmas.model.StoreMenu.Companion.splitOrderMenuForValidate
import christmas.utils.Validate.validateOrderMenu
import christmas.utils.Validate.validateVisitDate
import christmas.view.InputView
import christmas.view.OutputView

class ChristmasController {
private val input = InputView()
private val output = OutputView()

fun run() {
output.printStartPlanner()
val customer = Customer(inputVisitDate(), inputOrderMenu())

customer.requestApplyDecemberEvent()
previewBenefit(customer, customer.getEventHelper())
}

private fun inputVisitDate(): Int {
return try {
val visitDateInput = input.readVisitDate()
validateVisitDate(visitDateInput)
visitDateInput.toInt()
Comment on lines +29 to +30
Copy link

Choose a reason for hiding this comment

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

이름에 맞게 검증이 완료되면 검증이 완료된 값을 뱉는건 어떨까요?

Copy link
Owner Author

Choose a reason for hiding this comment

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

validateVisitDate(visitDateInput) 예외 처리 과정에서 IllegalArgumentException이 발생하지 않는다면 입력이 유효한 것이기 때문에 따로 변수를 선언하여 불필요한 메모리 할당을 하지 않고 Int로만 변환하여 return 해도 될 것이라고 생각하고 작성했던 코드인 것 같습니다. validateVisitDate() 함수는 예외 처리에 관한 함수이기 때문에 역할과 책임에 대해서도 고민하고 작성했던 것 같긴 하지만 제시해주신 의견대로 validateVisitDate()에 return type을 지정하여서 return 값을 가지는 것도 하나의 방법이 될 수 있을 것 같아요! 감사합니다 :)

} catch (e: IllegalArgumentException) {
println(e.message)
inputVisitDate()
}
}

private fun inputOrderMenu(): List<OrderItems> {
return try {
val orderMenuInput = input.readOrderMenu()
validateOrderMenu(splitOrderMenuForValidate(orderMenuInput))
splitOrderMenu(orderMenuInput)
} catch (e: IllegalArgumentException) {
println(e.message)
inputOrderMenu()
}
}

private fun previewBenefit(customer: Customer, eventHelper: EventHelper) {
output.printPreviewAnnounce(customer.getVisitDate())
output.printOrderMenu(sortOrderMenu(customer.getOrderMenu()))
output.printTotalOrderPrize(customer.calculateTotalOrderSum())
output.printFreebieMenu(eventHelper.getFreebie())
output.printBenefitDetails(eventHelper.getDiscountHistory(), eventHelper.getFreebie())
output.printBenefitAmount(eventHelper.calculateTotalBenefitAmount())
output.printPaymentAmount(customer.calculateTotalOrderSum(), eventHelper.getDiscountHistory())
output.printBadge(eventHelper.getBadge())
}
}
33 changes: 33 additions & 0 deletions src/main/kotlin/christmas/model/Customer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package christmas.model

import christmas.utils.Constant.DISCOUNT_THRESHOLD
import christmas.utils.Constant.EMPTY

class Customer(
private val visitDate: Int,
private val orderMenu: List<OrderItems>
) {
private val eventHelper = EventHelper()

fun getVisitDate(): Int = visitDate

fun getOrderMenu(): List<OrderItems> = orderMenu

fun getEventHelper(): EventHelper = eventHelper

fun calculateTotalOrderSum(): Int {
var totalOrderSum = EMPTY

for (item in orderMenu) {
val storeMenu = enumValues<StoreMenu>().first { menu -> menu.menuName == item.getMenuName() }
totalOrderSum += storeMenu.menuPrice * item.getQuantity()
}

return totalOrderSum
}

fun requestApplyDecemberEvent() {
if (calculateTotalOrderSum() >= DISCOUNT_THRESHOLD)
eventHelper.applyDecemberEvent(visitDate, orderMenu, calculateTotalOrderSum())
}
}
7 changes: 7 additions & 0 deletions src/main/kotlin/christmas/model/DecemberCalender.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package christmas.model

enum class DecemberCalender(val dates: List<Int>) {
WEEKDAY(listOf(3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 31)),
WEEKEND(listOf(1, 2, 8, 9, 15, 16, 22, 23, 29, 30)),
SPECIAL_DAY(listOf(3, 10, 17, 24, 25, 31))
}
79 changes: 79 additions & 0 deletions src/main/kotlin/christmas/model/DecemberEvent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package christmas.model

import christmas.utils.Constant.BADGE_SANTA
import christmas.utils.Constant.BADGE_STAR
import christmas.utils.Constant.BADGE_TREE
import christmas.utils.Constant.CHAMPAGNE_CONDITION_AMOUNT
import christmas.utils.Constant.CHRISTMAS_DAY_DISCOUNT_AMOUNT
import christmas.utils.Constant.DAILY_DISCOUNT_AMOUNT
import christmas.utils.Constant.FIRST_DAY_DISCOUNT_AMOUNT
import christmas.utils.Constant.EMPTY
import christmas.utils.Constant.NONE
import christmas.utils.Constant.ONE_DAY_DECREASE
import christmas.utils.Constant.SANTA_MIN
import christmas.utils.Constant.STAR_MAX
import christmas.utils.Constant.STAR_MIN
import christmas.utils.Constant.TREE_MAX
import christmas.utils.Constant.TREE_MIN
import christmas.utils.Constant.WEEK_DISCOUNT_AMOUNT

class DecemberEvent {
fun applyTheDayDiscount(date: Int): Int {
val dailyDiscount = (date - ONE_DAY_DECREASE) * DAILY_DISCOUNT_AMOUNT

return FIRST_DAY_DISCOUNT_AMOUNT + dailyDiscount
}

fun applyWeekdayDiscount(orderMenu: List<OrderItems>): Int {
var dessertMenuCount = EMPTY

for (item in orderMenu) {
val increaseCount = increaseDessertMenuCount(item.getMenuName(), item.getQuantity())
dessertMenuCount += increaseCount
}
Comment on lines +30 to +33

Choose a reason for hiding this comment

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

만약에 제가 kotlin api를 활용햇 해당 메서드를 구현한다면,

dessertMenuCount = orderMenu.filter { it.menuName == StoreMenu.CHOCO_CAKE.menuName || it.menuName == StoreMenu.ICE_CREAM.menuName }.sumOf { it.quantity }

이렇게 하면 메서드 하나로 디저트 메뉴 개수를 구할수도 있어요!!

Copy link
Owner Author

Choose a reason for hiding this comment

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

제시해주신 코드가 확실히 간결하고 코틀린스러워 보이네요! 앞으로의 과정에서는 코틀린에 대한 학습 시간을 일정 시간 지정해서 스스로 숙련도를 향상시킬 필요가 있을 것 같아요. 리뷰 감사합니다 :)


return dessertMenuCount * WEEK_DISCOUNT_AMOUNT
}

private fun increaseDessertMenuCount(menuName: String, quantity: Int): Int {
if (menuName == StoreMenu.CHOCO_CAKE.menuName || menuName == StoreMenu.ICE_CREAM.menuName)
return quantity

return EMPTY
}


fun applyWeekendDiscount(orderMenu: List<OrderItems>): Int {
var mainMenuCount = EMPTY

for (item in orderMenu) {
val increaseCount = increaseMainMenuCount(item.getMenuName(), item.getQuantity())
mainMenuCount += increaseCount
}

return mainMenuCount * WEEK_DISCOUNT_AMOUNT
}

private fun increaseMainMenuCount(menuName: String, quantity: Int): Int {
if (menuName == StoreMenu.T_BONE_STEAK.menuName || menuName == StoreMenu.BBQ_RIBS.menuName ||
menuName == StoreMenu.SEAFOOD_PASTA.menuName || menuName == StoreMenu.CHRISTMAS_PASTA.menuName
)
Comment on lines +58 to +60

Choose a reason for hiding this comment

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

코틀린 코딩 컨벤션에서는 의무 사항은 아니지만, 3개 이상의 조건에 대해서는 when의 사용을 권장합니다. 만약 if를 사용하고 싶으시다면, 가독성 적인 측면을 위해서 각각 조건에 대해 여러 줄로 나누시는 등의 방법으로 가독성을 높이는 것이 좋을 것 같습니다.

Copy link
Owner Author

@zoodung zoodung Nov 16, 2023

Choose a reason for hiding this comment

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

으악,,가독성을 많이 신경 쓴 미션이었는데 놓친 부분이 있었네요. 말씀해주신 방법들도 ELSE를 지양할 수 있다는 가정하에 고려해볼 수 있을 것 같아요. 지금 드는 생각은 메인 메뉴들을 맵이나 리스트로 그룹화하고 조건 검사를 진행했다면 한번의 검사로도 충분히 동일한 처리를 했을 수 있을 거 같아요..다른 클래스에서는 동일한 방법으로 리팩토링을 진행했기 때문에 아쉬움이 많이 남는 부분이네요..리뷰 감사합니다 :)

Comment on lines +58 to +60

Choose a reason for hiding this comment

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

이렇게 조건이 많을 경우에는,

val mainMenus = listOf(StoreMenu.T_BONE_STEAK.menuName....)
if (mainMenus.contains(menu)) { 
    return quantity
}

이렇게 하면 좀더 간단히 작성할 수 있어요!!

Copy link
Owner Author

Choose a reason for hiding this comment

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

제시해주신 코드가 확실히 개선된 코드인 거 같아요. 사실 방법을 알고도 반복되는 리팩토링 속에서 해당 부분을 놓쳣다는게 아쉬움을 많이 남겼습니다.. 깔끔한 코드와 리뷰 감사합니다 :)

return quantity

return EMPTY
}

fun applySpecialDiscount(): Int = CHRISTMAS_DAY_DISCOUNT_AMOUNT

fun presentChampagne(totalOrderAmount: Int): Boolean = totalOrderAmount >= CHAMPAGNE_CONDITION_AMOUNT

fun assignBadge(benefitAmount: Int): String {
when {
benefitAmount in STAR_MIN..STAR_MAX -> return BADGE_STAR
benefitAmount in TREE_MIN..TREE_MAX -> return BADGE_TREE
benefitAmount >= SANTA_MIN -> return BADGE_SANTA
}
Comment on lines +70 to +75

Choose a reason for hiding this comment

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

아마 이렇게 작성하신 이유가, 그냥 >= 기호만 사용하면 STAR 배지만 return 되어서 그런거 같은데,

when {
    benefitAmount >= 20000 -> retrun BADGE_SANTA
    benefitAmount >= 10000 -> retrun BADGE_TREE
    benefitAmount >= 5000 -> retrun BADGE_STAR
}

이렇게 거꾸로 작성하면 문제를 해결할 수 있습니다!

Copy link
Owner Author

Choose a reason for hiding this comment

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

아 동작 순서에 따라서 또 다르게 작성될 수 있네요. 제시 해주신 코드처럼 낮은 금액보다는 높은 금액부터 검사하는 것이 처리 과정을 확실히 줄일 수 있겠다는 생각이 들어요! 많은 부분에서 도움을 받게 된 것 같아요.. 정말 감사합니다!


return NONE
Comment on lines +71 to +77
Copy link

Choose a reason for hiding this comment

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

이거
return when{
어쩌고 저쩌고
else -> NONE
}
이렇게도 쓸 수 있는 걸루 알아요!

Copy link
Owner Author

Choose a reason for hiding this comment

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

미션의 요구 사항에 'else를 지양한다.'는 사항에 대해서 가독성은 유지함과 동시에 else를 사용하지 않는 방법에 대하여 고민하고 작성했던 코드인 것 같습니다. 제시해주신 return when도 구현 과정에서 고려했었지만 최종적으로는 when을 사용하게 되었던 것 같아요. else를 지양하면서 더 나은 가독성을 갖출 수 있는 방법을 더 고민해봐야 될 것 같습니다! 리뷰 감사합니다 :)

Copy link

Choose a reason for hiding this comment

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

헉 저도모르게 when문 안에 들어있는 else는 if-else랑 다르다고 생각을 하고 있었습니다..! 제가 놓친 부분을 짚어주셔서 감사하네요!

}
}
43 changes: 43 additions & 0 deletions src/main/kotlin/christmas/model/DiscountType.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package christmas.model

import christmas.utils.Constant.CHRISTMAS_DAY
import christmas.utils.Constant.EMPTY

enum class DiscountType(val eventName: String) {
THE_DAY_DISCOUNT("크리스마스 디데이 할인"),
WEEKDAY_DISCOUNT("평일 할인"),
WEEKEND_DISCOUNT("주말 할인"),
SPECIAL_DISCOUNT("특별 할인");

companion object {
Copy link

Choose a reason for hiding this comment

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

enum class 속 companion object는 어떤 역할을 하나요? 잘 몰라서 물어봅니다 😓

Copy link
Owner Author

Choose a reason for hiding this comment

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

답변을 드리고자 내용을 작성하였는데..코드 자체적으로도 단일 책임 원칙에 관해 더 고려할 부분이 있어 보이고 혹시나 제 답변이 사실과 다른 내용이 포함된다면 학습에 혼란을 드릴 수 있을 것 같아 잘 설명된 링크를 첨부합니다! 큰 도움을 드리지 못해 죄송합니다..
링크 1. https://kotlinlang.org/docs/object-declarations.html#companion-objects
링크 2. https://www.baeldung.com/kotlin/enum-static-method

private val decemberEvent = DecemberEvent()

fun requestTheDayDiscount(visitDate: Int): Int {
if (visitDate <= CHRISTMAS_DAY)
return decemberEvent.applyTheDayDiscount(visitDate)

return EMPTY
}

fun requestWeekdayDiscount(visitDate: Int, orderMenu: List<OrderItems>): Int {
if (visitDate in DecemberCalender.WEEKDAY.dates)
return decemberEvent.applyWeekdayDiscount(orderMenu)

return EMPTY
}

fun requestWeekendDiscount(visitDate: Int, orderMenu: List<OrderItems>): Int {
if (visitDate in DecemberCalender.WEEKEND.dates)
return decemberEvent.applyWeekendDiscount(orderMenu)

return EMPTY
}

fun requestSpecialDiscount(visitDate: Int): Int {
if (visitDate in DecemberCalender.SPECIAL_DAY.dates)
return decemberEvent.applySpecialDiscount()

return EMPTY
}
}
}
Loading