From 872afccc0386122606cda696e1c977e078fca1f6 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:09:06 +0900 Subject: [PATCH 01/15] :sparkles: [Feat] Input --- .../subway/controller/InputController.java | 68 +++++++++++++++++++ .../java/subway/view/Input/InputView.java | 59 ++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/main/java/subway/controller/InputController.java create mode 100644 src/main/java/subway/view/Input/InputView.java diff --git a/src/main/java/subway/controller/InputController.java b/src/main/java/subway/controller/InputController.java new file mode 100644 index 000000000..d24092f5d --- /dev/null +++ b/src/main/java/subway/controller/InputController.java @@ -0,0 +1,68 @@ +package subway.controller; + +import java.util.Scanner; +import subway.exception.ErrorInputException; +import subway.view.Input.InputView; +import subway.view.output.OutputView; + +public class InputController { + private final InputView inputView; + private final OutputView outputView; + private final Scanner scanner; + + private InputController(InputView inputView, OutputView outputView, Scanner scanner) { + this.inputView = inputView; + this.outputView = outputView; + this.scanner = scanner; + } + + public static InputController createInputController(InputView inputView, OutputView outputView, Scanner scanner) { + return new InputController(inputView, outputView, scanner); + } + + public String inputMainFunc() { + while (true) { + try { + outputView.printMain(); + outputView.printSelectFunc(); + return inputView.readMainFunc(scanner.next()); + } catch (ErrorInputException e) { + outputView.printError(e.getMessage()); + } + } + } + + public String inputSelectRoute() { + while (true) { + try { + outputView.printSelectPath(); + outputView.printSelectFunc(); + return inputView.readSelectRoute(scanner.next()); + } catch (ErrorInputException e) { + outputView.printError(e.getMessage()); + } + } + } + + public String inputStartStation() { + while (true) { + try { + outputView.printStartStation(); + return inputView.readStartStation(scanner.next()); + } catch (ErrorInputException e) { + outputView.printError(e.getMessage()); + } + } + } + + public String inputEndStation(String start) { + while (true) { + try { + outputView.printEndStation(); + return inputView.readEndStation(start, scanner.next()); + } catch (ErrorInputException e) { + outputView.printError(e.getMessage()); + } + } + } +} diff --git a/src/main/java/subway/view/Input/InputView.java b/src/main/java/subway/view/Input/InputView.java new file mode 100644 index 000000000..6bb2ff7a8 --- /dev/null +++ b/src/main/java/subway/view/Input/InputView.java @@ -0,0 +1,59 @@ +package subway.view.Input; + +import subway.validation.EndStationValidation; +import subway.validation.MainFunctionValidation; +import subway.validation.SelectRouteValidation; +import subway.validation.StartStationValidation; + +public class InputView { + private final MainFunctionValidation mainFunctionValidation; + private final SelectRouteValidation selectRouteValidation; + private final StartStationValidation startStationValidation; + private final EndStationValidation endStationValidation; + + public InputView(MainFunctionValidation mainFunctionValidation, SelectRouteValidation selectRouteValidation, + StartStationValidation startStationValidation, EndStationValidation endStationValidation) { + this.mainFunctionValidation = mainFunctionValidation; + this.selectRouteValidation = selectRouteValidation; + this.startStationValidation = startStationValidation; + this.endStationValidation = endStationValidation; + } + + public String readMainFunc(String input) { + return mainFunctionValidate(input); + } + + public String readSelectRoute(String input) { + return selectRouteValidate(input); + } + + public String readStartStation(String input) { + return startStationValidate(input); + } + + public String readEndStation(String start, String input) { + return endStationValidate(start, input); + } + + private String mainFunctionValidate(String input) { + mainFunctionValidation.isBlank(input); + return mainFunctionValidation.isOneOrQ(input); + } + + private String selectRouteValidate(String input) { + selectRouteValidation.isBlank(input); + return selectRouteValidation.isOneOrTwoOrB(input); + } + + private String startStationValidate(String input) { + startStationValidation.isBlank(input); + return startStationValidation.isRegister(input); + } + + private String endStationValidate(String start, String input) { + endStationValidation.isBlank(input); + endStationValidation.isRegister(input); + return endStationValidation.isDuplicate(start, input); + } +} + From b0d043c2fa6b1d39032dc0dc09e2d02c066c3beb Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:09:35 +0900 Subject: [PATCH 02/15] :sparkles: [Feat] validation --- .../subway/exception/ErrorInputException.java | 43 +++++++++++++++++++ .../validation/EndStationValidation.java | 32 ++++++++++++++ .../validation/MainFunctionValidation.java | 21 +++++++++ .../validation/SelectRouteValidation.java | 21 +++++++++ .../validation/StartStationValidation.java | 25 +++++++++++ 5 files changed, 142 insertions(+) create mode 100644 src/main/java/subway/exception/ErrorInputException.java create mode 100644 src/main/java/subway/validation/EndStationValidation.java create mode 100644 src/main/java/subway/validation/MainFunctionValidation.java create mode 100644 src/main/java/subway/validation/SelectRouteValidation.java create mode 100644 src/main/java/subway/validation/StartStationValidation.java diff --git a/src/main/java/subway/exception/ErrorInputException.java b/src/main/java/subway/exception/ErrorInputException.java new file mode 100644 index 000000000..9de54d3af --- /dev/null +++ b/src/main/java/subway/exception/ErrorInputException.java @@ -0,0 +1,43 @@ +package subway.exception; + +public class ErrorInputException extends RuntimeException { + public enum ErrorMessage { + MAIN_FUNCTION_CANNOT_BE_NULL_OR_EMPTY("메인 화면 기능 선택은 빈 값이거나 null 값 일 수 없습니다. 다시 입력해주세요."), + MAIN_FUNCTION_MUST_BE_ONE_OR_Q("메인 화면 기능 선택은 1 또는 Q 값만 입력 가능합니다. 다시 입력해주세요."), + + SELECT_ROUTE_CANNOT_BE_NULL_OR_EMPTY("경로 선택 기능은 빈 값이거나 null 값 일 수 없습니다. 다시 입력해주세요."), + SELECT_ROUTE_MUST_BE_ONE_OR_OR_TWO_OR_B("경로 선택 기능은 1 또는 2 또는 B 값만 입력 가능합니다. 다시 입력해주세요."), + + START_STATION_CANNOT_BE_NULL_OR_EMPTY("출발역은 빈 값이거나 null 값 일 수 없습니다. 다시 입력해주세요."), + + END_STATION_CANNOT_BE_NULL_OR_EMPTY("도착역은 빈 값이거나 null 값 일 수 없습니다. 다시 입력해주세요."), + + IS_NOT_REGISTERED("등록되지 않은 역입니다. 다시 입력해주세요."), + + START_AND_END_ARE_DUPLICATE("출발역과 도착역이 동일합니다."), + + NOT_CONNECTED(" 출발역과 도착역이 연결되어 있지 않습니다."); + + + ErrorMessage(final String message) { + this.message = message; + } + + private final String errorMessage = "[ERROR] "; + + private final String message; + + public String getErrorMessage() { + return errorMessage; + } + + public String getMessage() { + return message; + } + + } + + public ErrorInputException(ErrorMessage message) { + super(message.getErrorMessage() + message.getMessage()); + } +} diff --git a/src/main/java/subway/validation/EndStationValidation.java b/src/main/java/subway/validation/EndStationValidation.java new file mode 100644 index 000000000..ebf1afca9 --- /dev/null +++ b/src/main/java/subway/validation/EndStationValidation.java @@ -0,0 +1,32 @@ +package subway.validation; + +import static subway.exception.ErrorInputException.ErrorMessage.END_STATION_CANNOT_BE_NULL_OR_EMPTY; +import static subway.exception.ErrorInputException.ErrorMessage.IS_NOT_REGISTERED; +import static subway.exception.ErrorInputException.ErrorMessage.START_AND_END_ARE_DUPLICATE; + +import java.util.Arrays; +import subway.domain.StationInfo; +import subway.exception.ErrorInputException; + +public class EndStationValidation { + public static void isBlank(String input) { + if (input == null || input.trim().isEmpty()) { + throw new ErrorInputException(END_STATION_CANNOT_BE_NULL_OR_EMPTY); + } + } + + public void isRegister(String input) { + boolean isRegistered = Arrays.stream(StationInfo.values()) + .anyMatch(stationInfo -> stationInfo.getName().equals(input)); + if (!isRegistered) { + throw new ErrorInputException(IS_NOT_REGISTERED); + } + } + + public String isDuplicate(String start, String end) { + if (start.equals(end)) { + throw new ErrorInputException(START_AND_END_ARE_DUPLICATE); + } + return end; + } +} diff --git a/src/main/java/subway/validation/MainFunctionValidation.java b/src/main/java/subway/validation/MainFunctionValidation.java new file mode 100644 index 000000000..09934b2f6 --- /dev/null +++ b/src/main/java/subway/validation/MainFunctionValidation.java @@ -0,0 +1,21 @@ +package subway.validation; + +import static subway.exception.ErrorInputException.ErrorMessage.MAIN_FUNCTION_CANNOT_BE_NULL_OR_EMPTY; +import static subway.exception.ErrorInputException.ErrorMessage.MAIN_FUNCTION_MUST_BE_ONE_OR_Q; + +import subway.exception.ErrorInputException; + +public class MainFunctionValidation { + public static void isBlank(String input) { + if (input == null || input.trim().isEmpty()) { + throw new ErrorInputException(MAIN_FUNCTION_CANNOT_BE_NULL_OR_EMPTY); + } + } + + public static String isOneOrQ(String input) { + if (!input.equals("1") && !input.equals("Q")) { + throw new ErrorInputException(MAIN_FUNCTION_MUST_BE_ONE_OR_Q); + } + return input; + } +} diff --git a/src/main/java/subway/validation/SelectRouteValidation.java b/src/main/java/subway/validation/SelectRouteValidation.java new file mode 100644 index 000000000..be7bd1d08 --- /dev/null +++ b/src/main/java/subway/validation/SelectRouteValidation.java @@ -0,0 +1,21 @@ +package subway.validation; + +import static subway.exception.ErrorInputException.ErrorMessage.SELECT_ROUTE_CANNOT_BE_NULL_OR_EMPTY; +import static subway.exception.ErrorInputException.ErrorMessage.SELECT_ROUTE_MUST_BE_ONE_OR_OR_TWO_OR_B; + +import subway.exception.ErrorInputException; + +public class SelectRouteValidation { + public static void isBlank(String input) { + if (input == null || input.trim().isEmpty()) { + throw new ErrorInputException(SELECT_ROUTE_CANNOT_BE_NULL_OR_EMPTY); + } + } + + public static String isOneOrTwoOrB(String input) { + if (!input.equals("1") && !input.equals("2") && !input.equals("B")) { + throw new ErrorInputException(SELECT_ROUTE_MUST_BE_ONE_OR_OR_TWO_OR_B); + } + return input; + } +} diff --git a/src/main/java/subway/validation/StartStationValidation.java b/src/main/java/subway/validation/StartStationValidation.java new file mode 100644 index 000000000..38491934c --- /dev/null +++ b/src/main/java/subway/validation/StartStationValidation.java @@ -0,0 +1,25 @@ +package subway.validation; + +import static subway.exception.ErrorInputException.ErrorMessage.IS_NOT_REGISTERED; +import static subway.exception.ErrorInputException.ErrorMessage.START_STATION_CANNOT_BE_NULL_OR_EMPTY; + +import java.util.Arrays; +import subway.domain.StationInfo; +import subway.exception.ErrorInputException; + +public class StartStationValidation { + public static void isBlank(String input) { + if (input == null || input.trim().isEmpty()) { + throw new ErrorInputException(START_STATION_CANNOT_BE_NULL_OR_EMPTY); + } + } + + public String isRegister(String input) { + boolean isRegistered = Arrays.stream(StationInfo.values()) + .anyMatch(stationInfo -> stationInfo.getName().equals(input)); + if (!isRegistered) { + throw new ErrorInputException(IS_NOT_REGISTERED); + } + return input; + } +} From 8268bd011eb1014a132e7c9180fc6e69c5cb3569 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:09:52 +0900 Subject: [PATCH 03/15] :sparkles: [Feat] station Info --- src/main/java/subway/domain/Station.java | 2 - src/main/java/subway/domain/StationInfo.java | 21 +++++++++ .../java/subway/domain/StationRepository.java | 26 ----------- .../subway/repository/StationRepository.java | 43 +++++++++++++++++++ .../java/subway/service/StationService.java | 23 ++++++++++ 5 files changed, 87 insertions(+), 28 deletions(-) create mode 100644 src/main/java/subway/domain/StationInfo.java delete mode 100644 src/main/java/subway/domain/StationRepository.java create mode 100644 src/main/java/subway/repository/StationRepository.java create mode 100644 src/main/java/subway/service/StationService.java diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..6df2edada 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -10,6 +10,4 @@ public Station(String name) { public String getName() { return name; } - - // 추가 기능 구현 } diff --git a/src/main/java/subway/domain/StationInfo.java b/src/main/java/subway/domain/StationInfo.java new file mode 100644 index 000000000..24218d285 --- /dev/null +++ b/src/main/java/subway/domain/StationInfo.java @@ -0,0 +1,21 @@ +package subway.domain; + +public enum StationInfo { + GYOBYEON_STATION("교대역"), + GANGNAM_STATION("강남역"), + YEOKSAM_STATION("역삼역"), + NAMBU_TERMINAL_STATION("남부터미널역"), + YANGJAE_STATION("양재역"), + YANGJAE_CITIZEN_FOREST_STATION("양재시민의숲역"), + MAEBONG_STATIO("매봉역"); + + private final String name; + + StationInfo(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java deleted file mode 100644 index 8ed9d103f..000000000 --- a/src/main/java/subway/domain/StationRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package subway.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } - - public static void deleteAll() { - stations.clear(); - } -} diff --git a/src/main/java/subway/repository/StationRepository.java b/src/main/java/subway/repository/StationRepository.java new file mode 100644 index 000000000..632096a16 --- /dev/null +++ b/src/main/java/subway/repository/StationRepository.java @@ -0,0 +1,43 @@ +package subway.repository; + +import static subway.exception.ErrorInputException.ErrorMessage.IS_NOT_REGISTERED; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import subway.domain.Station; +import subway.exception.ErrorInputException; + +public class StationRepository { + private static final List stations = new ArrayList<>(); + + public static List stations() { + return Collections.unmodifiableList(stations); + } + + public static void addStation(Station station) { + stations.add(station); + } + + public static boolean deleteStation(String name) { + return stations.removeIf(station -> Objects.equals(station.getName(), name)); + } + + public static void deleteAll() { + stations.clear(); + } + + public static Station getStation(String name) { + while (true) { + try { + return stations.stream() + .filter(station -> station.getName().equals(name)) + .findFirst() + .orElseThrow(() -> new ErrorInputException(IS_NOT_REGISTERED)); + } catch (ErrorInputException e) { + System.out.println(e.getMessage()); + } + } + } +} diff --git a/src/main/java/subway/service/StationService.java b/src/main/java/subway/service/StationService.java new file mode 100644 index 000000000..31581af05 --- /dev/null +++ b/src/main/java/subway/service/StationService.java @@ -0,0 +1,23 @@ +package subway.service; + +import subway.domain.Station; +import subway.domain.StationInfo; +import subway.repository.StationRepository; + +public class StationService { + private final StationRepository stationRepository; + + private StationService(StationRepository stationRepository) { + this.stationRepository = stationRepository; + } + + public static StationService createStationService(StationRepository stationRepository) { + return new StationService(stationRepository); + } + + public void registerStation() { + for (StationInfo stationInfo : StationInfo.values()) { + stationRepository.addStation(new Station(stationInfo.getName())); + } + } +} From bfaa453eeec4eb90be3048af998c0a0755ac1ab8 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:10:08 +0900 Subject: [PATCH 04/15] :sparkles: [Feat] line Info --- src/main/java/subway/domain/Line.java | 2 -- .../LineRepository.java | 3 ++- src/main/java/subway/service/LineService.java | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) rename src/main/java/subway/{domain => repository}/LineRepository.java (91%) create mode 100644 src/main/java/subway/service/LineService.java diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..fffcd30fb 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -10,6 +10,4 @@ public Line(String name) { public String getName() { return name; } - - // 추가 기능 구현 } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/repository/LineRepository.java similarity index 91% rename from src/main/java/subway/domain/LineRepository.java rename to src/main/java/subway/repository/LineRepository.java index 2c4a723c9..a9688fe41 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/repository/LineRepository.java @@ -1,9 +1,10 @@ -package subway.domain; +package subway.repository; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import subway.domain.Line; public class LineRepository { private static final List lines = new ArrayList<>(); diff --git a/src/main/java/subway/service/LineService.java b/src/main/java/subway/service/LineService.java new file mode 100644 index 000000000..50924d7da --- /dev/null +++ b/src/main/java/subway/service/LineService.java @@ -0,0 +1,23 @@ +package subway.service; + +import subway.domain.Line; +import subway.domain.RouteInfo; +import subway.repository.LineRepository; + +public class LineService { + private final LineRepository lineRepository; + + private LineService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public static LineService createLineService(LineRepository lineRepository) { + return new LineService(lineRepository); + } + + public void registerLine() { + for (RouteInfo routeInfo : RouteInfo.values()) { + lineRepository.addLine(new Line(routeInfo.name())); + } + } +} From 5a31628d8b76088f5043e527216de4f68fbced0a Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:10:18 +0900 Subject: [PATCH 05/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=B5=9C=EB=8B=A8?= =?UTF-8?q?=20=EA=B1=B0=EB=A6=AC=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/service/ShortestPathService.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/subway/service/ShortestPathService.java diff --git a/src/main/java/subway/service/ShortestPathService.java b/src/main/java/subway/service/ShortestPathService.java new file mode 100644 index 000000000..1994368ba --- /dev/null +++ b/src/main/java/subway/service/ShortestPathService.java @@ -0,0 +1,44 @@ +package subway.service; + +import static subway.domain.RouteInfo.calculateTotalDistance; +import static subway.domain.RouteInfo.calculateTotalTime; +import static subway.domain.RouteInfo.values; + +import java.util.List; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; +import subway.domain.Result; +import subway.domain.RouteInfo; +import subway.domain.Station; + +public class ShortestPathService { + public Result calculate(Station start, Station end) { + WeightedMultigraph graph = createGraph(values()); + + DijkstraShortestPath dijkstraShortestPath = + new DijkstraShortestPath<>(graph); + + GraphPath shortestPath = + dijkstraShortestPath.getPath(start.getName(), end.getName()); + + List edges = shortestPath.getEdgeList(); + + int totalDistance = calculateTotalDistance(graph, edges); + int totalTime = calculateTotalTime(graph, edges); + + return Result.createResult(totalDistance, totalTime, shortestPath.getVertexList()); + } + + private WeightedMultigraph createGraph(RouteInfo[] routeInfos) { + WeightedMultigraph graph = + new WeightedMultigraph<>(DefaultWeightedEdge.class); + + for (RouteInfo routeInfo : routeInfos) { + routeInfo.calculateShortestPath(graph, routeInfo); + } + + return graph; + } +} From edc6e8e9d711d80dcc55bc40a4fb1b736adc7e11 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:10:28 +0900 Subject: [PATCH 06/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=B5=9C=EC=86=8C?= =?UTF-8?q?=20=EC=8B=9C=EA=B0=84=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/service/MinimumTimeService.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/subway/service/MinimumTimeService.java diff --git a/src/main/java/subway/service/MinimumTimeService.java b/src/main/java/subway/service/MinimumTimeService.java new file mode 100644 index 000000000..2c8a0826f --- /dev/null +++ b/src/main/java/subway/service/MinimumTimeService.java @@ -0,0 +1,44 @@ +package subway.service; + +import static subway.domain.RouteInfo.calculateTotalDistance; +import static subway.domain.RouteInfo.calculateTotalTime; +import static subway.domain.RouteInfo.values; + +import java.util.List; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; +import subway.domain.Result; +import subway.domain.RouteInfo; +import subway.domain.Station; + +public class MinimumTimeService { + public Result calculate(Station start, Station end) { + WeightedMultigraph graph = createGraph(values()); + + DijkstraShortestPath dijkstraShortestPath = + new DijkstraShortestPath<>(graph); + + GraphPath shortestPath = + dijkstraShortestPath.getPath(start.getName(), end.getName()); + + List edges = shortestPath.getEdgeList(); + + int totalDistance = calculateTotalDistance(graph, edges); + int totalTime = calculateTotalTime(graph, edges); + + return Result.createResult(totalDistance, totalTime, shortestPath.getVertexList()); + } + + private WeightedMultigraph createGraph(RouteInfo[] routeInfos) { + WeightedMultigraph graph = + new WeightedMultigraph<>(DefaultWeightedEdge.class); + + for (RouteInfo routeInfo : routeInfos) { + routeInfo.calculateMinimumTime(graph, routeInfo); + } + + return graph; + } +} \ No newline at end of file From cf0b6019d09b6151055882b08d3229d9861ecb00 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:10:37 +0900 Subject: [PATCH 07/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/InitController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/subway/controller/InitController.java diff --git a/src/main/java/subway/controller/InitController.java b/src/main/java/subway/controller/InitController.java new file mode 100644 index 000000000..313c389b8 --- /dev/null +++ b/src/main/java/subway/controller/InitController.java @@ -0,0 +1,23 @@ +package subway.controller; + +import subway.service.LineService; +import subway.service.StationService; + +public class InitController { + private final StationService stationService; + private final LineService lineService; + + private InitController(StationService stationService, LineService lineService) { + this.stationService = stationService; + this.lineService = lineService; + } + + public static InitController createInitController(StationService stationService, LineService lineService) { + return new InitController(stationService, lineService); + } + + public void init() { + stationService.registerStation(); + lineService.registerLine(); + } +} From ab1cd0d30b5026419eb683dd3b741fa9ec873660 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:10:47 +0900 Subject: [PATCH 08/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EA=B2=BD=EB=A1=9C=20=EC=A0=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/RouteInfo.java | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/main/java/subway/domain/RouteInfo.java diff --git a/src/main/java/subway/domain/RouteInfo.java b/src/main/java/subway/domain/RouteInfo.java new file mode 100644 index 000000000..e1195aa47 --- /dev/null +++ b/src/main/java/subway/domain/RouteInfo.java @@ -0,0 +1,98 @@ +package subway.domain; + +import static subway.domain.StationInfo.GANGNAM_STATION; +import static subway.domain.StationInfo.GYOBYEON_STATION; +import static subway.domain.StationInfo.MAEBONG_STATIO; +import static subway.domain.StationInfo.NAMBU_TERMINAL_STATION; +import static subway.domain.StationInfo.YANGJAE_CITIZEN_FOREST_STATION; +import static subway.domain.StationInfo.YANGJAE_STATION; +import static subway.domain.StationInfo.YEOKSAM_STATION; +import static subway.exception.ErrorInputException.ErrorMessage.IS_NOT_REGISTERED; + +import java.util.Arrays; +import java.util.List; +import org.jgrapht.graph.DefaultWeightedEdge; +import org.jgrapht.graph.WeightedMultigraph; +import subway.exception.ErrorInputException; +import subway.repository.StationRepository; + +public enum RouteInfo { + LINE_2_GYOBYEON_GANGNAM("2", GYOBYEON_STATION, GANGNAM_STATION, 2, 3), + LINE_2_GANGNAM_YEOKSAM("2", GANGNAM_STATION, YEOKSAM_STATION, 2, 3), + LINE_3_GYOBYEON_NAMBU_TERMINAL("2", GYOBYEON_STATION, NAMBU_TERMINAL_STATION, 3, 2), + LINE_3_NAMBU_TERMINAL_YANGJAE("3", NAMBU_TERMINAL_STATION, YANGJAE_STATION, 6, 5), + LINE_3_YANGJAE_MAEBONG("3", YANGJAE_STATION, MAEBONG_STATIO, 1, 1), + NEW_BUNDANG_GANGNAM_YANGJAE("NewBunDang", GANGNAM_STATION, YANGJAE_STATION, 2, 8), + NEW_BUNDANG_YANGJAE_YANGJAE_CITIZEN_FOREST("NewBunDang", YANGJAE_STATION, YANGJAE_CITIZEN_FOREST_STATION, 10, 3); + + private final String line; + private final StationInfo startStation; + private final StationInfo endStation; + private final int distance; + private final int time; + + RouteInfo(String line, StationInfo startStation, StationInfo endStation, int distance, int time) { + this.line = line; + this.startStation = startStation; + this.endStation = endStation; + this.distance = distance; + this.time = time; + } + + public void calculateShortestPath(WeightedMultigraph graph, RouteInfo routeInfo) { + addEdgeWithWeight(graph, routeInfo, routeInfo.distance); + } + + public void calculateMinimumTime(WeightedMultigraph graph, RouteInfo routeInfo) { + addEdgeWithWeight(graph, routeInfo, routeInfo.time); + } + + private void addEdgeWithWeight(WeightedMultigraph graph, RouteInfo routeInfo, + int weight) { + Station startStation = StationRepository.getStation(routeInfo.startStation.getName()); + Station endStation = StationRepository.getStation(routeInfo.endStation.getName()); + graph.addVertex(startStation.getName()); + graph.addVertex(endStation.getName()); + graph.setEdgeWeight(graph.addEdge(startStation.getName(), endStation.getName()), weight); + } + + public static int calculateTotalDistance(WeightedMultigraph graph, + List edges) { + return edges.stream() + .map(edge -> getRouteInfo(graph, edge)) + .mapToInt(routeInfo -> routeInfo.distance) + .sum(); + } + + public static int calculateTotalTime(WeightedMultigraph graph, + List edges) { + return edges.stream() + .map(edge -> getRouteInfo(graph, edge)) + .mapToInt(routeInfo -> routeInfo.time) + .sum(); + } + + private static RouteInfo getRouteInfo(WeightedMultigraph graph, + DefaultWeightedEdge edge) { + String startStationName = graph.getEdgeSource(edge); + String endStationName = graph.getEdgeTarget(edge); + RouteInfo routeInfo = RouteInfo.findRouteInfo(startStationName, endStationName); + return routeInfo; + } + + public static RouteInfo findRouteInfo(String startStation, String endStation) { + while (true) { + try { + return Arrays.stream(RouteInfo.values()) + .filter(routeInfo -> routeInfo.startStation.getName().equals(startStation) + && routeInfo.endStation.getName().equals(endStation)) + .findFirst() + .orElseThrow(() -> new ErrorInputException(IS_NOT_REGISTERED)); + } catch (ErrorInputException e) { + System.out.println(e.getMessage()); + } + } + + } +} + From a9f43781480c2b5979779820562fcb4683e11786 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:10:54 +0900 Subject: [PATCH 09/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=B4=9D=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EC=8B=9C=EA=B0=84,=20=EA=B1=B0=EB=A6=AC?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Result.java | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/subway/domain/Result.java diff --git a/src/main/java/subway/domain/Result.java b/src/main/java/subway/domain/Result.java new file mode 100644 index 000000000..7cf15b8a0 --- /dev/null +++ b/src/main/java/subway/domain/Result.java @@ -0,0 +1,32 @@ +package subway.domain; + +import java.util.Collections; +import java.util.List; + +public class Result { + private final int totalDistance; + private final int totalTime; + private final List routes; + + private Result(int totalDistance, int totalTime, List routes) { + this.totalDistance = totalDistance; + this.totalTime = totalTime; + this.routes = routes; + } + + public static Result createResult(int totalDistance, int totalTime, List routes) { + return new Result(totalDistance, totalTime, routes); + } + + public List getRoutes() { + return Collections.unmodifiableList(routes); + } + + public int getTotalDistance() { + return totalDistance; + } + + public int getTotalTime() { + return totalTime; + } +} From 7378088879ed6faaaf3c33de5c95bb3749e12d18 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:11:07 +0900 Subject: [PATCH 10/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20Controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/SubwayController.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/subway/controller/SubwayController.java diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java new file mode 100644 index 000000000..5326084c6 --- /dev/null +++ b/src/main/java/subway/controller/SubwayController.java @@ -0,0 +1,43 @@ +package subway.controller; + +import subway.domain.Result; +import subway.domain.Station; +import subway.service.MinimumTimeService; +import subway.service.ShortestPathService; +import subway.view.output.OutputView; + +public class SubwayController { + private final ShortestPathService shortestPathService; + private final MinimumTimeService minimumTimeService; + private OutputView outputView; + + private SubwayController(ShortestPathService shortestPathService, MinimumTimeService minimumTimeService, + OutputView outputView) { + this.shortestPathService = shortestPathService; + this.minimumTimeService = minimumTimeService; + this.outputView = outputView; + } + + public static SubwayController createSubwayController(ShortestPathService shortestPathService, + MinimumTimeService minimumTimeService, + OutputView outputView) { + return new SubwayController(shortestPathService, minimumTimeService, outputView); + } + + public void calculateAndPrintRoute(String selectRouteFunc, Station start, Station end) { + Result stations = null; + if (selectRouteFunc.equals("1")) { + stations = shortestPathService.calculate(start, end); + } + if (selectRouteFunc.equals("2")) { + stations = minimumTimeService.calculate(start, end); + } + + printResult(stations); + } + + private void printResult(Result result) { + outputView.printSearchingResult(result.getTotalDistance(), result.getTotalTime()); + outputView.printRoutes(result.getRoutes()); + } +} From 7e1918aec0346e4fee14728a03a2b5387aeca71d Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:11:27 +0900 Subject: [PATCH 11/15] :sparkles: [Feat] output --- src/main/java/subway/constant/Function.java | 13 ++++ .../java/subway/constant/PrintOutMessage.java | 50 ++++++++++++++ .../java/subway/constant/SelectRoute.java | 14 ++++ .../java/subway/view/output/OutputView.java | 66 +++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 src/main/java/subway/constant/Function.java create mode 100644 src/main/java/subway/constant/PrintOutMessage.java create mode 100644 src/main/java/subway/constant/SelectRoute.java create mode 100644 src/main/java/subway/view/output/OutputView.java diff --git a/src/main/java/subway/constant/Function.java b/src/main/java/subway/constant/Function.java new file mode 100644 index 000000000..9b5b4a6aa --- /dev/null +++ b/src/main/java/subway/constant/Function.java @@ -0,0 +1,13 @@ +package subway.constant; + +public enum Function { + SEARCHING_ROUTE("1. 경로 조회"), + QUIT("Q. 종료"); + + public final String message; + + Function(String message) { + this.message = message; + } + +} diff --git a/src/main/java/subway/constant/PrintOutMessage.java b/src/main/java/subway/constant/PrintOutMessage.java new file mode 100644 index 000000000..e8f50ac20 --- /dev/null +++ b/src/main/java/subway/constant/PrintOutMessage.java @@ -0,0 +1,50 @@ +package subway.constant; + +import java.util.List; + +public enum PrintOutMessage { + MAIN("메인 화면"), + PLZ_INPUT_FUNCTION("원하는 기능을 선택하세요."), + PLZ_INPUT_PATH_STANDARD("경로 기준"), + PLZ_INPUT_START_STATION("출발역을 입력하세요."), + PLZ_INPUT_END_STATION("도착역을 입력하세요."), + SEARCHING_RESULT("조회 결과"), + TOTAL_DISTANCE("총 거리: "), + TOTAL_TIME("총 소요 시간: "), + KILOMETER("km"), + MINUTE("분"), + EMPTY_LINE("\n"), + DASH("---"); + + public final String message; + private final String decorate = "## "; + private static String info = "[INFO] "; + + PrintOutMessage(String message) { + this.message = message; + } + + public String getMessage() { + return decorate + message; + } + + public static String getDash() { + return info + DASH.message; + } + + public static String printTotalDistance(int distance) { + return info + TOTAL_DISTANCE.message + distance + KILOMETER.message; + } + + public static String printTotalTime(int time) { + return info + TOTAL_TIME.message + time + MINUTE.message; + } + + public static String getRoutes(List routes) { + StringBuilder sb = new StringBuilder(); + for (String route : routes) { + sb.append(info).append(route).append("\n"); + } + return sb.toString(); + } +} diff --git a/src/main/java/subway/constant/SelectRoute.java b/src/main/java/subway/constant/SelectRoute.java new file mode 100644 index 000000000..1ab848be1 --- /dev/null +++ b/src/main/java/subway/constant/SelectRoute.java @@ -0,0 +1,14 @@ +package subway.constant; + +public enum SelectRoute { + SHORTEST_PATH("1. 최단 거리"), + MINIMUM_TIME("2. 최소 시간"), + BACK("B. 돌아가기"); + + public final String message; + + SelectRoute(String message) { + this.message = message; + } + +} diff --git a/src/main/java/subway/view/output/OutputView.java b/src/main/java/subway/view/output/OutputView.java new file mode 100644 index 000000000..8e7a612fd --- /dev/null +++ b/src/main/java/subway/view/output/OutputView.java @@ -0,0 +1,66 @@ +package subway.view.output; + +import static subway.constant.Function.QUIT; +import static subway.constant.Function.SEARCHING_ROUTE; +import static subway.constant.PrintOutMessage.EMPTY_LINE; +import static subway.constant.PrintOutMessage.MAIN; +import static subway.constant.PrintOutMessage.PLZ_INPUT_END_STATION; +import static subway.constant.PrintOutMessage.PLZ_INPUT_FUNCTION; +import static subway.constant.PrintOutMessage.PLZ_INPUT_PATH_STANDARD; +import static subway.constant.PrintOutMessage.PLZ_INPUT_START_STATION; +import static subway.constant.PrintOutMessage.SEARCHING_RESULT; +import static subway.constant.PrintOutMessage.getDash; +import static subway.constant.PrintOutMessage.getRoutes; +import static subway.constant.PrintOutMessage.printTotalDistance; +import static subway.constant.PrintOutMessage.printTotalTime; +import static subway.constant.SelectRoute.BACK; +import static subway.constant.SelectRoute.MINIMUM_TIME; +import static subway.constant.SelectRoute.SHORTEST_PATH; + +import java.util.List; + +public class OutputView { + public void printMain() { + System.out.println(MAIN.getMessage()); + System.out.println(SEARCHING_ROUTE.message); + System.out.println(QUIT.message); + System.out.print(EMPTY_LINE.message); + } + + public void printSelectFunc() { + System.out.println(PLZ_INPUT_FUNCTION.getMessage()); + } + + public void printSelectPath() { + System.out.print(EMPTY_LINE.message); + System.out.println(PLZ_INPUT_PATH_STANDARD.getMessage()); + System.out.println(SHORTEST_PATH.message); + System.out.println(MINIMUM_TIME.message); + System.out.println(BACK.message); + System.out.print(EMPTY_LINE.message); + } + + public void printStartStation() { + System.out.println(PLZ_INPUT_START_STATION.getMessage()); + } + + public void printEndStation() { + System.out.println(PLZ_INPUT_END_STATION.getMessage()); + } + + public void printSearchingResult(int distance, int time) { + System.out.println(SEARCHING_RESULT.getMessage()); + System.out.println(getDash()); + System.out.println(printTotalDistance(distance)); + System.out.println(printTotalTime(time)); + System.out.println(getDash()); + } + + public void printRoutes(List routes) { + System.out.println(getRoutes(routes)); + } + + public void printError(String errorMessage) { + System.out.println(errorMessage); + } +} From 8dd96b5d82a983f7fe8c75439dbb4400dda0fae7 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:11:42 +0900 Subject: [PATCH 12/15] =?UTF-8?q?:sparkles:=20[Feat]=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=EB=8F=84=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/Application.java | 105 +++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..fbd8b48c6 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,113 @@ package subway; import java.util.Scanner; +import subway.controller.InitController; +import subway.controller.InputController; +import subway.controller.SubwayController; +import subway.domain.Station; +import subway.repository.LineRepository; +import subway.repository.StationRepository; +import subway.service.LineService; +import subway.service.MinimumTimeService; +import subway.service.ShortestPathService; +import subway.service.StationService; +import subway.validation.EndStationValidation; +import subway.validation.MainFunctionValidation; +import subway.validation.SelectRouteValidation; +import subway.validation.StartStationValidation; +import subway.view.Input.InputView; +import subway.view.output.OutputView; public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + + // 객체 생성 + InputView inputView = createInputView(); + OutputView outputView = new OutputView(); + + StationService stationService = createStationService(new StationRepository()); + LineService lineService = createLineService(new LineRepository()); + ShortestPathService shortestPathService = new ShortestPathService(); + MinimumTimeService minimumTimeService = new MinimumTimeService(); + + InitController initController = createInitController(stationService, lineService); + InputController inputController = createInputController(inputView, outputView, scanner); + SubwayController subwayController = createSubwayController(shortestPathService, minimumTimeService, outputView); + + // 메서드 호출 + executeControllers(initController, inputController, subwayController); + } + + private static InputView createInputView() { + MainFunctionValidation mainFunctionValidation = new MainFunctionValidation(); + SelectRouteValidation selectRouteValidation = new SelectRouteValidation(); + StartStationValidation startStationValidation = new StartStationValidation(); + EndStationValidation endStationValidation = new EndStationValidation(); + return new InputView(mainFunctionValidation, selectRouteValidation, startStationValidation, + endStationValidation); + } + + private static StationService createStationService(StationRepository stationRepository) { + return StationService.createStationService(stationRepository); + } + + private static LineService createLineService(LineRepository lineRepository) { + return LineService.createLineService(lineRepository); + } + + + private static InitController createInitController(StationService stationService, LineService lineService) { + return InitController.createInitController(stationService, lineService); + } + + private static InputController createInputController(InputView inputView, OutputView outputView, Scanner scanner) { + return InputController.createInputController(inputView, outputView, scanner); + } + + private static SubwayController createSubwayController(ShortestPathService shortestPathService, + MinimumTimeService minimumTimeService, + OutputView outputView) { + return SubwayController.createSubwayController(shortestPathService, minimumTimeService, outputView); + } + + + private static void executeControllers(InitController initController, InputController inputController, + SubwayController subwayController) { + initController.init(); + + while (true) { + String mainFunc = inputController.inputMainFunc(); + if (mainFunc.equals("Q")) { + System.exit(0); + } + + if (mainFunc.equals("1")) { + executeRouteSelection(inputController, subwayController); + } + } + } + + private static void executeRouteSelection(InputController inputController, SubwayController subwayController) { + String selectRouteFunc = inputController.inputSelectRoute(); + if (selectRouteFunc.equals("B")) { + return; + } + + Station start = inputStartStation(inputController); + Station end = inputEndStation(inputController, start); + + subwayController.calculateAndPrintRoute(selectRouteFunc, start, end); + } + + private static Station inputStartStation(InputController inputController) { + String stationName = inputController.inputStartStation(); + return new Station(stationName); + } + + private static Station inputEndStation(InputController inputController, Station start) { + String stationName = inputController.inputEndStation(start.getName()); + return new Station(stationName); } } + From a2828911019048df6d6ec3ce438eac04fe9b8ab1 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Thu, 30 Nov 2023 22:11:49 +0900 Subject: [PATCH 13/15] =?UTF-8?q?:memo:=20[Docs]=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..45bcb28b8 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,86 @@ +## ✏️ 구현할 기능 목록 + +___ + +## 초기 설정 + +- [X] 프로그램 시작 시 역, 노선, 구간 정보를 초기 설정 해야 한다. + - 거리와 소요 시간은 양의 정수이며 단위는 km와 분을 의미한다. + +## 입력 + +- [X] `메인 화면 : 원하는 기능 선택` 입력 + - 비기능적 요구사항 + - null 값이거나 빈 값인지 확인한다. + - `1`, `Q`가 아니면 예외가 발생한다. + + - 기능적 요구사항 + - `1` : 경로 조회 + - `Q` : 종료 + +- [X] `경로 기준 : 원하는 기능 선택` 입력 + - 비기능적 요구사항 + ``` + 1. 최단 거리 + 2. 최소 시간 + B. 돌아가기 + ``` + - null 값이거나 빈 값인지 확인한다. + - `1`, `2`, `B`가 아니면 예외가 발생한다. + + - 기능적 요구사항 + - `1` : 최단 거리 + - `2` : 최소 시간 + - `B` : 돌아가기 + +- [X] `출발역` 입력 + - 비기능적 요구사항 + - null 값이거나 빈 값인지 확인한다. + + - 기능적 요구사항 + - 등록된 지하철 역인지 확인한다. (`교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역`) + +- [X] `도착역` 입력 + + - 비기능적 요구사항 + - null 값이거나 빈 값인지 확인한다. + + - 기능적 요구사항 + - 등록된 지하철 역인지 확인한다. (`교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역`) + - 출발역과 도착역이 같으면 예외가 발생한다. + +## 조회 결과 + +- [ ] 경로 조회 시 출발역과 도착역이 연결되어 있지 않으면 에러를 출력한다. + - 경로 조회 시 총 거리, 총 소요 시간도 함께 출력한다. + +## 출력 + +- [X] `## 메인 화면` 출력 + ``` + 1. 경로 조회 + Q. 종료 + ``` + +- [X] `## 원하는 기능을 선택하세요.` 출력 + + +- [X] `## 경로 기준` 출력 + ``` + 1. 최단 거리 + 2. 최소 시간 + B. 돌아가기 + ``` + +- [X] `## 출발역을 입력하세요.` 출력 + +- [X] `## 도착역을 입력하세요.` 출력 + +- [X] `## 조회 결과` 출력 + - 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. + +--- + +## 공통 검증 + +- [X] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. 에러의 문구는 자유롭게 작성한다. \ No newline at end of file From 846d7285484a8eac1305108babca58b6797d1e98 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Fri, 1 Dec 2023 12:16:43 +0900 Subject: [PATCH 14/15] =?UTF-8?q?:memo:=20[Docs]=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존: 상행/하행을 나눠서 환승 불가능...? 현재: 예외 처리 조건을 다시 읽어보니 출발역/도착역이 이어져 있으면 된다! (어떻게든 도착하면 장땡) --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 45bcb28b8..d907616e3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -51,7 +51,7 @@ ___ ## 조회 결과 -- [ ] 경로 조회 시 출발역과 도착역이 연결되어 있지 않으면 에러를 출력한다. +- [X] 경로 조회 시 출발역과 도착역이 연결되어 있지 않으면 에러를 출력한다. - 경로 조회 시 총 거리, 총 소요 시간도 함께 출력한다. ## 출력 From d33152d8423700b15376289b615e250fdcb55494 Mon Sep 17 00:00:00 2001 From: JHyun0302 Date: Tue, 5 Dec 2023 09:17:46 +0900 Subject: [PATCH 15/15] =?UTF-8?q?:recycle:=20[Refactor]=20static=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=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/subway/validation/EndStationValidation.java | 2 +- src/main/java/subway/validation/MainFunctionValidation.java | 4 ++-- src/main/java/subway/validation/SelectRouteValidation.java | 4 ++-- src/main/java/subway/validation/StartStationValidation.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/validation/EndStationValidation.java b/src/main/java/subway/validation/EndStationValidation.java index ebf1afca9..3a235dbf5 100644 --- a/src/main/java/subway/validation/EndStationValidation.java +++ b/src/main/java/subway/validation/EndStationValidation.java @@ -9,7 +9,7 @@ import subway.exception.ErrorInputException; public class EndStationValidation { - public static void isBlank(String input) { + public void isBlank(String input) { if (input == null || input.trim().isEmpty()) { throw new ErrorInputException(END_STATION_CANNOT_BE_NULL_OR_EMPTY); } diff --git a/src/main/java/subway/validation/MainFunctionValidation.java b/src/main/java/subway/validation/MainFunctionValidation.java index 09934b2f6..ff84253ca 100644 --- a/src/main/java/subway/validation/MainFunctionValidation.java +++ b/src/main/java/subway/validation/MainFunctionValidation.java @@ -6,13 +6,13 @@ import subway.exception.ErrorInputException; public class MainFunctionValidation { - public static void isBlank(String input) { + public void isBlank(String input) { if (input == null || input.trim().isEmpty()) { throw new ErrorInputException(MAIN_FUNCTION_CANNOT_BE_NULL_OR_EMPTY); } } - public static String isOneOrQ(String input) { + public String isOneOrQ(String input) { if (!input.equals("1") && !input.equals("Q")) { throw new ErrorInputException(MAIN_FUNCTION_MUST_BE_ONE_OR_Q); } diff --git a/src/main/java/subway/validation/SelectRouteValidation.java b/src/main/java/subway/validation/SelectRouteValidation.java index be7bd1d08..0460ce9f2 100644 --- a/src/main/java/subway/validation/SelectRouteValidation.java +++ b/src/main/java/subway/validation/SelectRouteValidation.java @@ -6,13 +6,13 @@ import subway.exception.ErrorInputException; public class SelectRouteValidation { - public static void isBlank(String input) { + public void isBlank(String input) { if (input == null || input.trim().isEmpty()) { throw new ErrorInputException(SELECT_ROUTE_CANNOT_BE_NULL_OR_EMPTY); } } - public static String isOneOrTwoOrB(String input) { + public String isOneOrTwoOrB(String input) { if (!input.equals("1") && !input.equals("2") && !input.equals("B")) { throw new ErrorInputException(SELECT_ROUTE_MUST_BE_ONE_OR_OR_TWO_OR_B); } diff --git a/src/main/java/subway/validation/StartStationValidation.java b/src/main/java/subway/validation/StartStationValidation.java index 38491934c..64f42e842 100644 --- a/src/main/java/subway/validation/StartStationValidation.java +++ b/src/main/java/subway/validation/StartStationValidation.java @@ -8,7 +8,7 @@ import subway.exception.ErrorInputException; public class StartStationValidation { - public static void isBlank(String input) { + public void isBlank(String input) { if (input == null || input.trim().isEmpty()) { throw new ErrorInputException(START_STATION_CANNOT_BE_NULL_OR_EMPTY); }