From de932c636249020816c8856abbf7c26977c46e54 Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Wed, 14 Dec 2022 21:00:42 +0900 Subject: [PATCH 01/10] =?UTF-8?q?docs:=20=EA=B0=9C=EB=B0=9C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=EC=9D=84=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..58e81dfe4 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,35 @@ +# 페어 매칭 프로그램 + +## 개발 기능 목록 + +- [ ] 출력 기능 + - [ ] 기능 선택 안내 문구 + - [ ] 과정, 미션, 레벨 선택 안내 문구 + - [ ] 페어 매칭 결과 + - [ ] 페어 재매칭 시도 문구 + - [ ] 초기화 안내 문구 + +- [ ] 기능 선택 입력 기능 + - [ ] 한 개의 문자로 입력되는지 검증 + +- [ ] 기능 선택 검증 기능 + - [ ] 1, 2, 3, Q 문자 중 하나인지 검증 + +- [ ] 과정, 미션, 레벨 선택 입력 기능 + - [ ] ", "으로 구분되고, 과정은 3 ~ 5 글자, 레벨은 3 글자, 미션은 2 ~ 6글자로 입력 되는지 검증 + +- [ ] 과정, 미션, 레벨 선택 검증 기능 + - [ ] 정해진 과정, 미션, 레벨인지 검증 + +- [ ] 매칭 이력 확인 기능 + +- [ ] 페어 매칭 기능 + - [ ] 3회 초과 시도 시 에러 + - [ ] 동 레벨에서 중복 페어 금지 + - [ ] 홀수인 경어 마지막 크루는 마지막 페어에 포함 + +- [ ] 페어 조회 기능 + - [ ] 매칭 이력 없을 시 에러 + +- [ ] 페어 매칭 초기화 기능 + From a42aa13427cf03b71f2dc49c65d2b29a7c82640d Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Wed, 14 Dec 2022 22:25:38 +0900 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutputView 객체를 통해 기능 선택에 대한 안내 문구를 우선 출력한다. 기능 선택에 대한 안내 문구는 Message, CommandMessage, Command 등의 객체의 상수를 활용한다. InputView 객체에서 기능 선택에 대한 사용자의 입력을 받는다. InputView 객체에서 사용자의 입력이 한 개 문자로 입력되는지 검증한다. --- .../controller/PairMatchingController.java | 21 +++++++++++++ .../domain/program/command/Command.java | 24 ++++++++++++++ .../java/pairmatching/view/InputView.java | 27 ++++++++++++++++ .../java/pairmatching/view/OutputView.java | 31 +++++++++++++++++++ .../view/message/CommandMessage.java | 22 +++++++++++++ .../pairmatching/view/message/Message.java | 19 ++++++++++++ .../view/validatetool/ValidateTool.java | 22 +++++++++++++ 7 files changed, 166 insertions(+) create mode 100644 src/main/java/pairmatching/controller/PairMatchingController.java create mode 100644 src/main/java/pairmatching/domain/program/command/Command.java create mode 100644 src/main/java/pairmatching/view/InputView.java create mode 100644 src/main/java/pairmatching/view/OutputView.java create mode 100644 src/main/java/pairmatching/view/message/CommandMessage.java create mode 100644 src/main/java/pairmatching/view/message/Message.java create mode 100644 src/main/java/pairmatching/view/validatetool/ValidateTool.java diff --git a/src/main/java/pairmatching/controller/PairMatchingController.java b/src/main/java/pairmatching/controller/PairMatchingController.java new file mode 100644 index 000000000..ff1ef1711 --- /dev/null +++ b/src/main/java/pairmatching/controller/PairMatchingController.java @@ -0,0 +1,21 @@ +package pairmatching.controller; + +import pairmatching.domain.program.command.Command; +import pairmatching.view.InputView; +import pairmatching.view.OutputView; + +public class PairMatchingController { + + private final InputView inputView; + private final OutputView outputView; + + public PairMatchingController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void runPairMatchingProgram() { + outputView.printCommandGuideMessage(Command.values()); + inputView.readCommand(); + } +} diff --git a/src/main/java/pairmatching/domain/program/command/Command.java b/src/main/java/pairmatching/domain/program/command/Command.java new file mode 100644 index 000000000..8e72df48d --- /dev/null +++ b/src/main/java/pairmatching/domain/program/command/Command.java @@ -0,0 +1,24 @@ +package pairmatching.domain.program.command; + +import java.util.Arrays; + +public enum Command { + MATCHING("1"), + CHECKING("2"), + RESETTING("3"), + QUITTING("Q"); + + private final String command; + + Command(String command) { + this.command = command; + } + + public String getCommand() { + return command; + } + + public static void main(String[] args) { + System.out.println(Arrays.toString(Command.values())); + } +} diff --git a/src/main/java/pairmatching/view/InputView.java b/src/main/java/pairmatching/view/InputView.java new file mode 100644 index 000000000..579be1759 --- /dev/null +++ b/src/main/java/pairmatching/view/InputView.java @@ -0,0 +1,27 @@ +package pairmatching.view; + +import camp.nextstep.edu.missionutils.Console; +import pairmatching.view.validatetool.ValidateTool; + +public class InputView { + + public String readCommand() { + return readUsing(ValidateTool.COMMAND); + } + + private String readUsing(ValidateTool validateTool) { + String input = Console.readLine(); + validateBy(input, validateTool); + return input; + } + + private void validateBy(String input, ValidateTool validateTool) { + if (isInvalidFormat(input, validateTool)) { + throw new IllegalArgumentException(validateTool.getErrorMessage()); + } + } + + private boolean isInvalidFormat(String input, ValidateTool validateTool) { + return !input.matches(validateTool.getValidFormat()); + } +} diff --git a/src/main/java/pairmatching/view/OutputView.java b/src/main/java/pairmatching/view/OutputView.java new file mode 100644 index 000000000..7583b8b88 --- /dev/null +++ b/src/main/java/pairmatching/view/OutputView.java @@ -0,0 +1,31 @@ +package pairmatching.view; + +import pairmatching.domain.program.command.Command; +import pairmatching.view.message.CommandMessage; +import pairmatching.view.message.Message; + +import java.util.ArrayList; +import java.util.List; + +public class OutputView { + + public void printCommandGuideMessage(Command[] commands) { + print(Message.COMMAND_GUIDE.getMessage()); + List commandMessages = makeCommandMessages(commands, CommandMessage.values()); + commandMessages.forEach(this::print); + } + + private List makeCommandMessages(Command[] commands, CommandMessage[] commandMessages) { + List messages = new ArrayList<>(); + for (int i = 0; i < commands.length; i++) { + CommandMessage message = commandMessages[i]; + Command command = commands[i]; + messages.add(message.getFormattedMessage(command.getCommand())); + } + return messages; + } + + private void print(String message) { + System.out.print(message); + } +} diff --git a/src/main/java/pairmatching/view/message/CommandMessage.java b/src/main/java/pairmatching/view/message/CommandMessage.java new file mode 100644 index 000000000..bef201980 --- /dev/null +++ b/src/main/java/pairmatching/view/message/CommandMessage.java @@ -0,0 +1,22 @@ +package pairmatching.view.message; + +public enum CommandMessage { + MATCHING("%s. 페어 매칭\n"), + CHECKING("%s. 페어 조회\n"), + RESETTING("%s. 페어 초기화\n"), + QUITTING("%s. 종료\n"); + + private final String message; + + CommandMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getFormattedMessage(Object factor) { + return String.format(message, factor); + } +} diff --git a/src/main/java/pairmatching/view/message/Message.java b/src/main/java/pairmatching/view/message/Message.java new file mode 100644 index 000000000..52cca1cb6 --- /dev/null +++ b/src/main/java/pairmatching/view/message/Message.java @@ -0,0 +1,19 @@ +package pairmatching.view.message; + +public enum Message { + COMMAND_GUIDE("기능을 선택하세요.\n"); + + private final String message; + + Message(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getFormattedMessage(Object factor) { + return String.format(message, factor); + } +} diff --git a/src/main/java/pairmatching/view/validatetool/ValidateTool.java b/src/main/java/pairmatching/view/validatetool/ValidateTool.java new file mode 100644 index 000000000..623456065 --- /dev/null +++ b/src/main/java/pairmatching/view/validatetool/ValidateTool.java @@ -0,0 +1,22 @@ +package pairmatching.view.validatetool; + +public enum ValidateTool { + + COMMAND("\\w", "[ERROR] 기능 명령어는 한 글자여야 합니다."); + + private final String validFormat; + private final String errorMessage; + + ValidateTool(String validFormat, String errorMessage) { + this.validFormat = validFormat; + this.errorMessage = errorMessage; + } + + public String getValidFormat() { + return validFormat; + } + + public String getErrorMessage() { + return errorMessage; + } +} From 7906c3d8ea01ffc32576efa2722f7870a90f9f08 Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 11:44:46 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PairMatchingController 객체는 기능 명령어를 입력받아 검증하는 기능을 수행한다. 명령어 1, 2, 3, Q 문자 중 하나인지 확인하고, 이에 해당하지 않을 경우 IllegalArgumentException 을 발생시킨다. --- .../controller/PairMatchingController.java | 8 +++++++- .../domain/program/PairMatchingProgram.java | 16 ++++++++++++++++ .../domain/program/command/Command.java | 5 +++-- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/main/java/pairmatching/domain/program/PairMatchingProgram.java diff --git a/src/main/java/pairmatching/controller/PairMatchingController.java b/src/main/java/pairmatching/controller/PairMatchingController.java index ff1ef1711..45ff71bc5 100644 --- a/src/main/java/pairmatching/controller/PairMatchingController.java +++ b/src/main/java/pairmatching/controller/PairMatchingController.java @@ -1,5 +1,6 @@ package pairmatching.controller; +import pairmatching.domain.program.PairMatchingProgram; import pairmatching.domain.program.command.Command; import pairmatching.view.InputView; import pairmatching.view.OutputView; @@ -15,7 +16,12 @@ public PairMatchingController(InputView inputView, OutputView outputView) { } public void runPairMatchingProgram() { + readAndExecuteCommand(); + } + + private void readAndExecuteCommand() { + PairMatchingProgram program = new PairMatchingProgram(); outputView.printCommandGuideMessage(Command.values()); - inputView.readCommand(); + program.executeCommand(inputView.readCommand()); } } diff --git a/src/main/java/pairmatching/domain/program/PairMatchingProgram.java b/src/main/java/pairmatching/domain/program/PairMatchingProgram.java new file mode 100644 index 000000000..6deed66a3 --- /dev/null +++ b/src/main/java/pairmatching/domain/program/PairMatchingProgram.java @@ -0,0 +1,16 @@ +package pairmatching.domain.program; + +import pairmatching.domain.program.command.Command; + +public class PairMatchingProgram { + + public void executeCommand(String command) { + validate(command); + } + + private void validate(String command) { + if (!Command.contains(command)) { + throw new IllegalArgumentException("[ERROR] 지원하는 기능 명령어가 아닙니다."); + } + } +} diff --git a/src/main/java/pairmatching/domain/program/command/Command.java b/src/main/java/pairmatching/domain/program/command/Command.java index 8e72df48d..080a76237 100644 --- a/src/main/java/pairmatching/domain/program/command/Command.java +++ b/src/main/java/pairmatching/domain/program/command/Command.java @@ -18,7 +18,8 @@ public String getCommand() { return command; } - public static void main(String[] args) { - System.out.println(Arrays.toString(Command.values())); + public static boolean contains(String command) { + return Arrays.stream(values()) + .anyMatch(value -> command.equals(value.getCommand())); } } From 8eafcf1771085275124adeafc53710d47d52b396 Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 12:55:52 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=EA=B3=BC=EC=A0=95,=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98,=20=EB=A0=88=EB=B2=A8=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutputView는 안내 메시지를 출력한다. 안내 메시지를 만들 때 Controller 에서 Course, Level, Mission 객체에 대한 데이터를 전달받는다. InputView는 사용자의 입력을 읽는다. 사용자의 입력이 입력 형식에 알맞는지 확인하고, 알맞지 않을 시 오류를 발생시킨다. --- .../controller/PairMatchingController.java | 9 +++-- .../pairmatching/domain/choice/Course.java | 26 ++++++++++++++ .../pairmatching/domain/choice/Level.java | 29 +++++++++++++++ .../pairmatching/domain/choice/Mission.java | 32 +++++++++++++++++ .../java/pairmatching/view/InputView.java | 4 +++ .../java/pairmatching/view/OutputView.java | 36 +++++++++++++++++++ .../pairmatching/view/message/Message.java | 14 ++++++-- .../view/validatetool/ValidateTool.java | 3 +- 8 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 src/main/java/pairmatching/domain/choice/Course.java create mode 100644 src/main/java/pairmatching/domain/choice/Level.java create mode 100644 src/main/java/pairmatching/domain/choice/Mission.java diff --git a/src/main/java/pairmatching/controller/PairMatchingController.java b/src/main/java/pairmatching/controller/PairMatchingController.java index 45ff71bc5..1034653a6 100644 --- a/src/main/java/pairmatching/controller/PairMatchingController.java +++ b/src/main/java/pairmatching/controller/PairMatchingController.java @@ -1,5 +1,8 @@ package pairmatching.controller; +import pairmatching.domain.choice.Course; +import pairmatching.domain.choice.Level; +import pairmatching.domain.choice.Mission; import pairmatching.domain.program.PairMatchingProgram; import pairmatching.domain.program.command.Command; import pairmatching.view.InputView; @@ -16,10 +19,12 @@ public PairMatchingController(InputView inputView, OutputView outputView) { } public void runPairMatchingProgram() { - readAndExecuteCommand(); + executeUserCommand(); + outputView.printChoiceGuideMessage(Course.namesOfValues(), Level.namesOfValues(), Mission.values()); + inputView.readChoice(); } - private void readAndExecuteCommand() { + private void executeUserCommand() { PairMatchingProgram program = new PairMatchingProgram(); outputView.printCommandGuideMessage(Command.values()); program.executeCommand(inputView.readCommand()); diff --git a/src/main/java/pairmatching/domain/choice/Course.java b/src/main/java/pairmatching/domain/choice/Course.java new file mode 100644 index 000000000..655e1c5af --- /dev/null +++ b/src/main/java/pairmatching/domain/choice/Course.java @@ -0,0 +1,26 @@ +package pairmatching.domain.choice; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public enum Course { + BACKEND("백엔드"), + FRONTEND("프론트엔드"); + + private final String name; + + Course(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static List namesOfValues() { + return Arrays.stream(values()) + .map(Course::getName) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/pairmatching/domain/choice/Level.java b/src/main/java/pairmatching/domain/choice/Level.java new file mode 100644 index 000000000..a05aa2cf5 --- /dev/null +++ b/src/main/java/pairmatching/domain/choice/Level.java @@ -0,0 +1,29 @@ +package pairmatching.domain.choice; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public enum Level { + LEVEL1("레벨1"), + LEVEL2("레벨2"), + LEVEL3("레벨3"), + LEVEL4("레벨4"), + LEVEL5("레벨5"); + + private final String name; + + Level(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static List namesOfValues() { + return Arrays.stream(values()) + .map(Level::getName) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/pairmatching/domain/choice/Mission.java b/src/main/java/pairmatching/domain/choice/Mission.java new file mode 100644 index 000000000..174c0af48 --- /dev/null +++ b/src/main/java/pairmatching/domain/choice/Mission.java @@ -0,0 +1,32 @@ +package pairmatching.domain.choice; + +public enum Mission { + CAR_RACING("자동차 경주", Level.LEVEL1), + LOTTO("로또", Level.LEVEL1), + NUMBER_BASEBALL("숫자야구게임", Level.LEVEL1), + SHOPPING_BASKET("장바구니", Level.LEVEL2), + PAYMENT("결제", Level.LEVEL2), + SUBWAY_MAP("지하철노선도", Level.LEVEL2), + IMPROVEMENT_OF_PERFORMANCE("성능개선", Level.LEVEL4), + PUBLISHING("배포", Level.LEVEL4); + + private final String name; + private final Level level; + + Mission(String name, Level level) { + this.name = name; + this.level = level; + } + + public String getName() { + return name; + } + + public Level getLevel() { + return level; + } + + public String getLevelMessage() { + return level.getName(); + } +} diff --git a/src/main/java/pairmatching/view/InputView.java b/src/main/java/pairmatching/view/InputView.java index 579be1759..6e171f225 100644 --- a/src/main/java/pairmatching/view/InputView.java +++ b/src/main/java/pairmatching/view/InputView.java @@ -9,6 +9,10 @@ public String readCommand() { return readUsing(ValidateTool.COMMAND); } + public String readChoice() { + return readUsing(ValidateTool.CHOICE); + } + private String readUsing(ValidateTool validateTool) { String input = Console.readLine(); validateBy(input, validateTool); diff --git a/src/main/java/pairmatching/view/OutputView.java b/src/main/java/pairmatching/view/OutputView.java index 7583b8b88..39d2eccf0 100644 --- a/src/main/java/pairmatching/view/OutputView.java +++ b/src/main/java/pairmatching/view/OutputView.java @@ -1,11 +1,14 @@ package pairmatching.view; +import pairmatching.domain.choice.Mission; import pairmatching.domain.program.command.Command; import pairmatching.view.message.CommandMessage; import pairmatching.view.message.Message; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class OutputView { @@ -25,6 +28,39 @@ private List makeCommandMessages(Command[] commands, CommandMessage[] co return messages; } + public void printChoiceGuideMessage(List courses, List levels, Mission[] missions) { + String message = makeChoiceMessage(courses, levels, missions); + print(message); + } + + private String makeChoiceMessage(List courses, List levels, Mission[] missions) { + List messages = new ArrayList<>(); + messages.add(Message.DIVIDING_LINE.getMessage()); + messages.add(makeChoiceContentMessage(courses, levels, missions)); + messages.add(Message.DIVIDING_LINE.getMessage()); + messages.add(Message.CHOICE_GUIDE.getMessage()); + messages.add(Message.CHOICE_EXAMPLE.getMessage()); + return String.join(Message.NEW_LINE.getMessage(), messages); + } + + private String makeChoiceContentMessage(List courses, List levels, Mission[] missions) { + List messages = new ArrayList<>(); + messages.add(Message.COURSE.getFormattedMessage(String.join(Message.DELIMITER.getMessage(), courses))); + messages.add(Message.MISSION.getMessage()); + for (String level : levels) { + String missionsOfLevel = makeMissionMessageByLevel(missions, level); + messages.add(Message.LEVEL.getFormattedMessage(level, missionsOfLevel)); + } + return String.join(Message.NEW_LINE.getMessage(), messages); + } + + private String makeMissionMessageByLevel(Mission[] missions, String level) { + return Arrays.stream(missions) + .filter(mission -> level.equals(mission.getLevelMessage())) + .map(Mission::getName) + .collect(Collectors.joining(Message.DELIMITER.getMessage())); + } + private void print(String message) { System.out.print(message); } diff --git a/src/main/java/pairmatching/view/message/Message.java b/src/main/java/pairmatching/view/message/Message.java index 52cca1cb6..47b821db2 100644 --- a/src/main/java/pairmatching/view/message/Message.java +++ b/src/main/java/pairmatching/view/message/Message.java @@ -1,7 +1,15 @@ package pairmatching.view.message; public enum Message { - COMMAND_GUIDE("기능을 선택하세요.\n"); + COMMAND_GUIDE("기능을 선택하세요.\n"), + DIVIDING_LINE("#############################################"), + COURSE("과정: %s"), + MISSION("미션:"), + LEVEL("- %s: %s"), + DELIMITER(" | "), + CHOICE_GUIDE("과정, 레벨, 미션을 선택하세요."), + CHOICE_EXAMPLE("ex) 백엔드, 레벨1, 자동차경주"), + NEW_LINE("\n"); private final String message; @@ -13,7 +21,7 @@ public String getMessage() { return message; } - public String getFormattedMessage(Object factor) { - return String.format(message, factor); + public String getFormattedMessage(Object... factors) { + return String.format(message, factors); } } diff --git a/src/main/java/pairmatching/view/validatetool/ValidateTool.java b/src/main/java/pairmatching/view/validatetool/ValidateTool.java index 623456065..de7ac64e8 100644 --- a/src/main/java/pairmatching/view/validatetool/ValidateTool.java +++ b/src/main/java/pairmatching/view/validatetool/ValidateTool.java @@ -2,7 +2,8 @@ public enum ValidateTool { - COMMAND("\\w", "[ERROR] 기능 명령어는 한 글자여야 합니다."); + COMMAND("\\w", "[ERROR] 기능 명령어는 한 글자여야 합니다."), + CHOICE(".{1,10},.{3,5},.{1,10}", "[ERROR] 선택 입력 형식이 잘못되었습니다."); private final String validFormat; private final String errorMessage; From b04133a7ec5f663d2876a9230e601336f9e92034 Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 16:37:20 +0900 Subject: [PATCH 05/10] =?UTF-8?q?chore:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=9D=98=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EB=A5=BC=20=EB=B3=80=EA=B2=BD=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pairmatching/domain/{program => }/command/Command.java | 2 +- src/main/java/pairmatching/view/OutputView.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/pairmatching/domain/{program => }/command/Command.java (91%) diff --git a/src/main/java/pairmatching/domain/program/command/Command.java b/src/main/java/pairmatching/domain/command/Command.java similarity index 91% rename from src/main/java/pairmatching/domain/program/command/Command.java rename to src/main/java/pairmatching/domain/command/Command.java index 080a76237..eeef9059a 100644 --- a/src/main/java/pairmatching/domain/program/command/Command.java +++ b/src/main/java/pairmatching/domain/command/Command.java @@ -1,4 +1,4 @@ -package pairmatching.domain.program.command; +package pairmatching.domain.command; import java.util.Arrays; diff --git a/src/main/java/pairmatching/view/OutputView.java b/src/main/java/pairmatching/view/OutputView.java index 39d2eccf0..f94d2af09 100644 --- a/src/main/java/pairmatching/view/OutputView.java +++ b/src/main/java/pairmatching/view/OutputView.java @@ -1,7 +1,7 @@ package pairmatching.view; -import pairmatching.domain.choice.Mission; -import pairmatching.domain.program.command.Command; +import pairmatching.domain.choice.item.Mission; +import pairmatching.domain.command.Command; import pairmatching.view.message.CommandMessage; import pairmatching.view.message.Message; @@ -61,7 +61,7 @@ private String makeMissionMessageByLevel(Mission[] missions, String level) { .collect(Collectors.joining(Message.DELIMITER.getMessage())); } - private void print(String message) { + public void print(String message) { System.out.print(message); } } From 1fd69af555febe2b9c94242bed50edf0088f1b6d Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 16:39:18 +0900 Subject: [PATCH 06/10] =?UTF-8?q?refactor:=20=EB=AA=85=EB=A0=B9=EC=96=B4?= =?UTF-8?q?=EB=A5=BC=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=84=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변경 전 : PairMatchingProgram 객체에서 명령어 검증을 담당한다. 변경 후 : UserCommand 객체에서 명령어 검증을 담당한다. 변경 이유 : 객체 간 책임을 분리하기 위해서이다. --- .../domain/command/UserCommand.java | 21 +++++++++++++++++++ .../domain/program/PairMatchingProgram.java | 11 +--------- 2 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 src/main/java/pairmatching/domain/command/UserCommand.java diff --git a/src/main/java/pairmatching/domain/command/UserCommand.java b/src/main/java/pairmatching/domain/command/UserCommand.java new file mode 100644 index 000000000..492fa08ab --- /dev/null +++ b/src/main/java/pairmatching/domain/command/UserCommand.java @@ -0,0 +1,21 @@ +package pairmatching.domain.command; + +public class UserCommand { + + private final Command command; + + public UserCommand(String command) { + validate(command); + this.command = Command.valueOf(command); + } + + private void validate(String command) { + if (!Command.contains(command)) { + throw new IllegalArgumentException("[ERROR] 지원하는 기능 명령어가 아닙니다."); + } + } + + public boolean isCommandOf(Command command) { + return this.command.equals(command); + } +} diff --git a/src/main/java/pairmatching/domain/program/PairMatchingProgram.java b/src/main/java/pairmatching/domain/program/PairMatchingProgram.java index 6deed66a3..c44cb6c94 100644 --- a/src/main/java/pairmatching/domain/program/PairMatchingProgram.java +++ b/src/main/java/pairmatching/domain/program/PairMatchingProgram.java @@ -1,16 +1,7 @@ package pairmatching.domain.program; -import pairmatching.domain.program.command.Command; +import pairmatching.domain.command.Command; public class PairMatchingProgram { - public void executeCommand(String command) { - validate(command); - } - - private void validate(String command) { - if (!Command.contains(command)) { - throw new IllegalArgumentException("[ERROR] 지원하는 기능 명령어가 아닙니다."); - } - } } From 3f45b80b815dfbbfe9b8e58dee2986f910ab6201 Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 16:42:55 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20=EA=B3=BC=EC=A0=95,=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98,=20=EB=A0=88=EB=B2=A8=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ChoiceMaker 객체가 과정, 미션, 레벨에 대한 검증을 담당한다. 사용자가 입력한 과정, 미션, 레벨 각각이 존재하는지 여부와 입력한 미션과 레벨이 서로 일치하는지 여부를 검증한다. --- .../controller/PairMatchingController.java | 59 ++++++++++++++++--- .../pairmatching/domain/choice/Choice.java | 15 +++++ .../domain/choice/ChoiceMaker.java | 40 +++++++++++++ .../domain/choice/{ => item}/Course.java | 7 ++- .../domain/choice/{ => item}/Level.java | 7 ++- .../domain/choice/{ => item}/Mission.java | 9 ++- .../java/pairmatching/view/InputView.java | 10 +++- 7 files changed, 133 insertions(+), 14 deletions(-) create mode 100644 src/main/java/pairmatching/domain/choice/Choice.java create mode 100644 src/main/java/pairmatching/domain/choice/ChoiceMaker.java rename src/main/java/pairmatching/domain/choice/{ => item}/Course.java (71%) rename src/main/java/pairmatching/domain/choice/{ => item}/Level.java (72%) rename src/main/java/pairmatching/domain/choice/{ => item}/Mission.java (77%) diff --git a/src/main/java/pairmatching/controller/PairMatchingController.java b/src/main/java/pairmatching/controller/PairMatchingController.java index 1034653a6..747969344 100644 --- a/src/main/java/pairmatching/controller/PairMatchingController.java +++ b/src/main/java/pairmatching/controller/PairMatchingController.java @@ -1,13 +1,18 @@ package pairmatching.controller; -import pairmatching.domain.choice.Course; -import pairmatching.domain.choice.Level; -import pairmatching.domain.choice.Mission; +import pairmatching.domain.choice.Choice; +import pairmatching.domain.choice.ChoiceMaker; +import pairmatching.domain.choice.item.Course; +import pairmatching.domain.choice.item.Level; +import pairmatching.domain.choice.item.Mission; +import pairmatching.domain.command.UserCommand; import pairmatching.domain.program.PairMatchingProgram; -import pairmatching.domain.program.command.Command; +import pairmatching.domain.command.Command; import pairmatching.view.InputView; import pairmatching.view.OutputView; +import java.util.List; + public class PairMatchingController { private final InputView inputView; @@ -20,13 +25,49 @@ public PairMatchingController(InputView inputView, OutputView outputView) { public void runPairMatchingProgram() { executeUserCommand(); - outputView.printChoiceGuideMessage(Course.namesOfValues(), Level.namesOfValues(), Mission.values()); - inputView.readChoice(); + + } private void executeUserCommand() { - PairMatchingProgram program = new PairMatchingProgram(); - outputView.printCommandGuideMessage(Command.values()); - program.executeCommand(inputView.readCommand()); + UserCommand command = readUserCommand(); + if (command.isCommandOf(Command.MATCHING)) { + Choice choice = readChoice(); + + } + if (command.isCommandOf(Command.CHECKING)) { + + } + if (command.isCommandOf(Command.RESETTING)) { + + } + if (command.isCommandOf(Command.QUITTING)) { + + } + } + + private Choice readChoice() { + ChoiceMaker choiceMaker = new ChoiceMaker(); + while(true) { + try { + outputView.printChoiceGuideMessage(Course.namesOfValues(), Level.namesOfValues(), Mission.values()); + List items = inputView.readChoice(); + return choiceMaker.createChoice(items); + } catch (IllegalArgumentException e) { + outputView.print(e.getMessage()); + } + } + } + + private UserCommand readUserCommand() { + while (true) { + try { + outputView.printCommandGuideMessage(Command.values()); + String command = inputView.readCommand(); + return new UserCommand(command); + } catch (IllegalArgumentException e) { + outputView.print(e.getMessage()); + } + } } } diff --git a/src/main/java/pairmatching/domain/choice/Choice.java b/src/main/java/pairmatching/domain/choice/Choice.java new file mode 100644 index 000000000..df4e3cf29 --- /dev/null +++ b/src/main/java/pairmatching/domain/choice/Choice.java @@ -0,0 +1,15 @@ +package pairmatching.domain.choice; + +import pairmatching.domain.choice.item.Course; +import pairmatching.domain.choice.item.Mission; + +public class Choice { + + private final Course course; + private final Mission mission; + + public Choice(String courseName, String missionName) { + this.course = Course.valueOf(courseName); + this.mission = Mission.valueOf(missionName); + } +} diff --git a/src/main/java/pairmatching/domain/choice/ChoiceMaker.java b/src/main/java/pairmatching/domain/choice/ChoiceMaker.java new file mode 100644 index 000000000..869abef7f --- /dev/null +++ b/src/main/java/pairmatching/domain/choice/ChoiceMaker.java @@ -0,0 +1,40 @@ +package pairmatching.domain.choice; + +import pairmatching.domain.choice.item.Course; +import pairmatching.domain.choice.item.Level; +import pairmatching.domain.choice.item.Mission; + +import java.util.List; + +public class ChoiceMaker { + + public Choice createChoice(List items) { + String courseName = items.get(0); + String levelName = items.get(1); + String missionName = items.get(2); + validate(courseName, levelName, missionName); + + return new Choice(courseName, missionName); + } + + private void validate(String courseName, String levelName, String missionName) { + if (!Course.contains(courseName)) { + throw new IllegalArgumentException("[ERROR] 해당하는 과정이 존재하지 않습니다."); + } + if (!Level.contains(levelName)) { + throw new IllegalArgumentException("[ERROR] 해당하는 레벨이 존재하지 않습니다."); + } + if (!Mission.contains(missionName)) { + throw new IllegalArgumentException("[ERROR] 해당하는 미션이 존재하지 않습니다."); + } + if (isValidLevel(levelName, missionName)) { + throw new IllegalArgumentException("[ERROR] 레벨과 미션이 일치하지 않습니다."); + } + } + + private boolean isValidLevel(String level, String missionName) { + Mission mission = Mission.valueOf(missionName); + String levelOfMission = mission.getLevelMessage(); + return level.equals(levelOfMission); + } +} diff --git a/src/main/java/pairmatching/domain/choice/Course.java b/src/main/java/pairmatching/domain/choice/item/Course.java similarity index 71% rename from src/main/java/pairmatching/domain/choice/Course.java rename to src/main/java/pairmatching/domain/choice/item/Course.java index 655e1c5af..5dfe235b9 100644 --- a/src/main/java/pairmatching/domain/choice/Course.java +++ b/src/main/java/pairmatching/domain/choice/item/Course.java @@ -1,4 +1,4 @@ -package pairmatching.domain.choice; +package pairmatching.domain.choice.item; import java.util.Arrays; import java.util.List; @@ -18,6 +18,11 @@ public String getName() { return name; } + public static boolean contains(String name) { + return Arrays.stream(values()) + .anyMatch(value -> name.equals(value.getName())); + } + public static List namesOfValues() { return Arrays.stream(values()) .map(Course::getName) diff --git a/src/main/java/pairmatching/domain/choice/Level.java b/src/main/java/pairmatching/domain/choice/item/Level.java similarity index 72% rename from src/main/java/pairmatching/domain/choice/Level.java rename to src/main/java/pairmatching/domain/choice/item/Level.java index a05aa2cf5..f2ea52687 100644 --- a/src/main/java/pairmatching/domain/choice/Level.java +++ b/src/main/java/pairmatching/domain/choice/item/Level.java @@ -1,4 +1,4 @@ -package pairmatching.domain.choice; +package pairmatching.domain.choice.item; import java.util.Arrays; import java.util.List; @@ -17,6 +17,11 @@ public enum Level { this.name = name; } + public static boolean contains(String level) { + return Arrays.stream(values()) + .anyMatch(value -> level.equals(value.getName())); + } + public String getName() { return name; } diff --git a/src/main/java/pairmatching/domain/choice/Mission.java b/src/main/java/pairmatching/domain/choice/item/Mission.java similarity index 77% rename from src/main/java/pairmatching/domain/choice/Mission.java rename to src/main/java/pairmatching/domain/choice/item/Mission.java index 174c0af48..4a73827ab 100644 --- a/src/main/java/pairmatching/domain/choice/Mission.java +++ b/src/main/java/pairmatching/domain/choice/item/Mission.java @@ -1,4 +1,6 @@ -package pairmatching.domain.choice; +package pairmatching.domain.choice.item; + +import java.util.Arrays; public enum Mission { CAR_RACING("자동차 경주", Level.LEVEL1), @@ -29,4 +31,9 @@ public Level getLevel() { public String getLevelMessage() { return level.getName(); } + + public static boolean contains(String name) { + return Arrays.stream(values()) + .anyMatch(value -> name.equals(value.getName())); + } } diff --git a/src/main/java/pairmatching/view/InputView.java b/src/main/java/pairmatching/view/InputView.java index 6e171f225..c3223f106 100644 --- a/src/main/java/pairmatching/view/InputView.java +++ b/src/main/java/pairmatching/view/InputView.java @@ -3,14 +3,20 @@ import camp.nextstep.edu.missionutils.Console; import pairmatching.view.validatetool.ValidateTool; +import java.util.Arrays; +import java.util.List; + public class InputView { + private static final String DELIMITER = ", "; + public String readCommand() { return readUsing(ValidateTool.COMMAND); } - public String readChoice() { - return readUsing(ValidateTool.CHOICE); + public List readChoice() { + String input = readUsing(ValidateTool.CHOICE); + return Arrays.asList(input.split(DELIMITER)); } private String readUsing(ValidateTool validateTool) { From 9b234eee987efb713a36ee783559162dfddc6192 Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 21:02:33 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20=EA=B3=BC=EC=A0=95,=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98,=20=EB=A0=88=EB=B2=A8=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 각 객체마다 valueOf(Class) 메소드를 구현한다. 기존에 valueOf 메소드를 사용한 것을 valueOf(Class) 등으로 수정한다. --- .../pairmatching/domain/choice/Choice.java | 4 ++-- .../domain/choice/item/Course.java | 21 ++++++++++++------- .../domain/choice/item/Mission.java | 7 +++++++ .../pairmatching/domain/command/Command.java | 19 +++++++++++------ .../domain/command/UserCommand.java | 2 +- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/main/java/pairmatching/domain/choice/Choice.java b/src/main/java/pairmatching/domain/choice/Choice.java index df4e3cf29..467007db8 100644 --- a/src/main/java/pairmatching/domain/choice/Choice.java +++ b/src/main/java/pairmatching/domain/choice/Choice.java @@ -9,7 +9,7 @@ public class Choice { private final Mission mission; public Choice(String courseName, String missionName) { - this.course = Course.valueOf(courseName); - this.mission = Mission.valueOf(missionName); + this.course = Course.valueOfCourse(courseName); + this.mission = Mission.valueOfMission(missionName); } } diff --git a/src/main/java/pairmatching/domain/choice/item/Course.java b/src/main/java/pairmatching/domain/choice/item/Course.java index 5dfe235b9..93a33bd9a 100644 --- a/src/main/java/pairmatching/domain/choice/item/Course.java +++ b/src/main/java/pairmatching/domain/choice/item/Course.java @@ -8,24 +8,31 @@ public enum Course { BACKEND("백엔드"), FRONTEND("프론트엔드"); - private final String name; + private final String courseName; - Course(String name) { - this.name = name; + Course(String courseName) { + this.courseName = courseName; } - public String getName() { - return name; + public String getCourseName() { + return courseName; } public static boolean contains(String name) { return Arrays.stream(values()) - .anyMatch(value -> name.equals(value.getName())); + .anyMatch(value -> name.equals(value.getCourseName())); } public static List namesOfValues() { return Arrays.stream(values()) - .map(Course::getName) + .map(Course::getCourseName) .collect(Collectors.toList()); } + + public static Course valueOfCourse(String courseName) { + return Arrays.stream(values()) + .filter(value -> courseName.equals(value.getCourseName())) + .findAny() + .orElseThrow(() -> new IllegalStateException("[ERROR] 존재하지 않는 Course 입니다.")); + } } diff --git a/src/main/java/pairmatching/domain/choice/item/Mission.java b/src/main/java/pairmatching/domain/choice/item/Mission.java index 4a73827ab..ccb4d97f5 100644 --- a/src/main/java/pairmatching/domain/choice/item/Mission.java +++ b/src/main/java/pairmatching/domain/choice/item/Mission.java @@ -20,6 +20,13 @@ public enum Mission { this.level = level; } + public static Mission valueOfMission(String missionName) { + return Arrays.stream(values()) + .filter(value -> missionName.equals(value.getName())) + .findAny() + .orElseThrow(() -> new IllegalStateException("[ERROR] 존재하지 않는 Mission 입니다.")); + } + public String getName() { return name; } diff --git a/src/main/java/pairmatching/domain/command/Command.java b/src/main/java/pairmatching/domain/command/Command.java index eeef9059a..8084a303b 100644 --- a/src/main/java/pairmatching/domain/command/Command.java +++ b/src/main/java/pairmatching/domain/command/Command.java @@ -8,18 +8,25 @@ public enum Command { RESETTING("3"), QUITTING("Q"); - private final String command; + private final String key; - Command(String command) { - this.command = command; + Command(String key) { + this.key = key; } - public String getCommand() { - return command; + public String getKey() { + return key; + } + + public static Command valueOfCommand(String key) { + return Arrays.stream(values()) + .filter(value -> key.equals(value.getKey())) + .findAny() + .orElseThrow(() -> new IllegalStateException("[ERROR] 지원하는 명령어가 아닙니다.")); } public static boolean contains(String command) { return Arrays.stream(values()) - .anyMatch(value -> command.equals(value.getCommand())); + .anyMatch(value -> command.equals(value.getKey())); } } diff --git a/src/main/java/pairmatching/domain/command/UserCommand.java b/src/main/java/pairmatching/domain/command/UserCommand.java index 492fa08ab..e29a3b9dd 100644 --- a/src/main/java/pairmatching/domain/command/UserCommand.java +++ b/src/main/java/pairmatching/domain/command/UserCommand.java @@ -6,7 +6,7 @@ public class UserCommand { public UserCommand(String command) { validate(command); - this.command = Command.valueOf(command); + this.command = Command.valueOfCommand(command); } private void validate(String command) { From 0aab9c008c673d60bc492985774306c4346b8b8a Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 21:04:10 +0900 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20=EB=A7=A4=EC=B9=AD=20=EC=9D=B4?= =?UTF-8?q?=EB=A0=A5=20=ED=99=95=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PairMatchingProgram 객체의 hasMatched 메소드는 Choice 객체를 전달받아 해당하는 선택의 매칭이 이뤄졌는지 확인한 결과를 반환한다. --- .../controller/PairMatchingController.java | 37 +++++++++++-------- .../pairmatching/domain/MatchingHistory.java | 20 ++++++++++ .../pairmatching/domain/MatchingMachine.java | 5 +++ .../domain/program/PairMatchingProgram.java | 15 +++++++- 4 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 src/main/java/pairmatching/domain/MatchingHistory.java create mode 100644 src/main/java/pairmatching/domain/MatchingMachine.java diff --git a/src/main/java/pairmatching/controller/PairMatchingController.java b/src/main/java/pairmatching/controller/PairMatchingController.java index 747969344..df39b622d 100644 --- a/src/main/java/pairmatching/controller/PairMatchingController.java +++ b/src/main/java/pairmatching/controller/PairMatchingController.java @@ -1,5 +1,7 @@ package pairmatching.controller; +import pairmatching.domain.MatchingHistory; +import pairmatching.domain.MatchingMachine; import pairmatching.domain.choice.Choice; import pairmatching.domain.choice.ChoiceMaker; import pairmatching.domain.choice.item.Course; @@ -12,6 +14,7 @@ import pairmatching.view.OutputView; import java.util.List; +import java.util.function.Supplier; public class PairMatchingController { @@ -30,10 +33,14 @@ public void runPairMatchingProgram() { } private void executeUserCommand() { - UserCommand command = readUserCommand(); + PairMatchingProgram program = new PairMatchingProgram(new MatchingHistory(), new MatchingMachine()); + UserCommand command = repeat(this::readUserCommand); if (command.isCommandOf(Command.MATCHING)) { - Choice choice = readChoice(); - + Choice choice = repeat(this::readChoice); + if (program.hasMatched(choice)) { + outputView.printReMatchingGuide(); + inputView.readReMatchingCommand(); + } } if (command.isCommandOf(Command.CHECKING)) { @@ -48,23 +55,21 @@ private void executeUserCommand() { private Choice readChoice() { ChoiceMaker choiceMaker = new ChoiceMaker(); - while(true) { - try { - outputView.printChoiceGuideMessage(Course.namesOfValues(), Level.namesOfValues(), Mission.values()); - List items = inputView.readChoice(); - return choiceMaker.createChoice(items); - } catch (IllegalArgumentException e) { - outputView.print(e.getMessage()); - } - } + outputView.printChoiceGuideMessage(Course.namesOfValues(), Level.namesOfValues(), Mission.values()); + List items = inputView.readChoice(); + return choiceMaker.createChoice(items); } private UserCommand readUserCommand() { - while (true) { + outputView.printCommandGuideMessage(Command.values()); + String command = inputView.readCommand(); + return new UserCommand(command); + } + + private T repeat(Supplier inputReader) { + while(true) { try { - outputView.printCommandGuideMessage(Command.values()); - String command = inputView.readCommand(); - return new UserCommand(command); + return inputReader.get(); } catch (IllegalArgumentException e) { outputView.print(e.getMessage()); } diff --git a/src/main/java/pairmatching/domain/MatchingHistory.java b/src/main/java/pairmatching/domain/MatchingHistory.java new file mode 100644 index 000000000..582ee9479 --- /dev/null +++ b/src/main/java/pairmatching/domain/MatchingHistory.java @@ -0,0 +1,20 @@ +package pairmatching.domain; + +import pairmatching.domain.choice.Choice; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class MatchingHistory { + + private final Map> history; + + public MatchingHistory() { + this.history = new HashMap>(); + } + + public boolean hasMatchingOf(Choice choice) { + return history.containsKey(choice); + } +} diff --git a/src/main/java/pairmatching/domain/MatchingMachine.java b/src/main/java/pairmatching/domain/MatchingMachine.java new file mode 100644 index 000000000..300f13bf8 --- /dev/null +++ b/src/main/java/pairmatching/domain/MatchingMachine.java @@ -0,0 +1,5 @@ +package pairmatching.domain; + +public class MatchingMachine { + +} diff --git a/src/main/java/pairmatching/domain/program/PairMatchingProgram.java b/src/main/java/pairmatching/domain/program/PairMatchingProgram.java index c44cb6c94..c6ee549e1 100644 --- a/src/main/java/pairmatching/domain/program/PairMatchingProgram.java +++ b/src/main/java/pairmatching/domain/program/PairMatchingProgram.java @@ -1,7 +1,20 @@ package pairmatching.domain.program; -import pairmatching.domain.command.Command; +import pairmatching.domain.MatchingHistory; +import pairmatching.domain.MatchingMachine; +import pairmatching.domain.choice.Choice; public class PairMatchingProgram { + private final MatchingHistory history; + private final MatchingMachine machine; + + public PairMatchingProgram(MatchingHistory history, MatchingMachine machine) { + this.history = history; + this.machine = machine; + } + + public boolean hasMatched(Choice choice) { + return history.hasMatchingOf(choice); + } } From 1f5cefd56c23779e7fd776859d6945fea7cdbc5b Mon Sep 17 00:00:00 2001 From: chanminmaxscaler Date: Thu, 15 Dec 2022 21:34:57 +0900 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20=EC=9E=AC=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EB=AA=85=EB=A0=B9=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 매칭 이력이 있는 경우, 재매칭 여부를 사용자에게 입력받을 수 있도록 구현한다. 재매칭 여부 입력이 1~3 글자의 한글이 아닌 경우 오류를 발생시킨다. --- src/main/java/pairmatching/view/InputView.java | 4 ++++ src/main/java/pairmatching/view/OutputView.java | 7 ++++++- src/main/java/pairmatching/view/message/Message.java | 4 +++- .../java/pairmatching/view/validatetool/ValidateTool.java | 3 ++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/pairmatching/view/InputView.java b/src/main/java/pairmatching/view/InputView.java index c3223f106..668e8d02d 100644 --- a/src/main/java/pairmatching/view/InputView.java +++ b/src/main/java/pairmatching/view/InputView.java @@ -19,6 +19,10 @@ public List readChoice() { return Arrays.asList(input.split(DELIMITER)); } + public String readReMatchingCommand() { + return readUsing(ValidateTool.RE_MATCHING); + } + private String readUsing(ValidateTool validateTool) { String input = Console.readLine(); validateBy(input, validateTool); diff --git a/src/main/java/pairmatching/view/OutputView.java b/src/main/java/pairmatching/view/OutputView.java index f94d2af09..690c79999 100644 --- a/src/main/java/pairmatching/view/OutputView.java +++ b/src/main/java/pairmatching/view/OutputView.java @@ -23,7 +23,7 @@ private List makeCommandMessages(Command[] commands, CommandMessage[] co for (int i = 0; i < commands.length; i++) { CommandMessage message = commandMessages[i]; Command command = commands[i]; - messages.add(message.getFormattedMessage(command.getCommand())); + messages.add(message.getFormattedMessage(command.getKey())); } return messages; } @@ -61,6 +61,11 @@ private String makeMissionMessageByLevel(Mission[] missions, String level) { .collect(Collectors.joining(Message.DELIMITER.getMessage())); } + public void printReMatchingGuide() { + print(Message.RE_MATCHING_GUIDE.getMessage()); + print(Message.RE_MATCHING_EXAMPLE.getMessage()); + } + public void print(String message) { System.out.print(message); } diff --git a/src/main/java/pairmatching/view/message/Message.java b/src/main/java/pairmatching/view/message/Message.java index 47b821db2..ff8db542a 100644 --- a/src/main/java/pairmatching/view/message/Message.java +++ b/src/main/java/pairmatching/view/message/Message.java @@ -9,7 +9,9 @@ public enum Message { DELIMITER(" | "), CHOICE_GUIDE("과정, 레벨, 미션을 선택하세요."), CHOICE_EXAMPLE("ex) 백엔드, 레벨1, 자동차경주"), - NEW_LINE("\n"); + NEW_LINE("\n"), + RE_MATCHING_GUIDE("매칭 정보가 있습니다. 다시 매칭하시겠습니까?"), + RE_MATCHING_EXAMPLE("네 | 아니오"); private final String message; diff --git a/src/main/java/pairmatching/view/validatetool/ValidateTool.java b/src/main/java/pairmatching/view/validatetool/ValidateTool.java index de7ac64e8..de7e5bf0c 100644 --- a/src/main/java/pairmatching/view/validatetool/ValidateTool.java +++ b/src/main/java/pairmatching/view/validatetool/ValidateTool.java @@ -3,7 +3,8 @@ public enum ValidateTool { COMMAND("\\w", "[ERROR] 기능 명령어는 한 글자여야 합니다."), - CHOICE(".{1,10},.{3,5},.{1,10}", "[ERROR] 선택 입력 형식이 잘못되었습니다."); + CHOICE(".{1,10},.{3,5},.{1,10}", "[ERROR] 선택 입력 형식이 잘못되었습니다."), + RE_MATCHING("\\[가-힣]{1,3}", "[ERROR] 입력 형식이 잘못되었습니다."); private final String validFormat; private final String errorMessage;