From ae2a055b9172c93c123c32f35428f4937667c44e Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Mon, 14 Dec 2020 01:32:45 +0900 Subject: [PATCH 01/38] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..169393442 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,55 @@ +# 지하철 노선도 미션 +- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다. + +## 구현할 기능 목록 + +### 초기 설정 +- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 세팅하기 +> 아래의 사전 등록 정보로 초기 설정하기 +``` + 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. + 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. + 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점) + - 2호선: 교대역 - 강남역 - 역삼역 + - 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역 + - 신분당선: 강남역 - 양재역 - 양재시민의숲역 + ``` + +### 지하철 역 관련 기능 +- 지하철 역 등록 + - 예외: 지하철 역 이름은 2글자 이상이어야 한다. + - 예외: 지하철 역 이름은 중복될 수 없다. +- 지하철 역 삭제 + - 예외: 노선에 등록되어 있는 역은 삭제할 수 없다. +- 지하철 역 목록 조회 + +###지하철 노선 관련 기능 +- 지하철 노선 등록 + - 예외: 지하철 노선 이름은 중복될 수 없다. + - 예외: 지하철 노선 이름은 2글자 이상이어야 한다. +

+ 노선 등록 시 상행 종점역과 하행 종점역을 입력받아야 한다. + - 예외: 등록되어 있지 않은 역이 상,하행 종점역 입력으로 들어왔을 때 + +- 지하철 노선 삭제 + - 예외: 존재하지 않는 노선을 삭제하려는 경우 + +- 지하철 노선 목록 조회 + +###지하철 구간 추가 기능 +- 노선에 새로운 역을 등록하는 기능 + - 역과 역 사이: 구간 + - 구간들의 모음: 노선 + - 예외: 이미 노선에 등록되어있는 역이 입력으로 들어오는 경우 + +###지하철 구간 삭제 기능 +- 노선에 등록된 역을 제거하는 기능 + - 상행 종점 제거 시 다음 역이 상행 종점 + - 하행 종점 제거 시 이전 역이 하행 종점 + - 예외: 노선에 포함된 역이 두 개 이하인 노선의 역을 제거하려는 경우 + +###지하철 노선에 등록된 역 조회 기능 +- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다. + +###지하철 노선도 출력 기능 + From 09277e428cda4ec78a019a3eee0a9bca8d3189c9 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Mon, 14 Dec 2020 01:51:52 +0900 Subject: [PATCH 02/38] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EC=97=AD=EA=B3=BC=20=EB=85=B8=EC=84=A0=EC=9D=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20SubwayMapEdi?= =?UTF-8?q?tor=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/Application.java | 4 ++++ .../subway/controller/SubwayMapEditor.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/subway/controller/SubwayMapEditor.java diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..f2fe66546 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,14 @@ package subway; +import subway.controller.SubwayMapEditor; + import java.util.Scanner; public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); // TODO: 프로그램 구현 + SubwayMapEditor subwayMapEditor = new SubwayMapEditor(scanner); + subwayMapEditor.run(); } } diff --git a/src/main/java/subway/controller/SubwayMapEditor.java b/src/main/java/subway/controller/SubwayMapEditor.java new file mode 100644 index 000000000..2d1f70ffa --- /dev/null +++ b/src/main/java/subway/controller/SubwayMapEditor.java @@ -0,0 +1,19 @@ +package subway.controller; + +import java.util.Scanner; + +public class SubwayMapEditor { + private final Scanner scanner; + + public SubwayMapEditor(Scanner scanner) { + this.scanner = scanner; + } + + public void run() { + initializeSubwayMap(); + } + + private void initializeSubwayMap() { + + } +} From 3180f3ae484101a88ee2fab783becdb69a7b67d6 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Mon, 14 Dec 2020 12:19:05 +0900 Subject: [PATCH 03/38] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EC=97=AD?= =?UTF-8?q?=EA=B3=BC=20=EB=85=B8=EC=84=A0=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/SubwayMapEditor.java | 5 ++- src/main/java/subway/domain/SubwayMap.java | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/domain/SubwayMap.java diff --git a/src/main/java/subway/controller/SubwayMapEditor.java b/src/main/java/subway/controller/SubwayMapEditor.java index 2d1f70ffa..dfba8c6c7 100644 --- a/src/main/java/subway/controller/SubwayMapEditor.java +++ b/src/main/java/subway/controller/SubwayMapEditor.java @@ -1,9 +1,12 @@ package subway.controller; +import subway.domain.SubwayMap; + import java.util.Scanner; public class SubwayMapEditor { private final Scanner scanner; + private final SubwayMap subwayMap = new SubwayMap(); public SubwayMapEditor(Scanner scanner) { this.scanner = scanner; @@ -14,6 +17,6 @@ public void run() { } private void initializeSubwayMap() { - + subwayMap.initialize(); } } diff --git a/src/main/java/subway/domain/SubwayMap.java b/src/main/java/subway/domain/SubwayMap.java new file mode 100644 index 000000000..2d6dff6fd --- /dev/null +++ b/src/main/java/subway/domain/SubwayMap.java @@ -0,0 +1,35 @@ +package subway.domain; + +public class SubwayMap { + private static final String LINE_NUMBER_TWO = "2호선"; + private static final String LINE_NUMBER_THREE = "3호선"; + private static final String LINE_NEW_BOONDANG = "신분당선"; + private static final String GYODAE_STATION = "교대역"; + private static final String GANGNAM_STATION = "강남역"; + private static final String YEOKSAM_STATION = "역삼역"; + private static final String NAMBU_TERMINAL_STATION = "남부터미널역"; + private static final String YANGJAE_STATION = "양재역"; + private static final String YANGJAE_CITIZEN_FOREST_STATION = "양재시민의숲역"; + private static final String MAEBONG_STATION = "매봉역"; + + public void initialize() { + initializeStation(); + initializeLine(); + } + + private void initializeStation() { + StationRepository.addStation(new Station(GYODAE_STATION)); + StationRepository.addStation(new Station(GANGNAM_STATION)); + StationRepository.addStation(new Station(YEOKSAM_STATION)); + StationRepository.addStation(new Station(NAMBU_TERMINAL_STATION)); + StationRepository.addStation(new Station(YANGJAE_STATION)); + StationRepository.addStation(new Station(YANGJAE_CITIZEN_FOREST_STATION)); + StationRepository.addStation(new Station(MAEBONG_STATION)); + } + + private void initializeLine() { + LineRepository.addLine(new Line(LINE_NUMBER_TWO)); + LineRepository.addLine(new Line(LINE_NUMBER_THREE)); + LineRepository.addLine(new Line(LINE_NEW_BOONDANG)); + } +} From 0e378042aadc9a8701d47f81cffc32b156e72e2f Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Mon, 14 Dec 2020 23:04:50 +0900 Subject: [PATCH 04/38] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/SubwayMapEditor.java | 9 ++---- src/main/java/subway/view/OutputView.java | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 src/main/java/subway/view/OutputView.java diff --git a/src/main/java/subway/controller/SubwayMapEditor.java b/src/main/java/subway/controller/SubwayMapEditor.java index dfba8c6c7..8216ed799 100644 --- a/src/main/java/subway/controller/SubwayMapEditor.java +++ b/src/main/java/subway/controller/SubwayMapEditor.java @@ -1,22 +1,19 @@ package subway.controller; import subway.domain.SubwayMap; +import subway.view.OutputView; import java.util.Scanner; public class SubwayMapEditor { private final Scanner scanner; - private final SubwayMap subwayMap = new SubwayMap(); public SubwayMapEditor(Scanner scanner) { this.scanner = scanner; } public void run() { - initializeSubwayMap(); - } - - private void initializeSubwayMap() { - subwayMap.initialize(); + SubwayMap subwayMap = new SubwayMap(); + OutputView.printMainScreen(); } } diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java new file mode 100644 index 000000000..fda0deb7e --- /dev/null +++ b/src/main/java/subway/view/OutputView.java @@ -0,0 +1,30 @@ +package subway.view; + +public class OutputView { + private static final String MAIN_SCREEN = "## 메인 화면"; + private static final String MANAGE_STATION = "1. 역 관리"; + private static final String MANAGE_LINE = "2. 노선 관리"; + private static final String MANAGE_SECTION = "3. 구간 관리"; + private static final String PRINT_MAP = "4. 지하철 노선도 출력"; + private static final String QUIT = "Q. 종료"; + private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; + + private OutputView() { + } + + public static void printMainScreen() { + System.out.println(MAIN_SCREEN); + System.out.println(MANAGE_STATION); + System.out.println(MANAGE_LINE); + System.out.println(MANAGE_SECTION); + System.out.println(PRINT_MAP); + System.out.println(QUIT); + System.out.println(); + System.out.println(SELECT_MESSAGE); + } + + + + + +} From 894d20ec3e1a23e9cb62d2321c7fd2ed6a9b1422 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Mon, 14 Dec 2020 23:19:50 +0900 Subject: [PATCH 05/38] =?UTF-8?q?feat:=20=EC=9B=90=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=84=A0=ED=83=9D=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/view/InputView.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/subway/view/InputView.java diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java new file mode 100644 index 000000000..faf8732e0 --- /dev/null +++ b/src/main/java/subway/view/InputView.java @@ -0,0 +1,16 @@ +package subway.view; + +import java.util.Scanner; + +public class InputView { + private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; + + private InputView() { + } + + public static void getUserSelection(Scanner scanner) { + System.out.println(SELECT_MESSAGE); + String userInput = scanner.next(); + } + +} From 7de235a2ed8b1ed61011e49b0cf3a4a311bc07ea Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 01:01:24 +0900 Subject: [PATCH 06/38] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=9C=A0=EC=A0=80=20=EC=9E=85=EB=A0=A5=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/view/InputView.java | 36 +++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index faf8732e0..9695d876c 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -4,13 +4,47 @@ public class InputView { private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; + private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; + private static final char ONE = '1'; + private static final char FOUR = '4'; + private static final char QUIT = 'Q'; private InputView() { } public static void getUserSelection(Scanner scanner) { System.out.println(SELECT_MESSAGE); - String userInput = scanner.next(); + String userInput = scanner.nextLine(); + + try { + validateUserInput(userInput); + } catch (Exception e) { + System.out.println(e.getMessage()); + getUserSelection(scanner); + } + } + + private static void validateUserInput(String userInput) { + validateUserInputLength(userInput); + char characterizedUserInput = userInput.charAt(0); + if (!isUserInputQuit(characterizedUserInput)) { + validateUserInputRange(characterizedUserInput); + } + } + + private static void validateUserInputLength(String userInput) { + if (userInput.length() == 0) { + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + private static boolean isUserInputQuit(char userInput) { + return Character.toUpperCase(userInput) == QUIT; } + private static void validateUserInputRange(char userInput) { + if ((userInput < ONE || userInput > FOUR)) { + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } } From 555931a21f3d28989a49f19ec6776bc403263eee Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 02:43:19 +0900 Subject: [PATCH 07/38] =?UTF-8?q?fix:=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/view/InputView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 9695d876c..6f2f66217 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -6,21 +6,21 @@ public class InputView { private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; private static final char ONE = '1'; + private static final char THREE = '3'; private static final char FOUR = '4'; private static final char QUIT = 'Q'; private InputView() { } - public static void getUserSelection(Scanner scanner) { + public static void getMainScreenUserSelection(Scanner scanner) { System.out.println(SELECT_MESSAGE); String userInput = scanner.nextLine(); - try { validateUserInput(userInput); } catch (Exception e) { System.out.println(e.getMessage()); - getUserSelection(scanner); + getMainScreenUserSelection(scanner); } } @@ -33,7 +33,7 @@ private static void validateUserInput(String userInput) { } private static void validateUserInputLength(String userInput) { - if (userInput.length() == 0) { + if (userInput.length() != 1) { throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); } } From 8c8cdcf1596fb757efbe30afece97dd7f4965837 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 04:28:10 +0900 Subject: [PATCH 08/38] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=EB=B3=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20enum=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=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/domain/FunctionType.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/subway/domain/FunctionType.java diff --git a/src/main/java/subway/domain/FunctionType.java b/src/main/java/subway/domain/FunctionType.java new file mode 100644 index 000000000..728559865 --- /dev/null +++ b/src/main/java/subway/domain/FunctionType.java @@ -0,0 +1,44 @@ +package subway.domain; + +import subway.view.OutputView; + +import java.util.Arrays; + +public enum FunctionType { + MANAGE_STATION(1) { + @Override + public void execute() { + OutputView.printManageStationScreen(); + } + }, + MANAGE_LINE(2) { + @Override + public void execute() { + System.out.println("2 고름"); + } + }, + MANAGE_SECTION(3) { + @Override + public void execute() { + System.out.println("3 고름"); + } + }, + PRINT_MAP(4) { + @Override + public void execute() { + System.out.println("4 고름"); + } + }; + + private final int functionCode; + + FunctionType(int functionCode) { + this.functionCode = functionCode; + } + + public boolean isSameFunctionCode(int number) { + return this.functionCode == number; + } + + public abstract void execute(); +} From a35c34c079b4237978b1dc59741c6ed7cfa72fe3 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 10:59:04 +0900 Subject: [PATCH 09/38] =?UTF-8?q?feat:=20=EC=97=AD=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=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/view/InputView.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 6f2f66217..89da4ff1c 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -1,5 +1,7 @@ package subway.view; +import subway.domain.FunctionType; + import java.util.Scanner; public class InputView { @@ -18,12 +20,22 @@ public static void getMainScreenUserSelection(Scanner scanner) { String userInput = scanner.nextLine(); try { validateUserInput(userInput); + executeFunction(userInput); } catch (Exception e) { + System.out.println(); System.out.println(e.getMessage()); getMainScreenUserSelection(scanner); } } + private static void executeFunction(String userInput) { + for (FunctionType functionType : FunctionType.values()) { + if(functionType.isSameFunctionCode(Integer.parseInt(userInput))) { + functionType.execute(); + } + } + } + private static void validateUserInput(String userInput) { validateUserInputLength(userInput); char characterizedUserInput = userInput.charAt(0); From c2973a102fdbec0e086adfc0fd04718bb0a9dfdd Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 11:04:52 +0900 Subject: [PATCH 10/38] =?UTF-8?q?refactor:=20=EC=97=AD=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...putView.java => MainScreenOutputView.java} | 11 ++-------- .../java/subway/view/StationOutputView.java | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) rename src/main/java/subway/view/{OutputView.java => MainScreenOutputView.java} (79%) create mode 100644 src/main/java/subway/view/StationOutputView.java diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/MainScreenOutputView.java similarity index 79% rename from src/main/java/subway/view/OutputView.java rename to src/main/java/subway/view/MainScreenOutputView.java index fda0deb7e..8477bb5c8 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/MainScreenOutputView.java @@ -1,15 +1,14 @@ package subway.view; -public class OutputView { +public class MainScreenOutputView { private static final String MAIN_SCREEN = "## 메인 화면"; private static final String MANAGE_STATION = "1. 역 관리"; private static final String MANAGE_LINE = "2. 노선 관리"; private static final String MANAGE_SECTION = "3. 구간 관리"; private static final String PRINT_MAP = "4. 지하철 노선도 출력"; private static final String QUIT = "Q. 종료"; - private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; - private OutputView() { + private MainScreenOutputView() { } public static void printMainScreen() { @@ -20,11 +19,5 @@ public static void printMainScreen() { System.out.println(PRINT_MAP); System.out.println(QUIT); System.out.println(); - System.out.println(SELECT_MESSAGE); } - - - - - } diff --git a/src/main/java/subway/view/StationOutputView.java b/src/main/java/subway/view/StationOutputView.java new file mode 100644 index 000000000..315042b26 --- /dev/null +++ b/src/main/java/subway/view/StationOutputView.java @@ -0,0 +1,22 @@ +package subway.view; + +public class StationOutputView { + private static final String MANAGE_STATION_SCREEN = "## 역 관리 화면"; + private static final String REGISTER_STATION = "1. 역 등록"; + private static final String REMOVE_STATION = "2. 역 삭제"; + private static final String PRINT_STATION = "3. 역 조회"; + private static final String BACK = "B. 돌아가기"; + + private StationOutputView() { + } + + public static void printManageStationScreen() { + System.out.println(); + System.out.println(MANAGE_STATION_SCREEN); + System.out.println(REGISTER_STATION); + System.out.println(REMOVE_STATION); + System.out.println(PRINT_STATION); + System.out.println(BACK); + System.out.println(); + } +} From e02f4ae9fc7bb5a01ea4c65cf66dcd1c7ce033ea Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 11:15:13 +0900 Subject: [PATCH 11/38] =?UTF-8?q?fix:=20Q=20=EC=9E=85=EB=A0=A5=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/view/InputView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 89da4ff1c..d3695da59 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -20,7 +20,9 @@ public static void getMainScreenUserSelection(Scanner scanner) { String userInput = scanner.nextLine(); try { validateUserInput(userInput); - executeFunction(userInput); + if (!isUserInputQuit(userInput.charAt(0))) { + executeFunction(userInput); + } } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); @@ -30,7 +32,7 @@ public static void getMainScreenUserSelection(Scanner scanner) { private static void executeFunction(String userInput) { for (FunctionType functionType : FunctionType.values()) { - if(functionType.isSameFunctionCode(Integer.parseInt(userInput))) { + if (functionType.isSameFunctionCode(Integer.parseInt(userInput))) { functionType.execute(); } } From 5cc0106ff109ad5ecdbbbb3b9787aac95049f18d Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 11:18:56 +0900 Subject: [PATCH 12/38] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/view/LineOutputView.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/subway/view/LineOutputView.java diff --git a/src/main/java/subway/view/LineOutputView.java b/src/main/java/subway/view/LineOutputView.java new file mode 100644 index 000000000..e075ad644 --- /dev/null +++ b/src/main/java/subway/view/LineOutputView.java @@ -0,0 +1,22 @@ +package subway.view; + +public class LineOutputView { + private static final String MANAGE_LINE_SCREEN = "## 노선 관리 화면"; + private static final String REGISTER_LINE = "1. 노선 등록"; + private static final String REMOVE_LINE = "2. 노선 삭제"; + private static final String PRINT_LINE = "3. 노선 조회"; + private static final String BACK = "B. 돌아가기"; + + private LineOutputView() { + } + + public static void printManageLineScreen() { + System.out.println(); + System.out.println(MANAGE_LINE_SCREEN); + System.out.println(REGISTER_LINE); + System.out.println(REMOVE_LINE); + System.out.println(PRINT_LINE); + System.out.println(BACK); + System.out.println(); + } +} From a6af98af8526ea163323dadbd27906576ae7924f Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 11:22:42 +0900 Subject: [PATCH 13/38] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/view/SectionOutputView.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/subway/view/SectionOutputView.java diff --git a/src/main/java/subway/view/SectionOutputView.java b/src/main/java/subway/view/SectionOutputView.java new file mode 100644 index 000000000..d0135b3f3 --- /dev/null +++ b/src/main/java/subway/view/SectionOutputView.java @@ -0,0 +1,20 @@ +package subway.view; + +public class SectionOutputView { + private static final String MANAGE_SECTION_SCREEN = "## 구간 관리 화면"; + private static final String REGISTER_SECTION = "1. 구간 등록"; + private static final String REMOVE_SECTION = "2. 구간 삭제"; + private static final String BACK = "B. 돌아가기"; + + private SectionOutputView() { + } + + public static void printManageSectionScreen() { + System.out.println(); + System.out.println(MANAGE_SECTION_SCREEN); + System.out.println(REGISTER_SECTION); + System.out.println(REMOVE_SECTION); + System.out.println(BACK); + System.out.println(); + } +} From 0c844f090557dae29e3a09dff0b6966c1271a465 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 17:02:12 +0900 Subject: [PATCH 14/38] =?UTF-8?q?feat:=20=EC=97=AD=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EA=B8=B0=EB=8A=A5=EB=B3=84=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20enum=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainScreenFunctionType.java} | 16 ++++---- .../type/StationScreenFunctionType.java | 38 +++++++++++++++++++ ...nputView.java => MainScreenInputView.java} | 0 3 files changed, 46 insertions(+), 8 deletions(-) rename src/main/java/subway/{domain/FunctionType.java => type/MainScreenFunctionType.java} (66%) create mode 100644 src/main/java/subway/type/StationScreenFunctionType.java rename src/main/java/subway/view/{InputView.java => MainScreenInputView.java} (100%) diff --git a/src/main/java/subway/domain/FunctionType.java b/src/main/java/subway/type/MainScreenFunctionType.java similarity index 66% rename from src/main/java/subway/domain/FunctionType.java rename to src/main/java/subway/type/MainScreenFunctionType.java index 728559865..929c27528 100644 --- a/src/main/java/subway/domain/FunctionType.java +++ b/src/main/java/subway/type/MainScreenFunctionType.java @@ -1,33 +1,33 @@ package subway.domain; -import subway.view.OutputView; - -import java.util.Arrays; +import subway.view.LineOutputView; +import subway.view.SectionOutputView; +import subway.view.StationOutputView; public enum FunctionType { MANAGE_STATION(1) { @Override public void execute() { - OutputView.printManageStationScreen(); + StationOutputView.printManageStationScreen(); } }, MANAGE_LINE(2) { @Override public void execute() { - System.out.println("2 고름"); + LineOutputView.printManageLineScreen(); } }, MANAGE_SECTION(3) { @Override public void execute() { - System.out.println("3 고름"); + SectionOutputView.printManageSectionScreen(); } }, PRINT_MAP(4) { - @Override + @Override // TODO 지하철 노선도 출력 public void execute() { System.out.println("4 고름"); - } + } }; private final int functionCode; diff --git a/src/main/java/subway/type/StationScreenFunctionType.java b/src/main/java/subway/type/StationScreenFunctionType.java new file mode 100644 index 000000000..fe00d8452 --- /dev/null +++ b/src/main/java/subway/type/StationScreenFunctionType.java @@ -0,0 +1,38 @@ +package subway.type; + +import subway.view.LineOutputView; +import subway.view.SectionOutputView; +import subway.view.StationInputView; + +public enum StationScreenFunctionType { + REGISTER_STATION(1) { + @Override + public void execute() { + System.out.println(("1")); + } + }, + REMOVE_STATION(2) { + @Override + public void execute() { + System.out.println("2"); + } + }, + PRINT_STATION(3) { + @Override + public void execute() { + System.out.println("3"); + } + }; + + private final int functionCode; + + StationScreenFunctionType(int functionCode) { + this.functionCode = functionCode; + } + + public boolean isSameFunctionCode(int number) { + return this.functionCode == number; + } + + public abstract void execute(); +} diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/MainScreenInputView.java similarity index 100% rename from src/main/java/subway/view/InputView.java rename to src/main/java/subway/view/MainScreenInputView.java From 8f5f686a3304512c141d276ad4aa8faac2723490 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 18:09:37 +0900 Subject: [PATCH 15/38] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/view/StationInputView.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/main/java/subway/view/StationInputView.java diff --git a/src/main/java/subway/view/StationInputView.java b/src/main/java/subway/view/StationInputView.java new file mode 100644 index 000000000..2a906d724 --- /dev/null +++ b/src/main/java/subway/view/StationInputView.java @@ -0,0 +1,130 @@ +package subway.view; + +import subway.type.StationScreenFunctionType; + +import java.util.Scanner; + +public class StationInputView { + private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; + private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; + private static final String REGISTER_STATION_MESSAGE = "## 등록할 역 이름을 입력하세요."; + private static final String REMOVE_STATION_MESSAGE = "## 삭제할 역 이름을 입력하세요."; + private static final String STATION_NAME_LENGTH_MESSAGE = "[ERROR] 역 이름은 두 글자 이상이어야 합니다."; + private static final String STATION_NAME_INCLUDE_NOT_KOREAN_MESSAGE = "[ERROR] 역 이름은 한글이어야 합니다."; + private static final String STATION_NAME_SHOULD_BE_ENDED_WITH_STATION_MESSAGE = "[ERROR] 역 이름 맨 뒤에 '역'을 붙여주세요."; + private static final String STATION_NAME_INCLUDE_NUMBER_MESSAGE = "[ERROR] 역 이름에 숫자를 포함하면 안 됩니다."; + private static final String STATION_NAME_INCLUDE_SPACE_MESSAGE = "[ERROR] 역 이름에 공백을 포함하면 안 됩니다."; + private static final char ONE = '1'; + private static final char MINIMUM_STATION_NAME_LENGTH = 2; + private static final char THREE = '3'; + private static final char BACK = 'B'; + private static final String SPACE = " "; + + + private static final Scanner scanner = new Scanner(System.in); + + private StationInputView() { + } + + public static void getStationScreenUserSelection() { + StationOutputView.printManageStationScreen(); + System.out.println(SELECT_MESSAGE); + String userInput = scanner.nextLine(); + try { + validateUserInput(userInput); + if (isUserInputBACK(userInput.charAt(0))) { + MainScreenInputView.getMainScreenUserSelection(scanner); + return; + } + executeFunction(userInput); + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + getStationScreenUserSelection(); + } + } + + private static void executeFunction(String userInput) { + for (StationScreenFunctionType stationScreenFunctionType : StationScreenFunctionType.values()) { + if (stationScreenFunctionType.isSameFunctionCode(Integer.parseInt(userInput))) { + stationScreenFunctionType.execute(); + } + } + } + + private static void validateUserInput(String userInput) { + validateUserInputLength(userInput); + char characterizedUserInput = userInput.charAt(0); + if (!isUserInputBACK(characterizedUserInput)) { + validateUserInputRange(characterizedUserInput); + } + } + + private static void validateUserInputLength(String userInput) { + if (userInput.length() != 1) { + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + private static boolean isUserInputBACK(char userInput) { + return Character.toUpperCase(userInput) == BACK; + } + + private static void validateUserInputRange(char userInput) { + if ((userInput < ONE || userInput > THREE)) { + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + public static void getStationName() { + System.out.println(REGISTER_STATION_MESSAGE); + String stationName = scanner.nextLine(); + try { + validateStationName(stationName); + // TODO 역 추가 + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + getStationName(); + } + } + + private static void validateStationName(String stationName) { + validateStationNameLength(stationName); + validateStationNameEndedWithStation(stationName); + validateStationNameHasNumber(stationName); + validateStationNameHasOnlyKorean(stationName); + validateStationNameHasSpace(stationName); + } + + private static void validateStationNameLength(String stationName) { + if (stationName.length() < MINIMUM_STATION_NAME_LENGTH) { + throw new IllegalArgumentException(STATION_NAME_LENGTH_MESSAGE); + } + } + + private static void validateStationNameEndedWithStation(String stationName) { + if (!(stationName.charAt(stationName.length() - 1) == '역')) { + throw new IllegalArgumentException(STATION_NAME_SHOULD_BE_ENDED_WITH_STATION_MESSAGE); + } + } + + private static void validateStationNameHasNumber(String stationName) { + if (stationName.matches(".*[0-9].*")) { + throw new IllegalArgumentException(STATION_NAME_INCLUDE_NUMBER_MESSAGE); + } + } + + private static void validateStationNameHasOnlyKorean(String stationName) { + if (!stationName.matches("^[가-힣]*$")) { + throw new IllegalArgumentException(STATION_NAME_INCLUDE_NOT_KOREAN_MESSAGE); + } + } + + private static void validateStationNameHasSpace(String stationName) { + if (stationName.contains(SPACE)) { + throw new IllegalArgumentException(STATION_NAME_INCLUDE_SPACE_MESSAGE); + } + } + +} From 70287508c68d9f04e4de6cd788930e77e95018e4 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 18:10:46 +0900 Subject: [PATCH 16/38] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=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/view/StationInputView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/subway/view/StationInputView.java b/src/main/java/subway/view/StationInputView.java index 2a906d724..bcf864c4a 100644 --- a/src/main/java/subway/view/StationInputView.java +++ b/src/main/java/subway/view/StationInputView.java @@ -1,5 +1,7 @@ package subway.view; +import subway.domain.Station; +import subway.domain.StationRepository; import subway.type.StationScreenFunctionType; import java.util.Scanner; @@ -82,6 +84,7 @@ public static void getStationName() { try { validateStationName(stationName); // TODO 역 추가 + StationRepository.addStation(new Station(stationName)); } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); From b2967a5d96abaae1526f00ae926532c6ff261d6f Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 18:18:21 +0900 Subject: [PATCH 17/38] =?UTF-8?q?feat:=20=EC=A4=91=EB=B3=B5=EB=90=9C=20?= =?UTF-8?q?=EC=97=AD=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/view/StationInputView.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/view/StationInputView.java b/src/main/java/subway/view/StationInputView.java index bcf864c4a..fa0e4e295 100644 --- a/src/main/java/subway/view/StationInputView.java +++ b/src/main/java/subway/view/StationInputView.java @@ -16,6 +16,7 @@ public class StationInputView { private static final String STATION_NAME_SHOULD_BE_ENDED_WITH_STATION_MESSAGE = "[ERROR] 역 이름 맨 뒤에 '역'을 붙여주세요."; private static final String STATION_NAME_INCLUDE_NUMBER_MESSAGE = "[ERROR] 역 이름에 숫자를 포함하면 안 됩니다."; private static final String STATION_NAME_INCLUDE_SPACE_MESSAGE = "[ERROR] 역 이름에 공백을 포함하면 안 됩니다."; + private static final String STATION_NAME_HAS_DUPLICATION_MESSAGE = "[ERROR] 이미 등록되어 있는 역입니다."; private static final char ONE = '1'; private static final char MINIMUM_STATION_NAME_LENGTH = 2; private static final char THREE = '3'; @@ -83,7 +84,6 @@ public static void getStationName() { String stationName = scanner.nextLine(); try { validateStationName(stationName); - // TODO 역 추가 StationRepository.addStation(new Station(stationName)); } catch (Exception e) { System.out.println(); @@ -98,6 +98,7 @@ private static void validateStationName(String stationName) { validateStationNameHasNumber(stationName); validateStationNameHasOnlyKorean(stationName); validateStationNameHasSpace(stationName); + validateStationNameHasDuplication(stationName); } private static void validateStationNameLength(String stationName) { @@ -130,4 +131,13 @@ private static void validateStationNameHasSpace(String stationName) { } } + private static void validateStationNameHasDuplication(String stationName) { + for (Station station : StationRepository.stations()) { + System.out.println(station.getName()); + if (station.isSameName(stationName)) { + throw new IllegalArgumentException(STATION_NAME_HAS_DUPLICATION_MESSAGE); + } + } + } + } From e86d3f7326032e8c77f00dd3e14482977b9aaa98 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 18:39:38 +0900 Subject: [PATCH 18/38] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/view/StationInputView.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/subway/view/StationInputView.java b/src/main/java/subway/view/StationInputView.java index fa0e4e295..94c6d75b3 100644 --- a/src/main/java/subway/view/StationInputView.java +++ b/src/main/java/subway/view/StationInputView.java @@ -10,6 +10,7 @@ public class StationInputView { private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; private static final String REGISTER_STATION_MESSAGE = "## 등록할 역 이름을 입력하세요."; + private static final String REGISTER_COMPLETE_MESSAGE = "[INFO] 지하철 역이 등록되었습니다."; private static final String REMOVE_STATION_MESSAGE = "## 삭제할 역 이름을 입력하세요."; private static final String STATION_NAME_LENGTH_MESSAGE = "[ERROR] 역 이름은 두 글자 이상이어야 합니다."; private static final String STATION_NAME_INCLUDE_NOT_KOREAN_MESSAGE = "[ERROR] 역 이름은 한글이어야 합니다."; @@ -23,7 +24,6 @@ public class StationInputView { private static final char BACK = 'B'; private static final String SPACE = " "; - private static final Scanner scanner = new Scanner(System.in); private StationInputView() { @@ -79,16 +79,30 @@ private static void validateUserInputRange(char userInput) { } } - public static void getStationName() { + public static void registerStation() { System.out.println(REGISTER_STATION_MESSAGE); String stationName = scanner.nextLine(); try { validateStationName(stationName); StationRepository.addStation(new Station(stationName)); + System.out.println(REGISTER_COMPLETE_MESSAGE); + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + registerStation(); + } + } + + public static void removeStation() { + System.out.println(REMOVE_STATION_MESSAGE); + String stationName = scanner.nextLine(); + try { + //validateStationName(stationName); // TODO 노선에 등록되어있는 지 확인할 것 + StationRepository.deleteStation(stationName); } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); - getStationName(); + removeStation(); } } @@ -133,11 +147,9 @@ private static void validateStationNameHasSpace(String stationName) { private static void validateStationNameHasDuplication(String stationName) { for (Station station : StationRepository.stations()) { - System.out.println(station.getName()); if (station.isSameName(stationName)) { throw new IllegalArgumentException(STATION_NAME_HAS_DUPLICATION_MESSAGE); } } } - } From 1f04b3d58ef4a45ea2d0995a823c4bc591475d06 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 18:59:19 +0900 Subject: [PATCH 19/38] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85=20=EA=B8=B0=EB=8A=A5=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/domain/SubwayMap.java | 64 ++++++++++++++++++---- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/src/main/java/subway/domain/SubwayMap.java b/src/main/java/subway/domain/SubwayMap.java index 2d6dff6fd..56f84a456 100644 --- a/src/main/java/subway/domain/SubwayMap.java +++ b/src/main/java/subway/domain/SubwayMap.java @@ -12,24 +12,64 @@ public class SubwayMap { private static final String YANGJAE_CITIZEN_FOREST_STATION = "양재시민의숲역"; private static final String MAEBONG_STATION = "매봉역"; + private Line lineNumberTwo; + private Line lineNumberThree; + private Line lineNewBoondang; + private Station gyodaeStation; + private Station gangnamStation; + private Station yeoksamStation; + private Station nambuTerminalStation; + private Station yangjaeStation; + private Station yangjaeCitizenForestStation; + private Station maebongStation; + + public SubwayMap() { + initialize(); + } + public void initialize() { - initializeStation(); initializeLine(); + initializeStation(); + initializeMap(); + } + + private void initializeLine() { + lineNumberTwo = new Line(LINE_NUMBER_TWO); + lineNumberThree = new Line(LINE_NUMBER_THREE); + lineNewBoondang = new Line(LINE_NEW_BOONDANG); + LineRepository.addLine(lineNumberTwo); + LineRepository.addLine(lineNumberThree); + LineRepository.addLine(lineNewBoondang); } private void initializeStation() { - StationRepository.addStation(new Station(GYODAE_STATION)); - StationRepository.addStation(new Station(GANGNAM_STATION)); - StationRepository.addStation(new Station(YEOKSAM_STATION)); - StationRepository.addStation(new Station(NAMBU_TERMINAL_STATION)); - StationRepository.addStation(new Station(YANGJAE_STATION)); - StationRepository.addStation(new Station(YANGJAE_CITIZEN_FOREST_STATION)); - StationRepository.addStation(new Station(MAEBONG_STATION)); + gyodaeStation = new Station(GYODAE_STATION); + gangnamStation = new Station(GANGNAM_STATION); + yeoksamStation = new Station(YEOKSAM_STATION); + nambuTerminalStation = new Station(NAMBU_TERMINAL_STATION); + yangjaeStation = new Station(YANGJAE_STATION); + yangjaeCitizenForestStation = new Station(YANGJAE_CITIZEN_FOREST_STATION); + maebongStation = new Station(MAEBONG_STATION); + StationRepository.addStation(gyodaeStation); + StationRepository.addStation(gangnamStation); + StationRepository.addStation(yeoksamStation); + StationRepository.addStation(nambuTerminalStation); + StationRepository.addStation(yangjaeStation); + StationRepository.addStation(yangjaeCitizenForestStation); + StationRepository.addStation(maebongStation); } - private void initializeLine() { - LineRepository.addLine(new Line(LINE_NUMBER_TWO)); - LineRepository.addLine(new Line(LINE_NUMBER_THREE)); - LineRepository.addLine(new Line(LINE_NEW_BOONDANG)); + private void initializeMap() { + lineNumberTwo.registerStation(gyodaeStation); + lineNumberTwo.registerStation(gangnamStation); + lineNumberTwo.registerStation(yeoksamStation); + lineNumberThree.registerStation(gyodaeStation); + lineNumberThree.registerStation(nambuTerminalStation); + lineNumberThree.registerStation(yangjaeStation); + lineNumberThree.registerStation(maebongStation); + lineNewBoondang.registerStation(gangnamStation); + lineNewBoondang.registerStation(yangjaeStation); + lineNewBoondang.registerStation(yangjaeCitizenForestStation); } + } From 75057fbca009a620d886efe7219604bd97dd1626 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 19:10:10 +0900 Subject: [PATCH 20/38] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=EB=8F=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/domain/Line.java | 17 ++++++++++++++++- src/main/java/subway/domain/LineRepository.java | 12 ++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..450ae8c62 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,7 +1,17 @@ package subway.domain; +import java.util.ArrayList; +import java.util.List; + public class Line { + private static final String INFO = "[INFO] "; + private String name; + private List stationsOnLine = new ArrayList<>(); + + public void registerStation(Station station) { + stationsOnLine.add(station); + } public Line(String name) { this.name = name; @@ -11,5 +21,10 @@ public String getName() { return name; } - // 추가 기능 구현 + public void printStations() { + for (Station station : stationsOnLine) { + System.out.println(INFO + station.getName()); + } + System.out.println(); + } } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 49132ddb6..2d948fa3b 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -6,6 +6,9 @@ import java.util.Objects; public class LineRepository { + private static final String INFO = "[INFO] "; + private static final String INFO_WITH_BORDER = "[INFO] ---"; + private static final List lines = new ArrayList<>(); public static List lines() { @@ -13,10 +16,19 @@ public static List lines() { } public static void addLine(Line line) { + // TODO 노선 이름 중복 확인할 것 lines.add(line); } public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } + + public static void printMap() { + for(Line line : lines) { + System.out.println(INFO + line.getName()); + System.out.println(INFO_WITH_BORDER); + line.printStations(); + } + } } From 6e0e0888a75574f1e74927eb8c54a00a476e23c8 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 19:50:26 +0900 Subject: [PATCH 21/38] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=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/view/LineInputView.java | 163 +++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 src/main/java/subway/view/LineInputView.java diff --git a/src/main/java/subway/view/LineInputView.java b/src/main/java/subway/view/LineInputView.java new file mode 100644 index 000000000..a1a79bc50 --- /dev/null +++ b/src/main/java/subway/view/LineInputView.java @@ -0,0 +1,163 @@ +package subway.view; + +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.type.LineScreenFunctionType; + +import java.util.Scanner; + +public class LineInputView { + private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; + private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; + private static final String REGISTER_LINE_MESSAGE = "## 등록할 노선 이름을 입력하세요."; + private static final String REGISTER_COMPLETE_MESSAGE = "[INFO] 지하철 노선이 등록되었습니다."; + private static final String REMOVE_LINE_MESSAGE = "## 삭제할 노선 이름을 입력하세요."; + private static final char LINE_NAME_ENDED_WITH = '선'; + private static final String LINE_NAME_LENGTH_MESSAGE = "[ERROR] 노선 이름은 두 글자 이상이어야 합니다."; + private static final String LINE_NAME_INCLUDE_NOT_KOREAN_MESSAGE = "[ERROR] 노선 이름은 한글이어야 합니다."; + private static final String LINE_NAME_SHOULD_BE_ENDED_WITH_LINE_MESSAGE = "[ERROR] 노선 이름 맨 뒤에 '선'을 붙여주세요."; + private static final String LINE_NAME_INCLUDE_NUMBER_MESSAGE = "[ERROR] 노선 이름에 숫자를 포함하면 안 됩니다."; + private static final String LINE_NAME_INCLUDE_SPACE_MESSAGE = "[ERROR] 노선 이름에 공백을 포함하면 안 됩니다."; + private static final String LINE_NAME_HAS_DUPLICATION_MESSAGE = "[ERROR] 이미 등록되어 있는 노선입니다."; + private static final char ONE = '1'; + private static final int INTEGER_ONE = 1; + private static final char MINIMUM_LINE_NAME_LENGTH = 2; + private static final char THREE = '3'; + private static final char BACK = 'B'; + private static final String SPACE = " "; + private static final int FIRST_CHARACTER = 0; + private static final String KOREAN_REGULAR_EXPRESSION = "^[가-힣]*$"; + private static final String HAS_NUMBER_REGULAR_EXPRESSION = ".*[0-9].*"; + + + private static final Scanner scanner = new Scanner(System.in); + + private LineInputView() { + + } + + public static void getLineScreenUserSelection() { + LineOutputView.printManageLineScreen(); + System.out.println(SELECT_MESSAGE); + String userInput = scanner.nextLine(); + try { + validateUserInput(userInput); + if (isUserInputBack(userInput.charAt(FIRST_CHARACTER))) { + MainScreenInputView.getMainScreenUserSelection(scanner); + return; + } + executeFunction(userInput); + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + getLineScreenUserSelection(); + } + } + + private static void executeFunction(String userInput) { + for (LineScreenFunctionType lineScreenFunctionType : LineScreenFunctionType.values()) { + if (lineScreenFunctionType.isSameFunctionCode(Integer.parseInt(userInput))) { + lineScreenFunctionType.execute(); + } + } + } + + private static void validateUserInput(String userInput) { + validateUserInputLength(userInput); + char characterizedUserInput = userInput.charAt(FIRST_CHARACTER); + if (!isUserInputBack(characterizedUserInput)) { + validateUserInputRange(characterizedUserInput); + } + } + + private static void validateUserInputLength(String userInput) { + if (userInput.length() != INTEGER_ONE) { + System.out.println(userInput.length()); + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + private static boolean isUserInputBack(char userInput) { + return Character.toUpperCase(userInput) == BACK; + } + + private static void validateUserInputRange(char userInput) { + if ((userInput < ONE || userInput > THREE)) { + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + public static void registerLine() { + System.out.println(REGISTER_LINE_MESSAGE); + String lineName = scanner.nextLine(); + try { + validateLineName(lineName); + LineRepository.addLine(new Line(lineName)); + System.out.println(REGISTER_COMPLETE_MESSAGE); + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + registerLine(); + } + } + + public static void removeLine() { + System.out.println(REMOVE_LINE_MESSAGE); + String lineName = scanner.nextLine(); + try { + //validateLineName(lineName); // TODO 노선의 역 개수 확인하고 삭제.. + LineRepository.deleteLineByName(lineName); + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + removeLine(); + } + } + + private static void validateLineName(String lineName) { + validateLineNameLength(lineName); + validateLineNameEndedWithLine(lineName); + validateLineNameHasNumber(lineName); + validateLineNameHasOnlyKorean(lineName); + validateLineNameHasSpace(lineName); + validateLineNameHasDuplication(lineName); + } + + private static void validateLineNameLength(String lineName) { + if (lineName.length() < MINIMUM_LINE_NAME_LENGTH) { + throw new IllegalArgumentException(LINE_NAME_LENGTH_MESSAGE); + } + } + + private static void validateLineNameEndedWithLine(String lineName) { + if (!(lineName.charAt(lineName.length() - INTEGER_ONE) == LINE_NAME_ENDED_WITH)) { + throw new IllegalArgumentException(LINE_NAME_SHOULD_BE_ENDED_WITH_LINE_MESSAGE); + } + } + + private static void validateLineNameHasNumber(String lineName) { + if (lineName.matches(HAS_NUMBER_REGULAR_EXPRESSION)) { + throw new IllegalArgumentException(LINE_NAME_INCLUDE_NUMBER_MESSAGE); + } + } + + private static void validateLineNameHasOnlyKorean(String lineName) { + if (!lineName.matches(KOREAN_REGULAR_EXPRESSION)) { + throw new IllegalArgumentException(LINE_NAME_INCLUDE_NOT_KOREAN_MESSAGE); + } + } + + private static void validateLineNameHasSpace(String lineName) { + if (lineName.contains(SPACE)) { + throw new IllegalArgumentException(LINE_NAME_INCLUDE_SPACE_MESSAGE); + } + } + + private static void validateLineNameHasDuplication(String lineName) { + for (Line line : LineRepository.lines()) { + if (line.isSameName(lineName)) { + throw new IllegalArgumentException(LINE_NAME_HAS_DUPLICATION_MESSAGE); + } + } + } +} From 1e8ba07ea83c859e98baa20c48f2f24461fb4041 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 20:48:54 +0900 Subject: [PATCH 22/38] =?UTF-8?q?=EB=85=B8=EC=84=A0=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=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/view/LineInputView.java | 49 +++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/view/LineInputView.java b/src/main/java/subway/view/LineInputView.java index a1a79bc50..b520a49f0 100644 --- a/src/main/java/subway/view/LineInputView.java +++ b/src/main/java/subway/view/LineInputView.java @@ -2,6 +2,8 @@ import subway.domain.Line; import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; import subway.type.LineScreenFunctionType; import java.util.Scanner; @@ -92,7 +94,14 @@ public static void registerLine() { String lineName = scanner.nextLine(); try { validateLineName(lineName); - LineRepository.addLine(new Line(lineName)); + // TODO 상행 종점 입력, 하행 종점 입력받고 존재하는 Station인지 확인하고 add + Line newLine = new Line(lineName); + Station upwardTerminalStation = getUpwardTerminalStation(); + Station downwardTerminalStation = getDownwardTerminalStation(); + newLine.registerStation(upwardTerminalStation); + newLine.registerStation(downwardTerminalStation); + validateAreStationSame(upwardTerminalStation, downwardTerminalStation); + LineRepository.addLine(newLine); System.out.println(REGISTER_COMPLETE_MESSAGE); } catch (Exception e) { System.out.println(); @@ -101,6 +110,44 @@ public static void registerLine() { } } + private static void validateAreStationSame(Station upwardTerminalStation, Station downwardTerminalStation) { + if (upwardTerminalStation.equals(downwardTerminalStation)) { + throw new IllegalArgumentException("상행 종점과 하행 종점끼리 같은 역일 수 없습니다."); + } + } + + private static Station getUpwardTerminalStation() { + System.out.println("## 등록할 노선의 상행 종점역 이름을 입력하세요."); + String upwardTerminalStation = scanner.nextLine(); + try { + validateStationExistence(upwardTerminalStation); + + } catch (Exception e) { + System.out.println(e.getMessage()); + getUpwardTerminalStation(); + } + return new Station(upwardTerminalStation); + } + + private static Station getDownwardTerminalStation() { + System.out.println("## 등록할 노선의 하행 종점역 이름을 입력하세요."); + String downwardTerminalStation = scanner.nextLine(); + try { + validateStationExistence(downwardTerminalStation); + + } catch (Exception e) { + System.out.println(e.getMessage()); + getDownwardTerminalStation(); + } + return new Station(downwardTerminalStation); + } + + private static void validateStationExistence(String upwardTerminalStation) { + if (!StationRepository.isStationExist(upwardTerminalStation)) { + throw new IllegalArgumentException("존재하지 않는 역입니다."); + } + } + public static void removeLine() { System.out.println(REMOVE_LINE_MESSAGE); String lineName = scanner.nextLine(); From ff3ec72e99f88f31678aef6ae61969d86837c249 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:20:47 +0900 Subject: [PATCH 23/38] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/view/StationInputView.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/subway/view/StationInputView.java b/src/main/java/subway/view/StationInputView.java index 94c6d75b3..ae429588e 100644 --- a/src/main/java/subway/view/StationInputView.java +++ b/src/main/java/subway/view/StationInputView.java @@ -1,5 +1,7 @@ package subway.view; +import subway.domain.Line; +import subway.domain.LineRepository; import subway.domain.Station; import subway.domain.StationRepository; import subway.type.StationScreenFunctionType; @@ -12,6 +14,7 @@ public class StationInputView { private static final String REGISTER_STATION_MESSAGE = "## 등록할 역 이름을 입력하세요."; private static final String REGISTER_COMPLETE_MESSAGE = "[INFO] 지하철 역이 등록되었습니다."; private static final String REMOVE_STATION_MESSAGE = "## 삭제할 역 이름을 입력하세요."; + private static final char STATION_NAME_ENDED_WITH = '역'; private static final String STATION_NAME_LENGTH_MESSAGE = "[ERROR] 역 이름은 두 글자 이상이어야 합니다."; private static final String STATION_NAME_INCLUDE_NOT_KOREAN_MESSAGE = "[ERROR] 역 이름은 한글이어야 합니다."; private static final String STATION_NAME_SHOULD_BE_ENDED_WITH_STATION_MESSAGE = "[ERROR] 역 이름 맨 뒤에 '역'을 붙여주세요."; @@ -23,6 +26,9 @@ public class StationInputView { private static final char THREE = '3'; private static final char BACK = 'B'; private static final String SPACE = " "; + private static final int FIRST_CHARACTER = 0; + private static final String KOREAN_REGULAR_EXPRESSION = "^[가-힣]*$"; + private static final String HAS_NUMBER_REGULAR_EXPRESSION = ".*[0-9].*"; private static final Scanner scanner = new Scanner(System.in); @@ -35,7 +41,7 @@ public static void getStationScreenUserSelection() { String userInput = scanner.nextLine(); try { validateUserInput(userInput); - if (isUserInputBACK(userInput.charAt(0))) { + if (isUserInputBack(userInput.charAt(FIRST_CHARACTER))) { MainScreenInputView.getMainScreenUserSelection(scanner); return; } @@ -57,8 +63,8 @@ private static void executeFunction(String userInput) { private static void validateUserInput(String userInput) { validateUserInputLength(userInput); - char characterizedUserInput = userInput.charAt(0); - if (!isUserInputBACK(characterizedUserInput)) { + char characterizedUserInput = userInput.charAt(FIRST_CHARACTER); + if (!isUserInputBack(characterizedUserInput)) { validateUserInputRange(characterizedUserInput); } } @@ -69,7 +75,7 @@ private static void validateUserInputLength(String userInput) { } } - private static boolean isUserInputBACK(char userInput) { + private static boolean isUserInputBack(char userInput) { return Character.toUpperCase(userInput) == BACK; } @@ -96,13 +102,21 @@ public static void registerStation() { public static void removeStation() { System.out.println(REMOVE_STATION_MESSAGE); String stationName = scanner.nextLine(); - try { - //validateStationName(stationName); // TODO 노선에 등록되어있는 지 확인할 것 + try { // TODO 노선에 등록되어있는 지 확인할 것 + validateStationRegisteredOnLine(stationName); StationRepository.deleteStation(stationName); } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); - removeStation(); + getStationScreenUserSelection(); + } + } + + private static void validateStationRegisteredOnLine(String stationName) { + for (Line line : LineRepository.lines()) { + if (line.isStationRegistered(stationName)) { + throw new IllegalArgumentException("[ERROR] 노선에 등록되어 있는 역이므로 삭제가 불가능합니다."); + } } } @@ -122,19 +136,19 @@ private static void validateStationNameLength(String stationName) { } private static void validateStationNameEndedWithStation(String stationName) { - if (!(stationName.charAt(stationName.length() - 1) == '역')) { + if (!(stationName.charAt(stationName.length() - 1) == STATION_NAME_ENDED_WITH)) { throw new IllegalArgumentException(STATION_NAME_SHOULD_BE_ENDED_WITH_STATION_MESSAGE); } } private static void validateStationNameHasNumber(String stationName) { - if (stationName.matches(".*[0-9].*")) { + if (stationName.matches(HAS_NUMBER_REGULAR_EXPRESSION)) { throw new IllegalArgumentException(STATION_NAME_INCLUDE_NUMBER_MESSAGE); } } private static void validateStationNameHasOnlyKorean(String stationName) { - if (!stationName.matches("^[가-힣]*$")) { + if (!stationName.matches(KOREAN_REGULAR_EXPRESSION)) { throw new IllegalArgumentException(STATION_NAME_INCLUDE_NOT_KOREAN_MESSAGE); } } From f1e87eb870d2473cdd18daaff0c4b426193a66fd Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:29:25 +0900 Subject: [PATCH 24/38] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/type/LineScreenFunctionType.java | 36 +++++++++++++++++++ src/main/java/subway/view/LineInputView.java | 4 +-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/type/LineScreenFunctionType.java diff --git a/src/main/java/subway/type/LineScreenFunctionType.java b/src/main/java/subway/type/LineScreenFunctionType.java new file mode 100644 index 000000000..fdb7ee335 --- /dev/null +++ b/src/main/java/subway/type/LineScreenFunctionType.java @@ -0,0 +1,36 @@ +package subway.type; + +import subway.view.LineInputView; + +public enum LineScreenFunctionType { + REGISTER_STATION(1) { + @Override + public void execute() { + LineInputView.registerLine(); + } + }, + REMOVE_STATION(2) { + @Override + public void execute() { + LineInputView.removeLine(); + } + }, + PRINT_STATION(3) { + @Override + public void execute() { + System.out.println("3"); + } + }; + + private final int functionCode; + + LineScreenFunctionType(int functionCode) { + this.functionCode = functionCode; + } + + public boolean isSameFunctionCode(int number) { + return this.functionCode == number; + } + + public abstract void execute(); +} diff --git a/src/main/java/subway/view/LineInputView.java b/src/main/java/subway/view/LineInputView.java index b520a49f0..2bce03572 100644 --- a/src/main/java/subway/view/LineInputView.java +++ b/src/main/java/subway/view/LineInputView.java @@ -152,12 +152,12 @@ public static void removeLine() { System.out.println(REMOVE_LINE_MESSAGE); String lineName = scanner.nextLine(); try { - //validateLineName(lineName); // TODO 노선의 역 개수 확인하고 삭제.. + LineRepository.isLineExist(lineName); LineRepository.deleteLineByName(lineName); } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); - removeLine(); + getLineScreenUserSelection(); } } From 5d70d0ee330ba61077fad0bbd48d759596439c94 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:36:11 +0900 Subject: [PATCH 25/38] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=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/domain/Line.java | 13 ++++++++++ .../java/subway/domain/LineRepository.java | 24 ++++++++++++++++++- .../subway/type/LineScreenFunctionType.java | 3 ++- src/main/java/subway/view/LineInputView.java | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 450ae8c62..4656bf38f 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -27,4 +27,17 @@ public void printStations() { } System.out.println(); } + + public boolean isSameName(String lineName) { + return this.name.equals(lineName); + } + + public boolean isStationRegistered(String stationName) { + for (Station station : stationsOnLine) { + if (station.getName().equals(stationName)) { + return true; + } + } + return false; + } } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 2d948fa3b..dd3f8778d 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -8,6 +8,8 @@ public class LineRepository { private static final String INFO = "[INFO] "; private static final String INFO_WITH_BORDER = "[INFO] ---"; + private static final String LINE_LIST = "## 노선 목록"; + private static final String SUBWAY_MAP = "## 지하철 노선도"; private static final List lines = new ArrayList<>(); @@ -25,10 +27,30 @@ public static boolean deleteLineByName(String name) { } public static void printMap() { - for(Line line : lines) { + System.out.println(); + System.out.println(SUBWAY_MAP); + for (Line line : lines) { System.out.println(INFO + line.getName()); System.out.println(INFO_WITH_BORDER); line.printStations(); } } + + public static void isLineExist(String lineName) { + boolean flag = false; + for (Line line : lines) { + flag = line.getName().equals(lineName); + } + if (!flag) { + throw new IllegalArgumentException("[ERROR] 존재하지 않는 노선입니다."); + } + } + + public static void printLines() { + System.out.println(LINE_LIST); + for (Line line : lines) { + System.out.println(INFO + line.getName()); + } + System.out.println(); + } } diff --git a/src/main/java/subway/type/LineScreenFunctionType.java b/src/main/java/subway/type/LineScreenFunctionType.java index fdb7ee335..e0cc9c1ac 100644 --- a/src/main/java/subway/type/LineScreenFunctionType.java +++ b/src/main/java/subway/type/LineScreenFunctionType.java @@ -1,5 +1,6 @@ package subway.type; +import subway.domain.LineRepository; import subway.view.LineInputView; public enum LineScreenFunctionType { @@ -18,7 +19,7 @@ public void execute() { PRINT_STATION(3) { @Override public void execute() { - System.out.println("3"); + LineRepository.printLines(); } }; diff --git a/src/main/java/subway/view/LineInputView.java b/src/main/java/subway/view/LineInputView.java index 2bce03572..563cf64bc 100644 --- a/src/main/java/subway/view/LineInputView.java +++ b/src/main/java/subway/view/LineInputView.java @@ -103,6 +103,7 @@ public static void registerLine() { validateAreStationSame(upwardTerminalStation, downwardTerminalStation); LineRepository.addLine(newLine); System.out.println(REGISTER_COMPLETE_MESSAGE); + System.out.println(); } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); From 65571fc73ade29398b6f6201d5e201d658f4da68 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:39:38 +0900 Subject: [PATCH 26/38] =?UTF-8?q?style:=20=ED=95=A8=EC=88=98=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Line.java | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 4656bf38f..a3a4d061e 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -9,16 +9,21 @@ public class Line { private String name; private List stationsOnLine = new ArrayList<>(); - public void registerStation(Station station) { - stationsOnLine.add(station); - } - public Line(String name) { this.name = name; } - public String getName() { - return name; + public void registerStation(Station station) { + stationsOnLine.add(station); + } + + public boolean isStationRegistered(String stationName) { + for (Station station : stationsOnLine) { + if (station.getName().equals(stationName)) { + return true; + } + } + return false; } public void printStations() { @@ -28,16 +33,12 @@ public void printStations() { System.out.println(); } + public String getName() { + return name; + } + public boolean isSameName(String lineName) { return this.name.equals(lineName); } - public boolean isStationRegistered(String stationName) { - for (Station station : stationsOnLine) { - if (station.getName().equals(stationName)) { - return true; - } - } - return false; - } } From a5f294fb039ae8a9581a7b34dafdadb517ba1a23 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:42:02 +0900 Subject: [PATCH 27/38] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/LineRepository.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index dd3f8778d..8f4dd0bf7 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -10,6 +10,7 @@ public class LineRepository { private static final String INFO_WITH_BORDER = "[INFO] ---"; private static final String LINE_LIST = "## 노선 목록"; private static final String SUBWAY_MAP = "## 지하철 노선도"; + private static final String LINE_NOT_EXIST = "[ERROR] 존재하지 않는 노선입니다."; private static final List lines = new ArrayList<>(); @@ -18,7 +19,6 @@ public static List lines() { } public static void addLine(Line line) { - // TODO 노선 이름 중복 확인할 것 lines.add(line); } @@ -26,23 +26,13 @@ public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } - public static void printMap() { - System.out.println(); - System.out.println(SUBWAY_MAP); - for (Line line : lines) { - System.out.println(INFO + line.getName()); - System.out.println(INFO_WITH_BORDER); - line.printStations(); - } - } - public static void isLineExist(String lineName) { boolean flag = false; for (Line line : lines) { flag = line.getName().equals(lineName); } if (!flag) { - throw new IllegalArgumentException("[ERROR] 존재하지 않는 노선입니다."); + throw new IllegalArgumentException(LINE_NOT_EXIST); } } @@ -53,4 +43,14 @@ public static void printLines() { } System.out.println(); } + + public static void printMap() { + System.out.println(); + System.out.println(SUBWAY_MAP); + for (Line line : lines) { + System.out.println(INFO + line.getName()); + System.out.println(INFO_WITH_BORDER); + line.printStations(); + } + } } From 83a732c84d387fc4147b4708d94f4a0d9e07fa16 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:43:03 +0900 Subject: [PATCH 28/38] =?UTF-8?q?refactor:=20Station=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EA=B0=84=20=EB=B9=84=EA=B5=90=EB=A5=BC=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?equals,=20hashcode=20=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/Station.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..010c9533b 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -1,9 +1,12 @@ package subway.domain; +import java.util.Objects; + public class Station { private String name; public Station(String name) { + // TODO 이름 2글자 이상인지 확인할 것 this.name = name; } @@ -11,5 +14,20 @@ public String getName() { return name; } - // 추가 기능 구현 + public boolean isSameName(String stationName) { + return this.name.equals(stationName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Station station = (Station) o; + return Objects.equals(name, station.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } From 567abeab10ef4c0d53a7b52cfc3194bec5511946 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:44:03 +0900 Subject: [PATCH 29/38] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/StationRepository.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index b7245c0f3..0c820213f 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -6,6 +6,9 @@ import java.util.Objects; public class StationRepository { + private static final String INFO = "[INFO] "; + private static final String STATION_LIST = "## 역 목록"; + private static final List stations = new ArrayList<>(); public static List stations() { @@ -19,4 +22,21 @@ public static void addStation(Station station) { public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } + + public static boolean isStationExist(String upwardTerminalStation) { + for (Station station : stations) { + if (station.isSameName(upwardTerminalStation)) { + return true; + } + } + return false; + } + + public static void printStations() { + System.out.println(); + System.out.println(STATION_LIST); + for(Station station : stations) { + System.out.println(INFO + station.getName()); + } + } } From 7fb24160859a14203d8197dcf61730d49d684a7d Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:45:40 +0900 Subject: [PATCH 30/38] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=EB=8F=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/type/MainScreenFunctionType.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/subway/type/MainScreenFunctionType.java b/src/main/java/subway/type/MainScreenFunctionType.java index 929c27528..77f7043e7 100644 --- a/src/main/java/subway/type/MainScreenFunctionType.java +++ b/src/main/java/subway/type/MainScreenFunctionType.java @@ -1,20 +1,21 @@ -package subway.domain; +package subway.type; -import subway.view.LineOutputView; +import subway.domain.LineRepository; +import subway.view.LineInputView; import subway.view.SectionOutputView; -import subway.view.StationOutputView; +import subway.view.StationInputView; -public enum FunctionType { +public enum MainScreenFunctionType { MANAGE_STATION(1) { @Override public void execute() { - StationOutputView.printManageStationScreen(); + StationInputView.getStationScreenUserSelection(); } }, MANAGE_LINE(2) { @Override public void execute() { - LineOutputView.printManageLineScreen(); + LineInputView.getLineScreenUserSelection(); } }, MANAGE_SECTION(3) { @@ -26,13 +27,13 @@ public void execute() { PRINT_MAP(4) { @Override // TODO 지하철 노선도 출력 public void execute() { - System.out.println("4 고름"); - } + LineRepository.printMap(); + } }; private final int functionCode; - FunctionType(int functionCode) { + MainScreenFunctionType(int functionCode) { this.functionCode = functionCode; } From f6a37edc94f5e37d56a7cef463abba1337600be9 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:47:50 +0900 Subject: [PATCH 31/38] =?UTF-8?q?feat:=20=EC=97=AD=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/StationRepository.java | 2 +- .../java/subway/type/StationScreenFunctionType.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 0c820213f..a721b691a 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -35,7 +35,7 @@ public static boolean isStationExist(String upwardTerminalStation) { public static void printStations() { System.out.println(); System.out.println(STATION_LIST); - for(Station station : stations) { + for (Station station : stations) { System.out.println(INFO + station.getName()); } } diff --git a/src/main/java/subway/type/StationScreenFunctionType.java b/src/main/java/subway/type/StationScreenFunctionType.java index fe00d8452..901d6033f 100644 --- a/src/main/java/subway/type/StationScreenFunctionType.java +++ b/src/main/java/subway/type/StationScreenFunctionType.java @@ -1,26 +1,26 @@ package subway.type; -import subway.view.LineOutputView; -import subway.view.SectionOutputView; import subway.view.StationInputView; +import static subway.domain.StationRepository.printStations; + public enum StationScreenFunctionType { REGISTER_STATION(1) { @Override public void execute() { - System.out.println(("1")); + StationInputView.registerStation(); } }, REMOVE_STATION(2) { @Override public void execute() { - System.out.println("2"); + StationInputView.removeStation(); } }, PRINT_STATION(3) { @Override public void execute() { - System.out.println("3"); + printStations(); } }; From 83131061fd5762e0798bdb2e437db364a29aa891 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 21:51:01 +0900 Subject: [PATCH 32/38] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/view/LineInputView.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/subway/view/LineInputView.java b/src/main/java/subway/view/LineInputView.java index 563cf64bc..0b10863a4 100644 --- a/src/main/java/subway/view/LineInputView.java +++ b/src/main/java/subway/view/LineInputView.java @@ -94,14 +94,7 @@ public static void registerLine() { String lineName = scanner.nextLine(); try { validateLineName(lineName); - // TODO 상행 종점 입력, 하행 종점 입력받고 존재하는 Station인지 확인하고 add - Line newLine = new Line(lineName); - Station upwardTerminalStation = getUpwardTerminalStation(); - Station downwardTerminalStation = getDownwardTerminalStation(); - newLine.registerStation(upwardTerminalStation); - newLine.registerStation(downwardTerminalStation); - validateAreStationSame(upwardTerminalStation, downwardTerminalStation); - LineRepository.addLine(newLine); + makeNewLine(lineName); System.out.println(REGISTER_COMPLETE_MESSAGE); System.out.println(); } catch (Exception e) { @@ -111,6 +104,16 @@ public static void registerLine() { } } + private static void makeNewLine(String lineName) { + Line newLine = new Line(lineName); + Station upwardTerminalStation = getUpwardTerminalStation(); + Station downwardTerminalStation = getDownwardTerminalStation(); + validateAreStationSame(upwardTerminalStation, downwardTerminalStation); + newLine.registerStation(upwardTerminalStation); + newLine.registerStation(downwardTerminalStation); + LineRepository.addLine(newLine); + } + private static void validateAreStationSame(Station upwardTerminalStation, Station downwardTerminalStation) { if (upwardTerminalStation.equals(downwardTerminalStation)) { throw new IllegalArgumentException("상행 종점과 하행 종점끼리 같은 역일 수 없습니다."); From 768fda35f857d5b6411f76ffb24f731bbd734e05 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 22:29:12 +0900 Subject: [PATCH 33/38] =?UTF-8?q?fix:=20=EB=85=B8=EC=84=A0=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=20=EC=97=AC=EB=B6=80=20=ED=95=A8=EC=88=98=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/LineRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 8f4dd0bf7..3d4062767 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -30,6 +30,7 @@ public static void isLineExist(String lineName) { boolean flag = false; for (Line line : lines) { flag = line.getName().equals(lineName); + if(flag) break; } if (!flag) { throw new IllegalArgumentException(LINE_NOT_EXIST); From 4f5b1ec59ac0ea52313203312dcb30131e8e7c9a Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 22:44:26 +0900 Subject: [PATCH 34/38] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=EC=8B=9C=20=EB=85=B8=EC=84=A0=EC=97=90=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=20=EC=97=AD=EC=9D=B4=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../type/SectionScreenFunctionType.java | 31 +++++ .../java/subway/view/SectionInputView.java | 119 ++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 src/main/java/subway/type/SectionScreenFunctionType.java create mode 100644 src/main/java/subway/view/SectionInputView.java diff --git a/src/main/java/subway/type/SectionScreenFunctionType.java b/src/main/java/subway/type/SectionScreenFunctionType.java new file mode 100644 index 000000000..d1690ebdf --- /dev/null +++ b/src/main/java/subway/type/SectionScreenFunctionType.java @@ -0,0 +1,31 @@ +package subway.type; + +import subway.view.LineInputView; +import subway.view.SectionInputView; + +public enum SectionScreenFunctionType { + REGISTER_SECTION(1) { + @Override + public void execute() { + SectionInputView.registerSection(); + } + }, + REMOVE_SECTION(2) { + @Override + public void execute() { + SectionInputView.removeSection(); + } + }; + + private final int functionCode; + + SectionScreenFunctionType(int functionCode) { + this.functionCode = functionCode; + } + + public boolean isSameFunctionCode(int number) { + return this.functionCode == number; + } + + public abstract void execute(); +} diff --git a/src/main/java/subway/view/SectionInputView.java b/src/main/java/subway/view/SectionInputView.java new file mode 100644 index 000000000..2135f0818 --- /dev/null +++ b/src/main/java/subway/view/SectionInputView.java @@ -0,0 +1,119 @@ +package subway.view; + +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.StationRepository; +import subway.type.SectionScreenFunctionType; + +import java.util.Scanner; + +public class SectionInputView { + private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; + private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; + private static final String INPUT_LINE_MESSAGE = "## 노선을 입력하세요."; + private static final String INPUT_STATION_MESSAGE = "## 역 이름을 입력하세요."; + private static final String STATION_NOT_ON_LINE_MESSAGE = "[ERROR] 노선에 해당 역이 존재하지 않습니다."; + private static final int INTEGER_ONE = 1; + private static final char BACK = 'B'; + private static final int FIRST_CHARACTER = 0; + private static final char ONE = '1'; + private static final char TWO = '2'; + + private static final Scanner scanner = new Scanner(System.in); + + private SectionInputView() { + } + + public static void getSectionScreenUserSelection() { + SectionOutputView.printManageSectionScreen(); + System.out.println(SELECT_MESSAGE); + String userInput = scanner.nextLine(); + try { + validateUserInput(userInput); + if (isUserInputBack(userInput.charAt(FIRST_CHARACTER))) { + MainScreenInputView.getMainScreenUserSelection(scanner); + return; + } + executeFunction(userInput); + } catch (Exception e) { + System.out.println(); + System.out.println(e.getMessage()); + getSectionScreenUserSelection(); + } + } + + private static void executeFunction(String userInput) { + for (SectionScreenFunctionType sectionScreenFunctionType : SectionScreenFunctionType.values()) { + if (sectionScreenFunctionType.isSameFunctionCode(Integer.parseInt(userInput))) { + sectionScreenFunctionType.execute(); + } + } + } + + private static boolean isUserInputBack(char userInput) { + return Character.toUpperCase(userInput) == BACK; + } + + private static void validateUserInput(String userInput) { + validateUserInputLength(userInput); + char characterizedUserInput = userInput.charAt(FIRST_CHARACTER); + if (!isUserInputBack(characterizedUserInput)) { + validateUserInputRange(characterizedUserInput); + } + } + + private static void validateUserInputLength(String userInput) { + if (userInput.length() != INTEGER_ONE) { + System.out.println(userInput.length()); + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + private static void validateUserInputRange(char userInput) { + if ((userInput < ONE || userInput > TWO)) { + throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); + } + } + + public static void registerSection() { // TODO 순서가 노선 size 넘어가면 안됨 + try { + String lineName = getLineName(); + String stationName = getStationName(); + validateStationRegisteredOnLine(lineName, stationName); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + private static String getLineName() { + System.out.println(INPUT_LINE_MESSAGE); + String lineName = scanner.nextLine(); + LineRepository.isLineExist(lineName); + return lineName; + } + + private static String getStationName() { + System.out.println(INPUT_STATION_MESSAGE); + String stationName = scanner.nextLine(); + validateStationExistence(stationName); + return stationName; + } + + private static void validateStationExistence(String stationName) { + if (!StationRepository.isStationExist(stationName)) { + throw new IllegalArgumentException("존재하지 않는 역입니다."); + } + } + + private static void validateStationRegisteredOnLine(String lineName, String stationName) { + for (Line line : LineRepository.lines()) { + if (line.getName().equals(lineName) && line.isStationRegistered(stationName)) { + throw new IllegalArgumentException("[ERROR] 노선에 이미 등록되어 있는 역이므로 등록이 불가능합니다."); + } + } + } + + public static void removeSection() { + + } +} From a58af2254c08ff77be10a254c867c3bb196ab319 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 23:04:27 +0900 Subject: [PATCH 35/38] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=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/domain/Line.java | 7 ++++ .../java/subway/view/SectionInputView.java | 37 +++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index a3a4d061e..a211e50fe 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -41,4 +41,11 @@ public boolean isSameName(String lineName) { return this.name.equals(lineName); } + public int getSize() { + return stationsOnLine.size(); + } + + public void insert(Station station, int order) { + stationsOnLine.add(order-1, station); + } } diff --git a/src/main/java/subway/view/SectionInputView.java b/src/main/java/subway/view/SectionInputView.java index 2135f0818..13b20dba8 100644 --- a/src/main/java/subway/view/SectionInputView.java +++ b/src/main/java/subway/view/SectionInputView.java @@ -2,6 +2,7 @@ import subway.domain.Line; import subway.domain.LineRepository; +import subway.domain.Station; import subway.domain.StationRepository; import subway.type.SectionScreenFunctionType; @@ -12,7 +13,9 @@ public class SectionInputView { private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; private static final String INPUT_LINE_MESSAGE = "## 노선을 입력하세요."; private static final String INPUT_STATION_MESSAGE = "## 역 이름을 입력하세요."; - private static final String STATION_NOT_ON_LINE_MESSAGE = "[ERROR] 노선에 해당 역이 존재하지 않습니다."; + private static final String INPUT_ORDER_MESSAGE = "## 순서를 입력하세요."; + private static final String INVALID_ORDER_MESSAGE = "[ERROR] 순서는 양수이며 노선에 포함된 역의 개수 이하여야 합니다."; + private static final String INVALID_STATION_MESSAGE = "[ERROR] 노선에 이미 등록되어 있는 역이므로 등록이 불가능합니다."; private static final int INTEGER_ONE = 1; private static final char BACK = 'B'; private static final int FIRST_CHARACTER = 0; @@ -80,11 +83,39 @@ public static void registerSection() { // TODO 순서가 노선 size 넘어가 String lineName = getLineName(); String stationName = getStationName(); validateStationRegisteredOnLine(lineName, stationName); + int order = getOrder(lineName); + insertStation(lineName, stationName, order); } catch (Exception e) { System.out.println(e.getMessage()); } } + private static void insertStation(String lineName, String stationName, int order) { + for (Line line : LineRepository.lines()) { + if (line.getName().equals(lineName)) { + line.insert(new Station(stationName), order); + } + } + } + + private static int getOrder(String lineName) { + System.out.println(INPUT_ORDER_MESSAGE); + int order = scanner.nextInt(); + if (INTEGER_ONE > order || getSizeOfLine(lineName) < order) { + throw new IllegalArgumentException(INVALID_ORDER_MESSAGE); + } + return order; + } + + private static int getSizeOfLine(String lineName) { + for (Line line : LineRepository.lines()) { + if (line.getName().equals(lineName)) { + return line.getSize(); + } + } + return 0; + } + private static String getLineName() { System.out.println(INPUT_LINE_MESSAGE); String lineName = scanner.nextLine(); @@ -101,14 +132,14 @@ private static String getStationName() { private static void validateStationExistence(String stationName) { if (!StationRepository.isStationExist(stationName)) { - throw new IllegalArgumentException("존재하지 않는 역입니다."); + throw new IllegalArgumentException(INVALID_ORDER_MESSAGE); } } private static void validateStationRegisteredOnLine(String lineName, String stationName) { for (Line line : LineRepository.lines()) { if (line.getName().equals(lineName) && line.isStationRegistered(stationName)) { - throw new IllegalArgumentException("[ERROR] 노선에 이미 등록되어 있는 역이므로 등록이 불가능합니다."); + throw new IllegalArgumentException(INVALID_STATION_MESSAGE); } } } From 958419e60c948f88467d4c82811389fd3bbbf8f5 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 23:33:15 +0900 Subject: [PATCH 36/38] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=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/domain/Line.java | 8 ++++ .../java/subway/view/SectionInputView.java | 48 +++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index a211e50fe..f1a9eac53 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -5,6 +5,7 @@ public class Line { private static final String INFO = "[INFO] "; + private static final String STATION_NUMBER_MESSAGE = "[ERROR] 노선의 역 개수가 2개 이하이므로 삭제할 수 없습니다."; private String name; private List stationsOnLine = new ArrayList<>(); @@ -48,4 +49,11 @@ public int getSize() { public void insert(Station station, int order) { stationsOnLine.add(order-1, station); } + + public void remove(String stationName) { + if (stationsOnLine.size() <= 2) { + throw new IllegalArgumentException(STATION_NUMBER_MESSAGE); + } + stationsOnLine.remove(new Station(stationName)); + } } diff --git a/src/main/java/subway/view/SectionInputView.java b/src/main/java/subway/view/SectionInputView.java index 13b20dba8..73b9b6517 100644 --- a/src/main/java/subway/view/SectionInputView.java +++ b/src/main/java/subway/view/SectionInputView.java @@ -12,8 +12,11 @@ public class SectionInputView { private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; private static final String INPUT_LINE_MESSAGE = "## 노선을 입력하세요."; + private static final String DELETE_LINE_MESSAGE = "## 삭제할 구간의 노선을 입력하세요."; + private static final String DELETE_STATION_MESSAGE = "## 삭제할 구간의 역을 입력하세요."; private static final String INPUT_STATION_MESSAGE = "## 역 이름을 입력하세요."; private static final String INPUT_ORDER_MESSAGE = "## 순서를 입력하세요."; + private static final String STATION_NOT_EXIST = "[ERROR] 노선에 역이 존재하지 않습니다."; private static final String INVALID_ORDER_MESSAGE = "[ERROR] 순서는 양수이며 노선에 포함된 역의 개수 이하여야 합니다."; private static final String INVALID_STATION_MESSAGE = "[ERROR] 노선에 이미 등록되어 있는 역이므로 등록이 불가능합니다."; private static final int INTEGER_ONE = 1; @@ -80,13 +83,16 @@ private static void validateUserInputRange(char userInput) { public static void registerSection() { // TODO 순서가 노선 size 넘어가면 안됨 try { + System.out.println(INPUT_LINE_MESSAGE); String lineName = getLineName(); + System.out.println(INPUT_STATION_MESSAGE); String stationName = getStationName(); - validateStationRegisteredOnLine(lineName, stationName); + validateStationRegisteredNotOnLine(lineName, stationName); int order = getOrder(lineName); insertStation(lineName, stationName, order); } catch (Exception e) { System.out.println(e.getMessage()); + getSectionScreenUserSelection(); } } @@ -113,18 +119,16 @@ private static int getSizeOfLine(String lineName) { return line.getSize(); } } - return 0; + return -1; } private static String getLineName() { - System.out.println(INPUT_LINE_MESSAGE); String lineName = scanner.nextLine(); LineRepository.isLineExist(lineName); return lineName; } private static String getStationName() { - System.out.println(INPUT_STATION_MESSAGE); String stationName = scanner.nextLine(); validateStationExistence(stationName); return stationName; @@ -136,7 +140,7 @@ private static void validateStationExistence(String stationName) { } } - private static void validateStationRegisteredOnLine(String lineName, String stationName) { + private static void validateStationRegisteredNotOnLine(String lineName, String stationName) { for (Line line : LineRepository.lines()) { if (line.getName().equals(lineName) && line.isStationRegistered(stationName)) { throw new IllegalArgumentException(INVALID_STATION_MESSAGE); @@ -145,6 +149,40 @@ private static void validateStationRegisteredOnLine(String lineName, String stat } public static void removeSection() { + System.out.println(DELETE_LINE_MESSAGE); + try { + String lineName = getLineName(); + System.out.println(DELETE_STATION_MESSAGE); + String stationName = scanner.nextLine(); + validateStationOnLine(lineName, stationName); + removeStation(lineName, stationName); + } catch (Exception e) { + System.out.println(e.getMessage()); + getSectionScreenUserSelection(); + } + + } + + private static void removeStation(String lineName, String stationName) { + for (Line line : LineRepository.lines()) { + if (line.getName().equals(lineName)) { + line.remove(stationName); + } + } + } + private static void validateStationOnLine(String lineName, String stationName) { + if (!isStationOnLine(lineName, stationName)) { + throw new IllegalArgumentException(STATION_NOT_EXIST); + } + } + + private static boolean isStationOnLine(String lineName, String stationName) { + for (Line line : LineRepository.lines()) { + if (line.getName().equals(lineName) && line.isStationRegistered(stationName)) { + return true; + } + } + return false; } } From a182f9c40b5d89534e202988d67a05e0a67fa05b Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 23:35:05 +0900 Subject: [PATCH 37/38] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=A9=94=EC=8B=9C=EC=A7=80=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/view/SectionInputView.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/subway/view/SectionInputView.java b/src/main/java/subway/view/SectionInputView.java index 73b9b6517..55802e603 100644 --- a/src/main/java/subway/view/SectionInputView.java +++ b/src/main/java/subway/view/SectionInputView.java @@ -16,6 +16,7 @@ public class SectionInputView { private static final String DELETE_STATION_MESSAGE = "## 삭제할 구간의 역을 입력하세요."; private static final String INPUT_STATION_MESSAGE = "## 역 이름을 입력하세요."; private static final String INPUT_ORDER_MESSAGE = "## 순서를 입력하세요."; + private static final String SECTION_REMOVAL_MESSAGE = "[INFO] 구간이 삭제되었습니다."; private static final String STATION_NOT_EXIST = "[ERROR] 노선에 역이 존재하지 않습니다."; private static final String INVALID_ORDER_MESSAGE = "[ERROR] 순서는 양수이며 노선에 포함된 역의 개수 이하여야 합니다."; private static final String INVALID_STATION_MESSAGE = "[ERROR] 노선에 이미 등록되어 있는 역이므로 등록이 불가능합니다."; @@ -156,6 +157,7 @@ public static void removeSection() { String stationName = scanner.nextLine(); validateStationOnLine(lineName, stationName); removeStation(lineName, stationName); + System.out.println(SECTION_REMOVAL_MESSAGE); } catch (Exception e) { System.out.println(e.getMessage()); getSectionScreenUserSelection(); From fa24c5a158eea63d099fb9c2c0a6862c5871c454 Mon Sep 17 00:00:00 2001 From: TaewanKimmmm Date: Tue, 15 Dec 2020 23:35:43 +0900 Subject: [PATCH 38/38] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/SubwayMapEditor.java | 9 ++++-- .../java/subway/domain/StationRepository.java | 4 +-- .../subway/type/MainScreenFunctionType.java | 3 +- src/main/java/subway/view/LineInputView.java | 5 ++-- .../java/subway/view/MainScreenInputView.java | 28 +++++++++++-------- .../java/subway/view/StationInputView.java | 2 +- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/main/java/subway/controller/SubwayMapEditor.java b/src/main/java/subway/controller/SubwayMapEditor.java index 8216ed799..c5a89769c 100644 --- a/src/main/java/subway/controller/SubwayMapEditor.java +++ b/src/main/java/subway/controller/SubwayMapEditor.java @@ -1,7 +1,8 @@ package subway.controller; import subway.domain.SubwayMap; -import subway.view.OutputView; +import subway.view.MainScreenInputView; +import subway.view.MainScreenOutputView; import java.util.Scanner; @@ -14,6 +15,10 @@ public SubwayMapEditor(Scanner scanner) { public void run() { SubwayMap subwayMap = new SubwayMap(); - OutputView.printMainScreen(); + boolean isPersist = false; + do { + isPersist = MainScreenInputView.getMainScreenUserSelection(scanner); + } while (isPersist); + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index a721b691a..16169f5a9 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -23,9 +23,9 @@ public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } - public static boolean isStationExist(String upwardTerminalStation) { + public static boolean isStationExist(String stationName) { for (Station station : stations) { - if (station.isSameName(upwardTerminalStation)) { + if (station.isSameName(stationName)) { return true; } } diff --git a/src/main/java/subway/type/MainScreenFunctionType.java b/src/main/java/subway/type/MainScreenFunctionType.java index 77f7043e7..706bdea7b 100644 --- a/src/main/java/subway/type/MainScreenFunctionType.java +++ b/src/main/java/subway/type/MainScreenFunctionType.java @@ -2,6 +2,7 @@ import subway.domain.LineRepository; import subway.view.LineInputView; +import subway.view.SectionInputView; import subway.view.SectionOutputView; import subway.view.StationInputView; @@ -21,7 +22,7 @@ public void execute() { MANAGE_SECTION(3) { @Override public void execute() { - SectionOutputView.printManageSectionScreen(); + SectionInputView.getSectionScreenUserSelection(); } }, PRINT_MAP(4) { diff --git a/src/main/java/subway/view/LineInputView.java b/src/main/java/subway/view/LineInputView.java index 0b10863a4..39bdef258 100644 --- a/src/main/java/subway/view/LineInputView.java +++ b/src/main/java/subway/view/LineInputView.java @@ -31,7 +31,6 @@ public class LineInputView { private static final String KOREAN_REGULAR_EXPRESSION = "^[가-힣]*$"; private static final String HAS_NUMBER_REGULAR_EXPRESSION = ".*[0-9].*"; - private static final Scanner scanner = new Scanner(System.in); private LineInputView() { @@ -146,8 +145,8 @@ private static Station getDownwardTerminalStation() { return new Station(downwardTerminalStation); } - private static void validateStationExistence(String upwardTerminalStation) { - if (!StationRepository.isStationExist(upwardTerminalStation)) { + private static void validateStationExistence(String stationName) { + if (!StationRepository.isStationExist(stationName)) { throw new IllegalArgumentException("존재하지 않는 역입니다."); } } diff --git a/src/main/java/subway/view/MainScreenInputView.java b/src/main/java/subway/view/MainScreenInputView.java index d3695da59..3b5aa4f49 100644 --- a/src/main/java/subway/view/MainScreenInputView.java +++ b/src/main/java/subway/view/MainScreenInputView.java @@ -1,53 +1,57 @@ package subway.view; -import subway.domain.FunctionType; +import subway.type.MainScreenFunctionType; import java.util.Scanner; -public class InputView { +public class MainScreenInputView { private static final String SELECT_MESSAGE = "## 원하는 기능을 선택하세요."; private static final String CANNOT_SELECT_MESSAGE = "[ERROR] 선택할 수 없는 기능입니다."; private static final char ONE = '1'; - private static final char THREE = '3'; + private static final int INTEGER_ONE = 1; private static final char FOUR = '4'; private static final char QUIT = 'Q'; + private static final int FIRST_CHARACTER = 0; - private InputView() { + private MainScreenInputView() { } - public static void getMainScreenUserSelection(Scanner scanner) { + public static boolean getMainScreenUserSelection(Scanner scanner) { + MainScreenOutputView.printMainScreen(); System.out.println(SELECT_MESSAGE); String userInput = scanner.nextLine(); try { validateUserInput(userInput); - if (!isUserInputQuit(userInput.charAt(0))) { - executeFunction(userInput); + if (isUserInputQuit(userInput.charAt(FIRST_CHARACTER))) { + return false; } + executeFunction(userInput); } catch (Exception e) { System.out.println(); System.out.println(e.getMessage()); getMainScreenUserSelection(scanner); } + return true; } private static void executeFunction(String userInput) { - for (FunctionType functionType : FunctionType.values()) { - if (functionType.isSameFunctionCode(Integer.parseInt(userInput))) { - functionType.execute(); + for (MainScreenFunctionType mainScreenFunctionType : MainScreenFunctionType.values()) { + if (mainScreenFunctionType.isSameFunctionCode(Integer.parseInt(userInput))) { + mainScreenFunctionType.execute(); } } } private static void validateUserInput(String userInput) { validateUserInputLength(userInput); - char characterizedUserInput = userInput.charAt(0); + char characterizedUserInput = userInput.charAt(FIRST_CHARACTER); if (!isUserInputQuit(characterizedUserInput)) { validateUserInputRange(characterizedUserInput); } } private static void validateUserInputLength(String userInput) { - if (userInput.length() != 1) { + if (userInput.length() != INTEGER_ONE) { throw new IllegalArgumentException(CANNOT_SELECT_MESSAGE); } } diff --git a/src/main/java/subway/view/StationInputView.java b/src/main/java/subway/view/StationInputView.java index ae429588e..e3274b3c2 100644 --- a/src/main/java/subway/view/StationInputView.java +++ b/src/main/java/subway/view/StationInputView.java @@ -102,7 +102,7 @@ public static void registerStation() { public static void removeStation() { System.out.println(REMOVE_STATION_MESSAGE); String stationName = scanner.nextLine(); - try { // TODO 노선에 등록되어있는 지 확인할 것 + try { // TODO 노선에 포함된 역이 두 개 이하이면 역을 삭제할 수 없다. validateStationRegisteredOnLine(stationName); StationRepository.deleteStation(stationName); } catch (Exception e) {