From 9ac932946916125dec4eae6cf4859ba953ec3b43 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 23:19:53 +0900 Subject: [PATCH 01/14] =?UTF-8?q?refactor:=20machine=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/StudyCafePassMachine.java | 81 +++++++------------ 1 file changed, 31 insertions(+), 50 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index 3d34d9eef..1781c0ee9 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -14,63 +14,21 @@ public class StudyCafePassMachine { private final InputHandler inputHandler = new InputHandler(); private final OutputHandler outputHandler = new OutputHandler(); + private final StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); public void run() { try { outputHandler.showWelcomeMessage(); outputHandler.showAnnouncement(); - outputHandler.askPassTypeSelection(); StudyCafePassType studyCafePassType = inputHandler.getPassTypeSelectingUserAction(); - - if (studyCafePassType == StudyCafePassType.HOURLY) { - StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); - List studyCafePasses = studyCafeFileHandler.readStudyCafePasses(); - List hourlyPasses = studyCafePasses.stream() - .filter(studyCafePass -> studyCafePass.getPassType() == StudyCafePassType.HOURLY) - .toList(); - outputHandler.showPassListForSelection(hourlyPasses); - StudyCafePass selectedPass = inputHandler.getSelectPass(hourlyPasses); - outputHandler.showPassOrderSummary(selectedPass, null); - } else if (studyCafePassType == StudyCafePassType.WEEKLY) { - StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); - List studyCafePasses = studyCafeFileHandler.readStudyCafePasses(); - List weeklyPasses = studyCafePasses.stream() - .filter(studyCafePass -> studyCafePass.getPassType() == StudyCafePassType.WEEKLY) - .toList(); - outputHandler.showPassListForSelection(weeklyPasses); - StudyCafePass selectedPass = inputHandler.getSelectPass(weeklyPasses); - outputHandler.showPassOrderSummary(selectedPass, null); - } else if (studyCafePassType == StudyCafePassType.FIXED) { - StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); - List studyCafePasses = studyCafeFileHandler.readStudyCafePasses(); - List fixedPasses = studyCafePasses.stream() - .filter(studyCafePass -> studyCafePass.getPassType() == StudyCafePassType.FIXED) - .toList(); - outputHandler.showPassListForSelection(fixedPasses); - StudyCafePass selectedPass = inputHandler.getSelectPass(fixedPasses); - - List lockerPasses = studyCafeFileHandler.readLockerPasses(); - StudyCafeLockerPass lockerPass = lockerPasses.stream() - .filter(option -> - option.getPassType() == selectedPass.getPassType() - && option.getDuration() == selectedPass.getDuration() - ) - .findFirst() - .orElse(null); - - boolean lockerSelection = false; - if (lockerPass != null) { - outputHandler.askLockerPass(lockerPass); - lockerSelection = inputHandler.getLockerSelection(); - } - - if (lockerSelection) { - outputHandler.showPassOrderSummary(selectedPass, lockerPass); - } else { - outputHandler.showPassOrderSummary(selectedPass, null); - } - } + List hourlyPasses = getStudyCafePasses(studyCafePassType); + outputHandler.showPassListForSelection(hourlyPasses); + //입장권 선택 + StudyCafePass selectedPass = inputHandler.getSelectPass(hourlyPasses); + //총 요금 출력 + StudyCafeLockerPass lockerPass = getLockerPass(selectedPass); + outputHandler.showPassOrderSummary(selectedPass, lockerPass); } catch (AppException e) { outputHandler.showSimpleMessage(e.getMessage()); } catch (Exception e) { @@ -78,4 +36,27 @@ public void run() { } } + private List getStudyCafePasses(StudyCafePassType type) { + List studyCafePasses = studyCafeFileHandler.readStudyCafePasses(); + return studyCafePasses.stream() + .filter(studyCafePass -> studyCafePass.getPassType() == type) + .toList(); + } + + private StudyCafeLockerPass getLockerPass(StudyCafePass selectedPass) { + if (selectedPass.getPassType() != StudyCafePassType.FIXED) return null; + List lockerPasses = studyCafeFileHandler.readLockerPasses(); + StudyCafeLockerPass existsLockerPass = lockerPasses.stream() + .filter(option -> + option.getPassType() == selectedPass.getPassType() + && option.getDuration() == selectedPass.getDuration() + ) + .findFirst() + .orElse(null); + if (existsLockerPass != null) { + outputHandler.askLockerPass(existsLockerPass); + return inputHandler.getLockerSelection() ? existsLockerPass : null; + } + return null; + } } From e2b65b76dbea234875af9b3bc21b4e170594c8f1 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 13:30:45 +0900 Subject: [PATCH 02/14] refactor: display -> toString --- .../java/cleancode/studycafe/tobe/io/OutputHandler.java | 8 ++++---- .../studycafe/tobe/model/StudyCafeLockerPass.java | 4 ++-- .../cleancode/studycafe/tobe/model/StudyCafePass.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index d8e0181a4..8a5cf52ce 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -27,7 +27,7 @@ public void showPassListForSelection(List passes) { System.out.println("이용권 목록"); for (int index = 0; index < passes.size(); index++) { StudyCafePass pass = passes.get(index); - System.out.println(String.format("%s. ", index + 1) + pass.display()); + System.out.println(String.format("%s. ", index + 1) + pass); } } @@ -35,7 +35,7 @@ public void askLockerPass(StudyCafeLockerPass lockerPass) { System.out.println(); String askMessage = String.format( "사물함을 이용하시겠습니까? (%s)", - lockerPass.display() + lockerPass ); System.out.println(askMessage); @@ -45,9 +45,9 @@ public void askLockerPass(StudyCafeLockerPass lockerPass) { public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass lockerPass) { System.out.println(); System.out.println("이용 내역"); - System.out.println("이용권: " + selectedPass.display()); + System.out.println("이용권: " + selectedPass); if (lockerPass != null) { - System.out.println("사물함: " + lockerPass.display()); + System.out.println("사물함: " + lockerPass); } double discountRate = selectedPass.getDiscountRate(); diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 6512ec0a8..bbae569cc 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -28,7 +28,8 @@ public int getPrice() { return price; } - public String display() { + @Override + public String toString() { if (passType == StudyCafePassType.HOURLY) { return String.format("%s시간권 - %d원", duration, price); } @@ -40,5 +41,4 @@ public String display() { } return ""; } - } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index 0749f41b8..c789cbac1 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -34,7 +34,8 @@ public double getDiscountRate() { return discountRate; } - public String display() { + @Override + public String toString() { if (passType == StudyCafePassType.HOURLY) { return String.format("%s시간권 - %d원", duration, price); } @@ -46,5 +47,4 @@ public String display() { } return ""; } - } From 9f70926ec5bd18c32d44e8b5aa52e8d946ebf40b Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 13:46:59 +0900 Subject: [PATCH 03/14] =?UTF-8?q?refactor:=20repository=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/StudyCafePassMachine.java | 47 ++++++++----------- .../studycafe/tobe/io/OutputHandler.java | 8 ++-- .../tobe/model/StudyCafeLockerPass.java | 8 ++++ .../model/StudyCafeLockerPassRepository.java | 29 ++++++++++++ .../tobe/model/StudyCafePassRepository.java | 24 ++++++++++ 5 files changed, 84 insertions(+), 32 deletions(-) create mode 100644 src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java create mode 100644 src/main/java/cleancode/studycafe/tobe/model/StudyCafePassRepository.java diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index 1781c0ee9..2073ef95f 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -4,9 +4,7 @@ import cleancode.studycafe.tobe.io.InputHandler; import cleancode.studycafe.tobe.io.OutputHandler; import cleancode.studycafe.tobe.io.StudyCafeFileHandler; -import cleancode.studycafe.tobe.model.StudyCafeLockerPass; -import cleancode.studycafe.tobe.model.StudyCafePass; -import cleancode.studycafe.tobe.model.StudyCafePassType; +import cleancode.studycafe.tobe.model.*; import java.util.List; @@ -15,19 +13,28 @@ public class StudyCafePassMachine { private final InputHandler inputHandler = new InputHandler(); private final OutputHandler outputHandler = new OutputHandler(); private final StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); + private final StudyCafePassRepository passRepository = StudyCafePassRepository.from(studyCafeFileHandler); + private final StudyCafeLockerPassRepository lockerPassRepository = StudyCafeLockerPassRepository.from(studyCafeFileHandler); public void run() { try { outputHandler.showWelcomeMessage(); outputHandler.showAnnouncement(); outputHandler.askPassTypeSelection(); + + //입장권 조회 StudyCafePassType studyCafePassType = inputHandler.getPassTypeSelectingUserAction(); - List hourlyPasses = getStudyCafePasses(studyCafePassType); - outputHandler.showPassListForSelection(hourlyPasses); + List hourlyPasses = passRepository.find(studyCafePassType); + //입장권 선택 + outputHandler.showPassListForSelection(hourlyPasses); StudyCafePass selectedPass = inputHandler.getSelectPass(hourlyPasses); - //총 요금 출력 - StudyCafeLockerPass lockerPass = getLockerPass(selectedPass); + + //사물함 이용 + StudyCafeLockerPass lockerPass = lockerPassRepository.findOneBy(selectedPass); + askForUsingLockerPass(lockerPass); + + //금액 출력 outputHandler.showPassOrderSummary(selectedPass, lockerPass); } catch (AppException e) { outputHandler.showSimpleMessage(e.getMessage()); @@ -36,27 +43,11 @@ public void run() { } } - private List getStudyCafePasses(StudyCafePassType type) { - List studyCafePasses = studyCafeFileHandler.readStudyCafePasses(); - return studyCafePasses.stream() - .filter(studyCafePass -> studyCafePass.getPassType() == type) - .toList(); - } - - private StudyCafeLockerPass getLockerPass(StudyCafePass selectedPass) { - if (selectedPass.getPassType() != StudyCafePassType.FIXED) return null; - List lockerPasses = studyCafeFileHandler.readLockerPasses(); - StudyCafeLockerPass existsLockerPass = lockerPasses.stream() - .filter(option -> - option.getPassType() == selectedPass.getPassType() - && option.getDuration() == selectedPass.getDuration() - ) - .findFirst() - .orElse(null); - if (existsLockerPass != null) { - outputHandler.askLockerPass(existsLockerPass); - return inputHandler.getLockerSelection() ? existsLockerPass : null; + private void askForUsingLockerPass(StudyCafeLockerPass pass) { + if (pass == null) return; + outputHandler.askLockerPass(pass); + if (inputHandler.getLockerSelection()) { + pass.use(); } - return null; } } diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index 8a5cf52ce..724a07203 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -34,8 +34,8 @@ public void showPassListForSelection(List passes) { public void askLockerPass(StudyCafeLockerPass lockerPass) { System.out.println(); String askMessage = String.format( - "사물함을 이용하시겠습니까? (%s)", - lockerPass + "사물함을 이용하시겠습니까? (%s)", + lockerPass ); System.out.println(askMessage); @@ -46,7 +46,7 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass System.out.println(); System.out.println("이용 내역"); System.out.println("이용권: " + selectedPass); - if (lockerPass != null) { + if (lockerPass != null && lockerPass.isUse()) { System.out.println("사물함: " + lockerPass); } @@ -56,7 +56,7 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass System.out.println("이벤트 할인 금액: " + discountPrice + "원"); } - int totalPrice = selectedPass.getPrice() - discountPrice + (lockerPass != null ? lockerPass.getPrice() : 0); + int totalPrice = selectedPass.getPrice() - discountPrice + (lockerPass != null && lockerPass.isUse() ? lockerPass.getPrice() : 0); System.out.println("총 결제 금액: " + totalPrice + "원"); System.out.println(); } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index bbae569cc..12e122caa 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -5,6 +5,7 @@ public class StudyCafeLockerPass { private final StudyCafePassType passType; private final int duration; private final int price; + private boolean use; private StudyCafeLockerPass(StudyCafePassType passType, int duration, int price) { this.passType = passType; @@ -27,6 +28,13 @@ public int getDuration() { public int getPrice() { return price; } + public void use() { + use = true; + } + + public boolean isUse() { + return use; + } @Override public String toString() { diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java new file mode 100644 index 000000000..8bdb01eca --- /dev/null +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java @@ -0,0 +1,29 @@ +package cleancode.studycafe.tobe.model; + +import cleancode.studycafe.tobe.io.StudyCafeFileHandler; + +import java.util.List; + +public class StudyCafeLockerPassRepository { + private final List passes; + + private StudyCafeLockerPassRepository(List passes) { + this.passes = passes; + } + + public StudyCafeLockerPass findOneBy(StudyCafePass selectedPass) { + if (selectedPass.getPassType() != StudyCafePassType.FIXED) return null; + return passes.stream() + .filter(option -> + option.getPassType() == selectedPass.getPassType() + && option.getDuration() == selectedPass.getDuration() + ) + .findFirst() + .orElse(null); + } + + public static StudyCafeLockerPassRepository from(StudyCafeFileHandler studyCafeFileHandler) { + List passes = studyCafeFileHandler.readLockerPasses(); + return new StudyCafeLockerPassRepository(passes); + } +} diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassRepository.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassRepository.java new file mode 100644 index 000000000..64e58988f --- /dev/null +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassRepository.java @@ -0,0 +1,24 @@ +package cleancode.studycafe.tobe.model; + +import cleancode.studycafe.tobe.io.StudyCafeFileHandler; + +import java.util.List; + +public class StudyCafePassRepository { + private final List passes; + + private StudyCafePassRepository(List passes) { + this.passes = passes; + } + + public List find(StudyCafePassType type) { + return passes.stream() + .filter(studyCafePass -> studyCafePass.getPassType() == type) + .toList(); + } + + public static StudyCafePassRepository from(StudyCafeFileHandler studyCafeFileHandler) { + List passes = studyCafeFileHandler.readStudyCafePasses(); + return new StudyCafePassRepository(passes); + } +} From d8eb9e3a2bed65f6694ad6fbf92d99a030aa3e2d Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 14:05:30 +0900 Subject: [PATCH 04/14] =?UTF-8?q?refactor:=20Pass=20Type=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/model/StudyCafeLockerPass.java | 11 +---------- .../studycafe/tobe/model/StudyCafePass.java | 12 ++---------- .../studycafe/tobe/model/StudyCafePassType.java | 15 +++++++++++---- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 12e122caa..c98d23dbb 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -38,15 +38,6 @@ public boolean isUse() { @Override public String toString() { - if (passType == StudyCafePassType.HOURLY) { - return String.format("%s시간권 - %d원", duration, price); - } - if (passType == StudyCafePassType.WEEKLY) { - return String.format("%s주권 - %d원", duration, price); - } - if (passType == StudyCafePassType.FIXED) { - return String.format("%s주권 - %d원", duration, price); - } - return ""; + return passType.toMenuString(duration, price); } } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index c789cbac1..1c815afac 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -36,15 +36,7 @@ public double getDiscountRate() { @Override public String toString() { - if (passType == StudyCafePassType.HOURLY) { - return String.format("%s시간권 - %d원", duration, price); - } - if (passType == StudyCafePassType.WEEKLY) { - return String.format("%s주권 - %d원", duration, price); - } - if (passType == StudyCafePassType.FIXED) { - return String.format("%s주권 - %d원", duration, price); - } - return ""; + return passType.toMenuString(duration, price); } + } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java index bac959b4f..b58bdd957 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java @@ -1,15 +1,22 @@ package cleancode.studycafe.tobe.model; +import java.util.function.BiFunction; + public enum StudyCafePassType { - HOURLY("시간 단위 이용권"), - WEEKLY("주 단위 이용권"), - FIXED("1인 고정석"); + HOURLY("시간 단위 이용권", (Integer duration, Integer price) -> String.format("%s시간권 - %d원", duration, price)), + WEEKLY("주 단위 이용권", (Integer duration, Integer price) -> String.format("%s주권 - %d원", duration, price)), + FIXED("1인 고정석", (Integer duration, Integer price) -> String.format("%s주권 - %d원", duration, price)); private final String description; + private final BiFunction toMenu; - StudyCafePassType(String description) { + StudyCafePassType(String description, BiFunction calculator) { this.description = description; + this.toMenu = calculator; } + public String toMenuString(Integer duration, Integer price) { + return toMenu.apply(duration, price); + } } From d4fd37c012ec71f79cc8f25dc8de663eac70cea8 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 14:12:19 +0900 Subject: [PATCH 05/14] =?UTF-8?q?refactor:=20LockerPass=20null=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/StudyCafePassMachine.java | 2 +- .../cleancode/studycafe/tobe/io/OutputHandler.java | 5 ++--- .../studycafe/tobe/model/NothingLockerPass.java | 12 ++++++++++++ .../studycafe/tobe/model/StudyCafeLockerPass.java | 6 +++++- .../tobe/model/StudyCafeLockerPassRepository.java | 4 ++-- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index 2073ef95f..9dc152fb5 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -44,7 +44,7 @@ public void run() { } private void askForUsingLockerPass(StudyCafeLockerPass pass) { - if (pass == null) return; + if (pass instanceof NothingLockerPass) return; outputHandler.askLockerPass(pass); if (inputHandler.getLockerSelection()) { pass.use(); diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index 724a07203..2b3ca9e8d 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -46,7 +46,7 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass System.out.println(); System.out.println("이용 내역"); System.out.println("이용권: " + selectedPass); - if (lockerPass != null && lockerPass.isUse()) { + if (lockerPass.isUse()) { System.out.println("사물함: " + lockerPass); } @@ -56,7 +56,7 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass System.out.println("이벤트 할인 금액: " + discountPrice + "원"); } - int totalPrice = selectedPass.getPrice() - discountPrice + (lockerPass != null && lockerPass.isUse() ? lockerPass.getPrice() : 0); + int totalPrice = selectedPass.getPrice() - discountPrice + (lockerPass.isUse() ? lockerPass.getPrice() : 0); System.out.println("총 결제 금액: " + totalPrice + "원"); System.out.println(); } @@ -64,5 +64,4 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass public void showSimpleMessage(String message) { System.out.println(message); } - } diff --git a/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java new file mode 100644 index 000000000..599aac80d --- /dev/null +++ b/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java @@ -0,0 +1,12 @@ +package cleancode.studycafe.tobe.model; + +public class NothingLockerPass extends StudyCafeLockerPass { + public NothingLockerPass() { + super(null, 0, 0); + } + + @Override + public boolean isUse() { + return false; + } +} diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index c98d23dbb..108af404f 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -7,7 +7,7 @@ public class StudyCafeLockerPass { private final int price; private boolean use; - private StudyCafeLockerPass(StudyCafePassType passType, int duration, int price) { + protected StudyCafeLockerPass(StudyCafePassType passType, int duration, int price) { this.passType = passType; this.duration = duration; this.price = price; @@ -17,6 +17,10 @@ public static StudyCafeLockerPass of(StudyCafePassType passType, int duration, i return new StudyCafeLockerPass(passType, duration, price); } + public static StudyCafeLockerPass ofNothing() { + return new NothingLockerPass(); + } + public StudyCafePassType getPassType() { return passType; } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java index 8bdb01eca..9f5c37541 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java @@ -12,14 +12,14 @@ private StudyCafeLockerPassRepository(List passes) { } public StudyCafeLockerPass findOneBy(StudyCafePass selectedPass) { - if (selectedPass.getPassType() != StudyCafePassType.FIXED) return null; + if (selectedPass.getPassType() != StudyCafePassType.FIXED) return StudyCafeLockerPass.ofNothing(); return passes.stream() .filter(option -> option.getPassType() == selectedPass.getPassType() && option.getDuration() == selectedPass.getDuration() ) .findFirst() - .orElse(null); + .orElse(StudyCafeLockerPass.ofNothing()); } public static StudyCafeLockerPassRepository from(StudyCafeFileHandler studyCafeFileHandler) { From fde9a413708bc94ebe99293d6e2c28a6aa8e9414 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 14:17:12 +0900 Subject: [PATCH 06/14] =?UTF-8?q?refactor:=20showPassOrderSummary=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cleancode/studycafe/tobe/io/OutputHandler.java | 9 +-------- .../studycafe/tobe/model/StudyCafeLockerPass.java | 3 ++- .../cleancode/studycafe/tobe/model/StudyCafePass.java | 8 ++++++++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index 2b3ca9e8d..f58b1597b 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -49,14 +49,7 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass if (lockerPass.isUse()) { System.out.println("사물함: " + lockerPass); } - - double discountRate = selectedPass.getDiscountRate(); - int discountPrice = (int) (selectedPass.getPrice() * discountRate); - if (discountPrice > 0) { - System.out.println("이벤트 할인 금액: " + discountPrice + "원"); - } - - int totalPrice = selectedPass.getPrice() - discountPrice + (lockerPass.isUse() ? lockerPass.getPrice() : 0); + int totalPrice = selectedPass.getTotalPrice() + lockerPass.getPrice(); System.out.println("총 결제 금액: " + totalPrice + "원"); System.out.println(); } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 108af404f..1e96ef9a3 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -30,8 +30,9 @@ public int getDuration() { } public int getPrice() { - return price; + return use ? price : 0; } + public void use() { use = true; } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index 1c815afac..90d230e8b 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -34,6 +34,14 @@ public double getDiscountRate() { return discountRate; } + public int getTotalPrice() { + int discountPrice = (int) (price * discountRate); + if (discountPrice > 0) { + System.out.println("이벤트 할인 금액: " + discountPrice + "원"); + } + return price - discountPrice; + } + @Override public String toString() { return passType.toMenuString(duration, price); From c28d29672c962549c38b185ac52f1bbdadfe399c Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 14:20:07 +0900 Subject: [PATCH 07/14] =?UTF-8?q?refactor:=20getter=20=EC=BA=A1=EC=8A=90?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/model/StudyCafeLockerPass.java | 13 +++++-------- .../tobe/model/StudyCafeLockerPassRepository.java | 5 +---- .../studycafe/tobe/model/StudyCafePass.java | 8 -------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 1e96ef9a3..2f7845ccd 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -21,14 +21,6 @@ public static StudyCafeLockerPass ofNothing() { return new NothingLockerPass(); } - public StudyCafePassType getPassType() { - return passType; - } - - public int getDuration() { - return duration; - } - public int getPrice() { return use ? price : 0; } @@ -41,6 +33,11 @@ public boolean isUse() { return use; } + public boolean isCompatible(StudyCafePass pass) { + return passType == pass.getPassType() + && duration == pass.getDuration(); + } + @Override public String toString() { return passType.toMenuString(duration, price); diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java index 9f5c37541..011657664 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java @@ -14,10 +14,7 @@ private StudyCafeLockerPassRepository(List passes) { public StudyCafeLockerPass findOneBy(StudyCafePass selectedPass) { if (selectedPass.getPassType() != StudyCafePassType.FIXED) return StudyCafeLockerPass.ofNothing(); return passes.stream() - .filter(option -> - option.getPassType() == selectedPass.getPassType() - && option.getDuration() == selectedPass.getDuration() - ) + .filter(option -> option.isCompatible(selectedPass)) .findFirst() .orElse(StudyCafeLockerPass.ofNothing()); } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index 90d230e8b..80914c76e 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -26,14 +26,6 @@ public int getDuration() { return duration; } - public int getPrice() { - return price; - } - - public double getDiscountRate() { - return discountRate; - } - public int getTotalPrice() { int discountPrice = (int) (price * discountRate); if (discountPrice > 0) { From be36d6eff033366d1340b22b43b0003195ded3c3 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 14:21:07 +0900 Subject: [PATCH 08/14] refactor: use -> used rename --- .../cleancode/studycafe/tobe/io/OutputHandler.java | 2 +- .../studycafe/tobe/model/NothingLockerPass.java | 2 +- .../studycafe/tobe/model/StudyCafeLockerPass.java | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index f58b1597b..fe69ae04f 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -46,7 +46,7 @@ public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass System.out.println(); System.out.println("이용 내역"); System.out.println("이용권: " + selectedPass); - if (lockerPass.isUse()) { + if (lockerPass.isUsed()) { System.out.println("사물함: " + lockerPass); } int totalPrice = selectedPass.getTotalPrice() + lockerPass.getPrice(); diff --git a/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java index 599aac80d..45ba98abd 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java @@ -6,7 +6,7 @@ public NothingLockerPass() { } @Override - public boolean isUse() { + public boolean isUsed() { return false; } } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 2f7845ccd..0a6c45588 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -5,7 +5,7 @@ public class StudyCafeLockerPass { private final StudyCafePassType passType; private final int duration; private final int price; - private boolean use; + private boolean used; protected StudyCafeLockerPass(StudyCafePassType passType, int duration, int price) { this.passType = passType; @@ -22,15 +22,15 @@ public static StudyCafeLockerPass ofNothing() { } public int getPrice() { - return use ? price : 0; + return used ? price : 0; } public void use() { - use = true; + used = true; } - public boolean isUse() { - return use; + public boolean isUsed() { + return used; } public boolean isCompatible(StudyCafePass pass) { From f30c73d578a8b14705b6900e483a9d43a8f6ecb1 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 14:23:32 +0900 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20null=EC=B2=B4=ED=81=AC=20asse?= =?UTF-8?q?rt=EB=AC=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java | 1 + src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index 9dc152fb5..ebcfaef42 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -44,6 +44,7 @@ public void run() { } private void askForUsingLockerPass(StudyCafeLockerPass pass) { + assert pass != null; if (pass instanceof NothingLockerPass) return; outputHandler.askLockerPass(pass); if (inputHandler.getLockerSelection()) { diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index fe69ae04f..2a701bcea 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -43,6 +43,7 @@ public void askLockerPass(StudyCafeLockerPass lockerPass) { } public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass lockerPass) { + assert selectedPass != null && lockerPass != null; System.out.println(); System.out.println("이용 내역"); System.out.println("이용권: " + selectedPass); From 9439361a3e32298d579f3c6645f759285875667a Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 15:26:18 +0900 Subject: [PATCH 10/14] =?UTF-8?q?refactor:=20=EB=9D=BC=EC=BB=A4=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=20=ED=95=A9=EC=84=B1=EA=B4=80=EA=B3=84=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=8F=20=EB=A6=AC=EC=8A=A4=EC=BD=94=ED=94=84=20?= =?UTF-8?q?=EC=B9=98=ED=99=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/StudyCafePassMachine.java | 12 +++--- .../studycafe/tobe/io/OutputHandler.java | 18 ++++---- .../tobe/io/StudyCafeFileHandler.java | 29 ++++++++----- .../tobe/model/FixedStudyCafePass.java | 35 ++++++++++++++++ .../tobe/model/HourlyStudyCafePass.java | 7 ++++ .../tobe/model/NothingLockerPass.java | 12 ------ .../tobe/model/StudyCafeLockerPass.java | 32 ++++++-------- .../model/StudyCafeLockerPassRepository.java | 26 ------------ .../studycafe/tobe/model/StudyCafePass.java | 42 +++++++++++++++---- .../tobe/model/WeeklyStudyCafePass.java | 7 ++++ 10 files changed, 129 insertions(+), 91 deletions(-) create mode 100644 src/main/java/cleancode/studycafe/tobe/model/FixedStudyCafePass.java create mode 100644 src/main/java/cleancode/studycafe/tobe/model/HourlyStudyCafePass.java delete mode 100644 src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java delete mode 100644 src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java create mode 100644 src/main/java/cleancode/studycafe/tobe/model/WeeklyStudyCafePass.java diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index ebcfaef42..d272f0df7 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -14,7 +14,6 @@ public class StudyCafePassMachine { private final OutputHandler outputHandler = new OutputHandler(); private final StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); private final StudyCafePassRepository passRepository = StudyCafePassRepository.from(studyCafeFileHandler); - private final StudyCafeLockerPassRepository lockerPassRepository = StudyCafeLockerPassRepository.from(studyCafeFileHandler); public void run() { try { @@ -31,11 +30,10 @@ public void run() { StudyCafePass selectedPass = inputHandler.getSelectPass(hourlyPasses); //사물함 이용 - StudyCafeLockerPass lockerPass = lockerPassRepository.findOneBy(selectedPass); - askForUsingLockerPass(lockerPass); + askForUsingLockerPass(selectedPass); //금액 출력 - outputHandler.showPassOrderSummary(selectedPass, lockerPass); + outputHandler.showPassOrderSummary(selectedPass); } catch (AppException e) { outputHandler.showSimpleMessage(e.getMessage()); } catch (Exception e) { @@ -43,12 +41,12 @@ public void run() { } } - private void askForUsingLockerPass(StudyCafeLockerPass pass) { + private void askForUsingLockerPass(StudyCafePass pass) { assert pass != null; - if (pass instanceof NothingLockerPass) return; + if (pass.isNotUsingLocker()) return; outputHandler.askLockerPass(pass); if (inputHandler.getLockerSelection()) { - pass.use(); + pass.selectLocker(); } } } diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index 2a701bcea..aecf29d4c 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -27,30 +27,30 @@ public void showPassListForSelection(List passes) { System.out.println("이용권 목록"); for (int index = 0; index < passes.size(); index++) { StudyCafePass pass = passes.get(index); - System.out.println(String.format("%s. ", index + 1) + pass); + System.out.println(String.format("%s. ", index + 1) + pass.getMenuString()); } } - public void askLockerPass(StudyCafeLockerPass lockerPass) { + public void askLockerPass(StudyCafePass pass) { System.out.println(); String askMessage = String.format( "사물함을 이용하시겠습니까? (%s)", - lockerPass + pass.getLockerMenuString() ); System.out.println(askMessage); System.out.println("1. 예 | 2. 아니오"); } - public void showPassOrderSummary(StudyCafePass selectedPass, StudyCafeLockerPass lockerPass) { - assert selectedPass != null && lockerPass != null; + public void showPassOrderSummary(StudyCafePass selectedPass) { + assert selectedPass != null; System.out.println(); System.out.println("이용 내역"); - System.out.println("이용권: " + selectedPass); - if (lockerPass.isUsed()) { - System.out.println("사물함: " + lockerPass); + System.out.println("이용권: " + selectedPass.getMenuString()); + if (selectedPass.isLockerSelected()) { + System.out.println("사물함: " + selectedPass.getLockerMenuString()); } - int totalPrice = selectedPass.getTotalPrice() + lockerPass.getPrice(); + int totalPrice = selectedPass.getTotalPrice(); System.out.println("총 결제 금액: " + totalPrice + "원"); System.out.println(); } diff --git a/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java b/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java index 920a27e59..47e258f89 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java @@ -9,22 +9,19 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class StudyCafeFileHandler { public List readStudyCafePasses() { + List lockerPasses = readLockerPasses(); try { List lines = Files.readAllLines(Paths.get("src/main/resources/cleancode/studycafe/pass-list.csv")); List studyCafePasses = new ArrayList<>(); for (String line : lines) { String[] values = line.split(","); - StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); - int duration = Integer.parseInt(values[1]); - int price = Integer.parseInt(values[2]); - double discountRate = Double.parseDouble(values[3]); - - StudyCafePass studyCafePass = StudyCafePass.of(studyCafePassType, duration, price, discountRate); - studyCafePasses.add(studyCafePass); + studyCafePasses.add(toStudyCafePass(values)); } return studyCafePasses; @@ -33,17 +30,29 @@ public List readStudyCafePasses() { } } - public List readLockerPasses() { + private StudyCafePass toStudyCafePass(String[] values) { + StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); + int duration = Integer.parseInt(values[1]); + int price = Integer.parseInt(values[2]); + double discountRate = Double.parseDouble(values[3]); + return switch (studyCafePassType) { + case HOURLY -> StudyCafePass.hourlyOf(duration, price, discountRate); + case WEEKLY -> StudyCafePass.weeklyOf(duration, price, discountRate); + case FIXED -> + StudyCafePass.fixedOf(duration, price, discountRate, readLockerPasses().stream().findFirst().orElse(null)); + }; + } + + private List readLockerPasses() { try { List lines = Files.readAllLines(Paths.get("src/main/resources/cleancode/studycafe/locker.csv")); List lockerPasses = new ArrayList<>(); for (String line : lines) { String[] values = line.split(","); - StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); int duration = Integer.parseInt(values[1]); int price = Integer.parseInt(values[2]); - StudyCafeLockerPass lockerPass = StudyCafeLockerPass.of(studyCafePassType, duration, price); + StudyCafeLockerPass lockerPass = StudyCafeLockerPass.of(duration, price); lockerPasses.add(lockerPass); } diff --git a/src/main/java/cleancode/studycafe/tobe/model/FixedStudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/FixedStudyCafePass.java new file mode 100644 index 000000000..2db336b43 --- /dev/null +++ b/src/main/java/cleancode/studycafe/tobe/model/FixedStudyCafePass.java @@ -0,0 +1,35 @@ +package cleancode.studycafe.tobe.model; + +class FixedStudyCafePass extends StudyCafePass{ + private final StudyCafeLockerPass lockerPass; + protected FixedStudyCafePass(int duration, int price, double discountRate, StudyCafeLockerPass lockerPass) { + super(StudyCafePassType.FIXED, duration, price, discountRate); + this.lockerPass = lockerPass; + } + + + @Override + public boolean isNotUsingLocker() { + return false; + } + + @Override + public int getLockerPrice() { + return lockerPass.getPrice(); + } + + @Override + public String getLockerMenuString() { + return lockerPass.toMenuString(); + } + + @Override + public void selectLocker() { + lockerPass.select(); + } + + @Override + public boolean isLockerSelected() { + return lockerPass.isSelected(); + } +} diff --git a/src/main/java/cleancode/studycafe/tobe/model/HourlyStudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/HourlyStudyCafePass.java new file mode 100644 index 000000000..09a7f5ab6 --- /dev/null +++ b/src/main/java/cleancode/studycafe/tobe/model/HourlyStudyCafePass.java @@ -0,0 +1,7 @@ +package cleancode.studycafe.tobe.model; + +class HourlyStudyCafePass extends StudyCafePass{ + protected HourlyStudyCafePass(int duration, int price, double discountRate) { + super(StudyCafePassType.HOURLY, duration, price, discountRate); + } +} diff --git a/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java deleted file mode 100644 index 45ba98abd..000000000 --- a/src/main/java/cleancode/studycafe/tobe/model/NothingLockerPass.java +++ /dev/null @@ -1,12 +0,0 @@ -package cleancode.studycafe.tobe.model; - -public class NothingLockerPass extends StudyCafeLockerPass { - public NothingLockerPass() { - super(null, 0, 0); - } - - @Override - public boolean isUsed() { - return false; - } -} diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 0a6c45588..a7a48eb6a 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -2,44 +2,36 @@ public class StudyCafeLockerPass { - private final StudyCafePassType passType; private final int duration; private final int price; - private boolean used; + private boolean selected; - protected StudyCafeLockerPass(StudyCafePassType passType, int duration, int price) { - this.passType = passType; + protected StudyCafeLockerPass(int duration, int price) { this.duration = duration; this.price = price; } - public static StudyCafeLockerPass of(StudyCafePassType passType, int duration, int price) { - return new StudyCafeLockerPass(passType, duration, price); - } - - public static StudyCafeLockerPass ofNothing() { - return new NothingLockerPass(); + public static StudyCafeLockerPass of(int duration, int price) { + return new StudyCafeLockerPass(duration, price); } public int getPrice() { - return used ? price : 0; + return selected ? price : 0; } - public void use() { - used = true; + public void select() { + selected = true; } - public boolean isUsed() { - return used; + public boolean isSelected() { + return selected; } public boolean isCompatible(StudyCafePass pass) { - return passType == pass.getPassType() - && duration == pass.getDuration(); + return duration == pass.getDuration(); } - @Override - public String toString() { - return passType.toMenuString(duration, price); + public String toMenuString() { + return StudyCafePassType.FIXED.toMenuString(duration, price); } } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java deleted file mode 100644 index 011657664..000000000 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPassRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package cleancode.studycafe.tobe.model; - -import cleancode.studycafe.tobe.io.StudyCafeFileHandler; - -import java.util.List; - -public class StudyCafeLockerPassRepository { - private final List passes; - - private StudyCafeLockerPassRepository(List passes) { - this.passes = passes; - } - - public StudyCafeLockerPass findOneBy(StudyCafePass selectedPass) { - if (selectedPass.getPassType() != StudyCafePassType.FIXED) return StudyCafeLockerPass.ofNothing(); - return passes.stream() - .filter(option -> option.isCompatible(selectedPass)) - .findFirst() - .orElse(StudyCafeLockerPass.ofNothing()); - } - - public static StudyCafeLockerPassRepository from(StudyCafeFileHandler studyCafeFileHandler) { - List passes = studyCafeFileHandler.readLockerPasses(); - return new StudyCafeLockerPassRepository(passes); - } -} diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index 80914c76e..452fa0d6f 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -1,21 +1,29 @@ package cleancode.studycafe.tobe.model; -public class StudyCafePass { +public abstract class StudyCafePass { private final StudyCafePassType passType; private final int duration; private final int price; private final double discountRate; - private StudyCafePass(StudyCafePassType passType, int duration, int price, double discountRate) { + protected StudyCafePass(StudyCafePassType passType, int duration, int price, double discountRate) { this.passType = passType; this.duration = duration; this.price = price; this.discountRate = discountRate; } - public static StudyCafePass of(StudyCafePassType passType, int duration, int price, double discountRate) { - return new StudyCafePass(passType, duration, price, discountRate); + public static StudyCafePass weeklyOf(int duration, int price, double discountRate) { + return new WeeklyStudyCafePass(duration, price, discountRate); + } + + public static StudyCafePass hourlyOf(int duration, int price, double discountRate) { + return new HourlyStudyCafePass(duration, price, discountRate); + } + + public static StudyCafePass fixedOf(int duration, int price, double discountRate, StudyCafeLockerPass lockerPass) { + return new FixedStudyCafePass(duration, price, discountRate, lockerPass); } public StudyCafePassType getPassType() { @@ -31,12 +39,32 @@ public int getTotalPrice() { if (discountPrice > 0) { System.out.println("이벤트 할인 금액: " + discountPrice + "원"); } - return price - discountPrice; + return price - discountPrice + getLockerPrice(); } - @Override - public String toString() { + public String getMenuString() { return passType.toMenuString(duration, price); } + + // 3 케이스중 1개만 override하므로 선정의 후 override + public boolean isLockerSelected() { + return false; + } + + public void selectLocker() { + } + + public boolean isNotUsingLocker() { + return true; + } + + public int getLockerPrice() { + return 0; + } + + public String getLockerMenuString() { + return ""; + } + } diff --git a/src/main/java/cleancode/studycafe/tobe/model/WeeklyStudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/WeeklyStudyCafePass.java new file mode 100644 index 000000000..55d713593 --- /dev/null +++ b/src/main/java/cleancode/studycafe/tobe/model/WeeklyStudyCafePass.java @@ -0,0 +1,7 @@ +package cleancode.studycafe.tobe.model; + +class WeeklyStudyCafePass extends StudyCafePass{ + protected WeeklyStudyCafePass(int duration, int price, double discountRate) { + super(StudyCafePassType.WEEKLY, duration, price, discountRate); + } +} From 69ad9fa80f7af47f36489861eacbd985943848eb Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 15:35:55 +0900 Subject: [PATCH 11/14] =?UTF-8?q?refactor:=20=EC=A0=91=EA=B7=BC=EC=A0=9C?= =?UTF-8?q?=EC=96=B4=EC=9E=90=20scope=20=EC=B5=9C=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tobe/io/StudyCafeFileHandler.java | 27 ++++++++----------- .../tobe/model/StudyCafeLockerPass.java | 18 ++++++------- .../studycafe/tobe/model/StudyCafePass.java | 7 +---- .../tobe/model/StudyCafePassType.java | 2 +- 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java b/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java index 47e258f89..a89abaf82 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java @@ -9,8 +9,6 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; public class StudyCafeFileHandler { @@ -21,7 +19,17 @@ public List readStudyCafePasses() { List studyCafePasses = new ArrayList<>(); for (String line : lines) { String[] values = line.split(","); - studyCafePasses.add(toStudyCafePass(values)); + StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); + int duration = Integer.parseInt(values[1]); + int price = Integer.parseInt(values[2]); + double discountRate = Double.parseDouble(values[3]); + var pass = switch (studyCafePassType) { + case HOURLY -> StudyCafePass.hourlyOf(duration, price, discountRate); + case WEEKLY -> StudyCafePass.weeklyOf(duration, price, discountRate); + case FIXED -> + StudyCafePass.fixedOf(duration, price, discountRate, lockerPasses.stream().filter((lockerPass -> lockerPass.isCompatible(duration))).findFirst().orElse(null)); + }; + studyCafePasses.add(pass); } return studyCafePasses; @@ -30,19 +38,6 @@ public List readStudyCafePasses() { } } - private StudyCafePass toStudyCafePass(String[] values) { - StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); - int duration = Integer.parseInt(values[1]); - int price = Integer.parseInt(values[2]); - double discountRate = Double.parseDouble(values[3]); - return switch (studyCafePassType) { - case HOURLY -> StudyCafePass.hourlyOf(duration, price, discountRate); - case WEEKLY -> StudyCafePass.weeklyOf(duration, price, discountRate); - case FIXED -> - StudyCafePass.fixedOf(duration, price, discountRate, readLockerPasses().stream().findFirst().orElse(null)); - }; - } - private List readLockerPasses() { try { List lines = Files.readAllLines(Paths.get("src/main/resources/cleancode/studycafe/locker.csv")); diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index a7a48eb6a..508434b01 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -6,7 +6,7 @@ public class StudyCafeLockerPass { private final int price; private boolean selected; - protected StudyCafeLockerPass(int duration, int price) { + private StudyCafeLockerPass(int duration, int price) { this.duration = duration; this.price = price; } @@ -15,23 +15,23 @@ public static StudyCafeLockerPass of(int duration, int price) { return new StudyCafeLockerPass(duration, price); } - public int getPrice() { + int getPrice() { return selected ? price : 0; } - public void select() { - selected = true; + public boolean isCompatible(int passDuration) { + return duration == passDuration; } - public boolean isSelected() { - return selected; + void select() { + selected = true; } - public boolean isCompatible(StudyCafePass pass) { - return duration == pass.getDuration(); + boolean isSelected() { + return selected; } - public String toMenuString() { + String toMenuString() { return StudyCafePassType.FIXED.toMenuString(duration, price); } } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index 452fa0d6f..7dfa3cd93 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -30,10 +30,6 @@ public StudyCafePassType getPassType() { return passType; } - public int getDuration() { - return duration; - } - public int getTotalPrice() { int discountPrice = (int) (price * discountRate); if (discountPrice > 0) { @@ -46,8 +42,7 @@ public String getMenuString() { return passType.toMenuString(duration, price); } - - // 3 케이스중 1개만 override하므로 선정의 후 override + // 3 케이스중 1개만 override 하므로 선정의 후 override public boolean isLockerSelected() { return false; } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java index b58bdd957..73af45487 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePassType.java @@ -16,7 +16,7 @@ public enum StudyCafePassType { this.toMenu = calculator; } - public String toMenuString(Integer duration, Integer price) { + String toMenuString(Integer duration, Integer price) { return toMenu.apply(duration, price); } } From 2eecb1383d1b2623126ccdd6fa070317e15aa713 Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 15:50:48 +0900 Subject: [PATCH 12/14] =?UTF-8?q?refactor:=20repository=20DIP=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cleancode/studycafe/tobe/StudyCafeApplication.java | 7 ++++++- .../cleancode/studycafe/tobe/StudyCafePassMachine.java | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafeApplication.java b/src/main/java/cleancode/studycafe/tobe/StudyCafeApplication.java index a60afb3f3..5ad06e52c 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafeApplication.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafeApplication.java @@ -1,9 +1,14 @@ package cleancode.studycafe.tobe; +import cleancode.studycafe.tobe.io.StudyCafeFileHandler; +import cleancode.studycafe.tobe.model.StudyCafePassRepository; + public class StudyCafeApplication { public static void main(String[] args) { - StudyCafePassMachine studyCafePassMachine = new StudyCafePassMachine(); + StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); + StudyCafePassRepository repository = StudyCafePassRepository.from(studyCafeFileHandler); + StudyCafePassMachine studyCafePassMachine = new StudyCafePassMachine(repository); studyCafePassMachine.run(); } diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index d272f0df7..f6fdfc6e4 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -12,8 +12,11 @@ public class StudyCafePassMachine { private final InputHandler inputHandler = new InputHandler(); private final OutputHandler outputHandler = new OutputHandler(); - private final StudyCafeFileHandler studyCafeFileHandler = new StudyCafeFileHandler(); - private final StudyCafePassRepository passRepository = StudyCafePassRepository.from(studyCafeFileHandler); + private final StudyCafePassRepository passRepository; + + public StudyCafePassMachine(StudyCafePassRepository passRepository) { + this.passRepository = passRepository; + } public void run() { try { From 07a8ef93db207f774142ea6610bff60f353f075b Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Wed, 4 Jun 2025 15:52:48 +0900 Subject: [PATCH 13/14] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java index f6fdfc6e4..c399993dd 100644 --- a/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java +++ b/src/main/java/cleancode/studycafe/tobe/StudyCafePassMachine.java @@ -3,7 +3,6 @@ import cleancode.studycafe.tobe.exception.AppException; import cleancode.studycafe.tobe.io.InputHandler; import cleancode.studycafe.tobe.io.OutputHandler; -import cleancode.studycafe.tobe.io.StudyCafeFileHandler; import cleancode.studycafe.tobe.model.*; import java.util.List; From 070f1dbd05ca6c856be2b78f8b1bd9237e9c7cce Mon Sep 17 00:00:00 2001 From: jsween5723 Date: Thu, 5 Jun 2025 17:47:52 +0900 Subject: [PATCH 14/14] =?UTF-8?q?refactor:=20stream=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studycafe/tobe/io/OutputHandler.java | 1 - .../tobe/io/StudyCafeFileHandler.java | 38 ++++--------------- .../tobe/model/StudyCafeLockerPass.java | 8 +++- .../studycafe/tobe/model/StudyCafePass.java | 19 ++++++++-- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java index aecf29d4c..a77c69746 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/OutputHandler.java @@ -1,6 +1,5 @@ package cleancode.studycafe.tobe.io; -import cleancode.studycafe.tobe.model.StudyCafeLockerPass; import cleancode.studycafe.tobe.model.StudyCafePass; import java.util.List; diff --git a/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java b/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java index a89abaf82..b356d2d77 100644 --- a/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java +++ b/src/main/java/cleancode/studycafe/tobe/io/StudyCafeFileHandler.java @@ -2,12 +2,10 @@ import cleancode.studycafe.tobe.model.StudyCafeLockerPass; import cleancode.studycafe.tobe.model.StudyCafePass; -import cleancode.studycafe.tobe.model.StudyCafePassType; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.List; public class StudyCafeFileHandler { @@ -16,23 +14,12 @@ public List readStudyCafePasses() { List lockerPasses = readLockerPasses(); try { List lines = Files.readAllLines(Paths.get("src/main/resources/cleancode/studycafe/pass-list.csv")); - List studyCafePasses = new ArrayList<>(); - for (String line : lines) { - String[] values = line.split(","); - StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); - int duration = Integer.parseInt(values[1]); - int price = Integer.parseInt(values[2]); - double discountRate = Double.parseDouble(values[3]); - var pass = switch (studyCafePassType) { - case HOURLY -> StudyCafePass.hourlyOf(duration, price, discountRate); - case WEEKLY -> StudyCafePass.weeklyOf(duration, price, discountRate); - case FIXED -> - StudyCafePass.fixedOf(duration, price, discountRate, lockerPasses.stream().filter((lockerPass -> lockerPass.isCompatible(duration))).findFirst().orElse(null)); - }; - studyCafePasses.add(pass); - } - - return studyCafePasses; + return lines.stream().map(line -> line.split(",")) + .map(values -> { + int duration = Integer.parseInt(values[1]); + StudyCafeLockerPass locker = lockerPasses.stream().filter((lockerPass -> lockerPass.isCompatible(duration))).findFirst().orElse(null); + return StudyCafePass.of(values, locker); + }).toList(); } catch (IOException e) { throw new RuntimeException("파일을 읽는데 실패했습니다.", e); } @@ -41,17 +28,8 @@ public List readStudyCafePasses() { private List readLockerPasses() { try { List lines = Files.readAllLines(Paths.get("src/main/resources/cleancode/studycafe/locker.csv")); - List lockerPasses = new ArrayList<>(); - for (String line : lines) { - String[] values = line.split(","); - int duration = Integer.parseInt(values[1]); - int price = Integer.parseInt(values[2]); - - StudyCafeLockerPass lockerPass = StudyCafeLockerPass.of(duration, price); - lockerPasses.add(lockerPass); - } - - return lockerPasses; + return lines.stream().map(line -> line.split(",")) + .map(StudyCafeLockerPass::fromValues).toList(); } catch (IOException e) { throw new RuntimeException("파일을 읽는데 실패했습니다.", e); } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java index 508434b01..44eb8a782 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafeLockerPass.java @@ -11,10 +11,16 @@ private StudyCafeLockerPass(int duration, int price) { this.price = price; } - public static StudyCafeLockerPass of(int duration, int price) { + private static StudyCafeLockerPass of(int duration, int price) { return new StudyCafeLockerPass(duration, price); } + public static StudyCafeLockerPass fromValues(String[] values) { + int duration = Integer.parseInt(values[1]); + int price = Integer.parseInt(values[2]); + return StudyCafeLockerPass.of(duration, price); + } + int getPrice() { return selected ? price : 0; } diff --git a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java index 7dfa3cd93..4cd2122c5 100644 --- a/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java +++ b/src/main/java/cleancode/studycafe/tobe/model/StudyCafePass.java @@ -14,18 +14,31 @@ protected StudyCafePass(StudyCafePassType passType, int duration, int price, dou this.discountRate = discountRate; } - public static StudyCafePass weeklyOf(int duration, int price, double discountRate) { + private static StudyCafePass weeklyOf(int duration, int price, double discountRate) { return new WeeklyStudyCafePass(duration, price, discountRate); } - public static StudyCafePass hourlyOf(int duration, int price, double discountRate) { + private static StudyCafePass hourlyOf(int duration, int price, double discountRate) { return new HourlyStudyCafePass(duration, price, discountRate); } - public static StudyCafePass fixedOf(int duration, int price, double discountRate, StudyCafeLockerPass lockerPass) { + private static StudyCafePass fixedOf(int duration, int price, double discountRate, StudyCafeLockerPass lockerPass) { return new FixedStudyCafePass(duration, price, discountRate, lockerPass); } + public static StudyCafePass of(String[] values, StudyCafeLockerPass lockerPass) { + StudyCafePassType studyCafePassType = StudyCafePassType.valueOf(values[0]); + int duration = Integer.parseInt(values[1]); + int price = Integer.parseInt(values[2]); + double discountRate = Double.parseDouble(values[3]); + return switch (studyCafePassType) { + case HOURLY -> hourlyOf(duration, price, discountRate); + case WEEKLY -> weeklyOf(duration, price, discountRate); + case FIXED -> + fixedOf(duration, price, discountRate, lockerPass); + }; + } + public StudyCafePassType getPassType() { return passType; }