From bf6ad3108b4c8c8236e2190a99597e3956deb8c8 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 20:38:57 +0900 Subject: [PATCH 01/47] docs(README.md): add plans for functions --- README.md | 482 ++---------------------------------------------------- 1 file changed, 13 insertions(+), 469 deletions(-) diff --git a/README.md b/README.md index 450e7753a..4549f25ec 100644 --- a/README.md +++ b/README.md @@ -1,469 +1,13 @@ -# 지하철 노선도 미션 -- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다. - -
- -## 🚀 기능 요구사항 - -### 초기 설정 -- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅할 수 있다. - -> 아래의 사전 등록 정보로 반드시 초기 설정을 하기 -> -``` - 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. - 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. - 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점) - - 2호선: 교대역 - 강남역 - 역삼역 - - 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역 - - 신분당선: 강남역 - 양재역 - 양재시민의숲역 - ``` - - - -### 지하철 역 관련 기능 -- 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다) -- 중복된 지하철 역 이름이 등록될 수 없다. -- 지하철 역 이름은 2글자 이상이어야 한다. -- 지하철 역의 목록을 조회할 수 있다. - -### 지하철 노선 관련 기능 -- 지하철 노선을 등록하고 삭제할 수 있다. -- 중복된 지하철 노선 이름이 등록될 수 없다. -- 지하철 노선 이름은 2글자 이상이어야 한다. -- 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다. -- 지하철 노선의 목록을 조회할 수 있다. - -### 지하철 구간 추가 기능 -- 지하철 노선에 구간을 추가하는 기능은 노선에 역을 추가하는 기능이라고도 할 수 있다. - - 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다. -- 하나의 역은 여러개의 노선에 추가될 수 있다. -- 역과 역 사이에 새로운 역이 추가 될 수 있다. -- 노선에서 갈래길은 생길 수 없다. - - - -### 지하철 구간 삭제 기능 -- 노선에 등록된 역을 제거할 수 있다. -- 종점을 제거할 경우 다음 역이 종점이 된다. -- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다. - - - -### 지하철 노선에 등록된 역 조회 기능 -- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다. - -
- -## ✍🏻 입출력 요구사항 -- `프로그래밍 실행 결과 예시`를 참고하여 입출력을 구현한다. -- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다. -- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. (에러의 문구는 자유롭게 작성한다.) - -### 💻 프로그래밍 실행 결과 -#### 역 관리 -``` -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 등록할 역 이름을 입력하세요. -잠실역 - -[INFO] 지하철 역이 등록되었습니다. - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -3 - -## 역 목록 -[INFO] 교대역 -[INFO] 강남역 -[INFO] 역삼역 -[INFO] 남부터미널역 -[INFO] 양재역 -[INFO] 양재시민의숲역 -[INFO] 매봉역 -[INFO] 잠실역 - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -2 - -## 삭제할 역 이름을 입력하세요. -잠실역 - -[INFO] 지하철 역이 삭제되었습니다. - -... -``` - -### 노선 관리 - -``` - -... - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -2 - -## 노선 관리 화면 -1. 노선 등록 -2. 노선 삭제 -3. 노선 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 등록할 노선 이름을 입력하세요. -1호선 - -## 등록할 노선의 상행 종점역 이름을 입력하세요. -강남역 - -## 등록할 노선의 하행 종점역 이름을 입력하세요. -잠실역 - -[INFO] 지하철 노선이 등록되었습니다. - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -2 - -## 노선 관리 화면 -1. 노선 등록 -2. 노선 삭제 -3. 노선 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -3 - -## 노선 목록 -[INFO] 2호선 -[INFO] 3호선 -[INFO] 신분당선 -[INFO] 1호선 - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -2 - -## 노선 관리 화면 -1. 노선 등록 -2. 노선 삭제 -3. 노선 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -2 - -## 삭제할 노선 이름을 입력하세요. -1호선 - -[INFO] 지하철 노선이 삭제되었습니다. - -... - -``` - -### 구간 관리 -- 순서는 1부터 시작한다. - -``` -... - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -3 - -## 구간 관리 화면 -1. 구간 등록 -2. 구간 삭제 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 노선을 입력하세요. -2호선 - -## 역이름을 입력하세요. -잠실역 - -## 순서를 입력하세요. -2 - -[INFO] 구간이 등록되었습니다. - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -3 - -## 구간 관리 화면 -1. 구간 등록 -2. 구간 삭제 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -2 - -## 삭제할 구간의 노선을 입력하세요. -2호선 - -## 삭제할 구간의 역을 입력하세요. -잠실역 - -[INFO] 구간이 삭제되었습니다. - -... - -``` - -### 지하철 노선도 출력 - -``` -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -4 - -## 지하철 노선도 -[INFO] 2호선 -[INFO] --- -[INFO] 교대역 -[INFO] 강남역 -[INFO] 역삼역 - -[INFO] 3호선 -[INFO] --- -[INFO] 교대역 -[INFO] 남부터미널역 -[INFO] 양재역 -[INFO] 매봉역 - -[INFO] 신분당선 -[INFO] --- -[INFO] 강남역 -[INFO] 양재역 -[INFO] 양재시민의숲역 - -``` - -#### 에러 출력 예시 - -``` -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -5 - -[ERROR] 선택할 수 없는 기능입니다. - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 등록할 역 이름을 입력하세요. -강남역 - -[ERROR] 이미 등록된 역 이름입니다. - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. - -... - -``` - -
- -## 🎱 프로그래밍 요구사항 -- 자바 코드 컨벤션을 지키면서 프로그래밍한다. - - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다. - - 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다. -- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 `[ERROR]` 로 시작해야 한다. - -### 프로그래밍 요구사항 - Application -- Application 클래스를 활용해 구현해야 한다. -- Application의 패키지 구조는 변경하지 않는다. -```java -public class Application { - public static void main(String[] args) { - ... - } -} -``` - -### 프로그래밍 요구사항 - Station, Line -- Station, Line 클래스를 활용하여 지하철역과 노선을 구현해야 한다. -- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다. -- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다. -- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다. - -```java -public class Station { - private String name; - - public Station(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - // 추가 기능 구현 -} - -``` - -### 프로그래밍 요구사항 - StationRepository, LineRepository -- Station과 Line의 상태를 저장할 수 있는 StationRepository, LineRepository를 제공한다. -- 필요 시 StationRepository, LineRepository 이 외 추가로 Repository를 만들 수 있다. -- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가할 수 있다. -- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다. -- 필요에 따라 자유롭게 수정이 가능하다. - -```java -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } -} -``` - -
- -## 📈 진행 요구사항 -- 미션은 [java-subway-map-precourse 저장소](https://github.com/woowacourse/java-subway-map-precourse) 를 fork/clone해 시작한다. -- 기능을 구현하기 전에 java-subway-map-precourse/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다. -- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다. - - [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다. -
- -## 📝 License - -This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed. +### 기능 목록 +- 사전 등록 정보 초기 설정하기 +- 맨 처음 사용자 입력값 1, 2, 3, 4, Q 검증 필요 +- 이 외에도 단계별로 입력값 1, 2, 3, B 검증 필요 +- 역 등록 시에 중복 검사 필요 +- 역 등록 시에 노선 이름 존재 유무 검증 필요 +- 역 등록 시에 역 이름 길이 검증 필요 +- 역 삭제 시에 역 이름 존재 유무 검증 필요 +- 노선 등록 시에 중복 검사 필요 +- 노선 등록 시에 이름 길이 검증 필요 +- 노선 삭제 시에 역 이름 존재 유무 검증 필요 +- 구간 등록/삭제 시 노선 유무 검증 필요 +- 구간 등록/삭제 시 역 유무 검증 필요 From f5db3ab5cf4e86289c2501a8d3fbae4204ac782e Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 21:06:15 +0900 Subject: [PATCH 02/47] feat(Application): add class variables, mainScreenPrint method, isExit method for exitFlag --- src/main/java/subway/Application.java | 41 ++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..578c126da 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,49 @@ package subway; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Scanner; +import javax.lang.model.util.Types; public class Application { + static final String stationInput = "1"; + static final String lineInput = "2"; + static final String sectionInput = "3"; + static final String allPrintInput = "4"; + static final String exitInput = "Q"; + private static final ArrayList mainInputWhiteList = new ArrayList<>(Arrays.asList( + stationInput, lineInput, sectionInput, allPrintInput, exitInput)); + public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + boolean exitFlag = false; + while (!exitFlag) { + mainScreenPrint(); + String mainInput = scanner.next(); + exitFlag = isExit(mainInput); + } + } + + public static void mainScreenPrint() { + System.out.println("## 메인 화면\n" + + "1. 역 관리\n" + + "2. 노선 관리\n" + + "3. 구간 관리\n" + + "4. 지하철 노선도 출력\n" + + "Q. 종료\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } + + public static boolean isExit(String mainInput) { + if (!mainInputWhiteList.contains(mainInput)) { + System.out.println("[ERROR] 선택할 수 없는 기능입니다."); + return true; + } + if (mainInput.equalsIgnoreCase(exitInput)) { + return true; + } + return false; } } From ec4b59411c7cd86fa7ada1c6b45dae8626012fd2 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 21:13:17 +0900 Subject: [PATCH 03/47] style(Application): isExit -> isExitAndValidate for explicit method meaning and error throw --- src/main/java/subway/Application.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 578c126da..0fc72e641 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -2,11 +2,10 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.Scanner; -import javax.lang.model.util.Types; public class Application { + static final String stationInput = "1"; static final String lineInput = "2"; static final String sectionInput = "3"; @@ -21,7 +20,7 @@ public static void main(String[] args) { while (!exitFlag) { mainScreenPrint(); String mainInput = scanner.next(); - exitFlag = isExit(mainInput); + exitFlag = isExitAndValidate(mainInput); } } @@ -36,14 +35,11 @@ public static void mainScreenPrint() { + "## 원하는 기능을 선택하세요."); } - public static boolean isExit(String mainInput) { + public static boolean isExitAndValidate(String mainInput) { if (!mainInputWhiteList.contains(mainInput)) { System.out.println("[ERROR] 선택할 수 없는 기능입니다."); - return true; - } - if (mainInput.equalsIgnoreCase(exitInput)) { - return true; + throw new IllegalArgumentException(); } - return false; + return mainInput.equalsIgnoreCase(exitInput); } } From 3b752ea504296f79330302b9694cbe8c6845adcb Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 21:23:45 +0900 Subject: [PATCH 04/47] feat(Application): add initSetting method for pre setting --- src/main/java/subway/Application.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0fc72e641..d4ba8fba7 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,8 +1,14 @@ package subway; +import static subway.domain.LineRepository.addLine; +import static subway.domain.StationRepository.addStation; +import static subway.domain.StationRepository.stations; + import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; +import subway.domain.Line; +import subway.domain.Station; public class Application { @@ -16,6 +22,7 @@ public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); + initSetting(); boolean exitFlag = false; while (!exitFlag) { mainScreenPrint(); @@ -24,6 +31,20 @@ public static void main(String[] args) { } } + public static void initSetting() { + final ArrayList initStations = new ArrayList<>( + Arrays.asList("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역")); + final ArrayList initLines = new ArrayList<>( + Arrays.asList("2호선", "3호선", "신분당선")); + + for (String stationName : initStations) { + addStation(new Station(stationName)); + } + for (String lineName : initLines) { + addLine(new Line(lineName)); + } + } + public static void mainScreenPrint() { System.out.println("## 메인 화면\n" + "1. 역 관리\n" From a9b8f98d4c25cba2356033b9eb27cb13db48f1d6 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 21:39:47 +0900 Subject: [PATCH 05/47] feat(Application): do not use whitelist for validate mainInput and isExit -> ValidateANdNextScreen --- src/main/java/subway/Application.java | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index d4ba8fba7..2d6355f06 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,8 +1,8 @@ package subway; +import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; -import static subway.domain.StationRepository.stations; import java.util.ArrayList; import java.util.Arrays; @@ -12,13 +12,11 @@ public class Application { - static final String stationInput = "1"; - static final String lineInput = "2"; - static final String sectionInput = "3"; - static final String allPrintInput = "4"; + static final String stationManageInput = "1"; + static final String lineManageInput = "2"; + static final String sectionManageInput = "3"; + static final String allLinesInfoPrintInput = "4"; static final String exitInput = "Q"; - private static final ArrayList mainInputWhiteList = new ArrayList<>(Arrays.asList( - stationInput, lineInput, sectionInput, allPrintInput, exitInput)); public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); @@ -27,7 +25,7 @@ public static void main(String[] args) { while (!exitFlag) { mainScreenPrint(); String mainInput = scanner.next(); - exitFlag = isExitAndValidate(mainInput); + exitFlag = ValidateAndNextScreen(scanner, mainInput); } } @@ -56,11 +54,15 @@ public static void mainScreenPrint() { + "## 원하는 기능을 선택하세요."); } - public static boolean isExitAndValidate(String mainInput) { - if (!mainInputWhiteList.contains(mainInput)) { - System.out.println("[ERROR] 선택할 수 없는 기능입니다."); - throw new IllegalArgumentException(); + public static boolean ValidateAndNextScreen(Scanner scanner, String mainInput) { + if (mainInput.equalsIgnoreCase(stationManageInput)) { + stationManage(scanner); + return false; } - return mainInput.equalsIgnoreCase(exitInput); + if (mainInput.equalsIgnoreCase(exitInput)) { + return true; + } + System.out.println("[ERROR] 선택할 수 없는 기능입니다."); + throw new IllegalArgumentException(); } } From b5cca080d41a7d11742eab4189587ca051208a7f Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 21:46:49 +0900 Subject: [PATCH 06/47] style(Application): private -> public for only main using methods, etc --- src/main/java/subway/Application.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 2d6355f06..ff5566ef1 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -25,11 +25,11 @@ public static void main(String[] args) { while (!exitFlag) { mainScreenPrint(); String mainInput = scanner.next(); - exitFlag = ValidateAndNextScreen(scanner, mainInput); + exitFlag = validateAndNextScreen(scanner, mainInput); } } - public static void initSetting() { + private static void initSetting() { final ArrayList initStations = new ArrayList<>( Arrays.asList("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역")); final ArrayList initLines = new ArrayList<>( @@ -43,7 +43,7 @@ public static void initSetting() { } } - public static void mainScreenPrint() { + private static void mainScreenPrint() { System.out.println("## 메인 화면\n" + "1. 역 관리\n" + "2. 노선 관리\n" @@ -54,7 +54,7 @@ public static void mainScreenPrint() { + "## 원하는 기능을 선택하세요."); } - public static boolean ValidateAndNextScreen(Scanner scanner, String mainInput) { + private static boolean validateAndNextScreen(Scanner scanner, String mainInput) { if (mainInput.equalsIgnoreCase(stationManageInput)) { stationManage(scanner); return false; From e32eb5323f48a8286eb7d7390a9449b850218093 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:01:18 +0900 Subject: [PATCH 07/47] feat(StationManage): add Station logic and error handling --- src/main/java/subway/StationManage.java | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/main/java/subway/StationManage.java diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java new file mode 100644 index 000000000..f02e38dd3 --- /dev/null +++ b/src/main/java/subway/StationManage.java @@ -0,0 +1,61 @@ +package subway; + +import static subway.domain.StationRepository.addStation; + +import java.util.Scanner; +import subway.domain.Station; + +public class StationManage { + static final String stationAddInput = "1"; + static final String stationDeleteInput = "2"; + static final String stationsGetInput = "3"; + static final String backScreenInput = "B"; + static final int stationNameMinLength = 2; + + static public void stationManage(Scanner scanner) { + stationManagePrint(); + boolean validateFlag = true; + String stationManageInput = scanner.next(); + validateFlag = inputValidate(scanner, stationManageInput); + + } + + private static boolean inputValidate(Scanner scanner, String mainInput) { + if (mainInput.equalsIgnoreCase(stationAddInput)) { + addStationPrint(scanner); + return true; + } + if (mainInput.equalsIgnoreCase(backScreenInput)) { + return true; + } + System.out.println("[ERROR] 선택할 수 없는 기능입니다."); + throw new IllegalArgumentException(); + } + + private static void addStationPrint(Scanner scanner) { + System.out.println("## 등록할 역 이름을 입력하세요."); + String stationName = scanner.next(); + if (!stationNameLengthValidate(stationName)) { + System.out.println("[ERROR] 역의 이름은 최소 2자 이상이어야 합니다."); + throw new IllegalArgumentException(); + } + addStation(new Station(stationName)); + } + + private static boolean stationNameLengthValidate(String stationName) { + if (stationName.length() < stationNameMinLength) { + return false; + } + return true; + } + + private static void stationManagePrint() { + System.out.println("## 역 관리 화면\n" + + "1. 역 등록\n" + + "2. 역 삭제\n" + + "3. 역 조회\n" + + "B. 돌아가기\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } +} From 57d9024f734cef4be5c25ad94db81f9f7efda13d Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:02:57 +0900 Subject: [PATCH 08/47] docs(README.md): delete incorrect plan for error handling --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4549f25ec..e035f3c46 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ - 맨 처음 사용자 입력값 1, 2, 3, 4, Q 검증 필요 - 이 외에도 단계별로 입력값 1, 2, 3, B 검증 필요 - 역 등록 시에 중복 검사 필요 -- 역 등록 시에 노선 이름 존재 유무 검증 필요 - 역 등록 시에 역 이름 길이 검증 필요 - 역 삭제 시에 역 이름 존재 유무 검증 필요 - 노선 등록 시에 중복 검사 필요 From 7f1a6e9a06cf7ff3ac4fb93723d375ba74190d98 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:10:55 +0900 Subject: [PATCH 09/47] feat(StationManage, StationRepository): for add Station error handling as duplicate stationName --- src/main/java/subway/StationManage.java | 24 ++++++++++++------- .../java/subway/domain/StationRepository.java | 4 ++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index f02e38dd3..9ea5508a6 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -1,11 +1,13 @@ package subway; import static subway.domain.StationRepository.addStation; +import static subway.domain.StationRepository.hasStation; import java.util.Scanner; import subway.domain.Station; public class StationManage { + static final String stationAddInput = "1"; static final String stationDeleteInput = "2"; static final String stationsGetInput = "3"; @@ -28,29 +30,35 @@ private static boolean inputValidate(Scanner scanner, String mainInput) { if (mainInput.equalsIgnoreCase(backScreenInput)) { return true; } - System.out.println("[ERROR] 선택할 수 없는 기능입니다."); + System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); throw new IllegalArgumentException(); } private static void addStationPrint(Scanner scanner) { - System.out.println("## 등록할 역 이름을 입력하세요."); + System.out.println("\n## 등록할 역 이름을 입력하세요."); String stationName = scanner.next(); if (!stationNameLengthValidate(stationName)) { - System.out.println("[ERROR] 역의 이름은 최소 2자 이상이어야 합니다."); + System.out.println("\n[ERROR] 역의 이름은 최소 2자 이상이어야 합니다. "); + throw new IllegalArgumentException(); + } + if (stationNameDuplicate(stationName)) { + System.out.println("\n[ERROR] 이미 등록된 역 이름입니다. "); throw new IllegalArgumentException(); } addStation(new Station(stationName)); + System.out.println("\n[INFO] 지하철 역이 등록되었습니다."); } private static boolean stationNameLengthValidate(String stationName) { - if (stationName.length() < stationNameMinLength) { - return false; - } - return true; + return stationName.length() >= stationNameMinLength; + } + + private static boolean stationNameDuplicate(String stationName) { + return hasStation(stationName); } private static void stationManagePrint() { - System.out.println("## 역 관리 화면\n" + System.out.println("\n## 역 관리 화면\n" + "1. 역 등록\n" + "2. 역 삭제\n" + "3. 역 조회\n" diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index b7245c0f3..d88e68ccb 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -19,4 +19,8 @@ public static void addStation(Station station) { public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } + + public static boolean hasStation(String name) { + return stations.contains(new Station(name)); + } } From 4d25308d94dc8b3e0ce5670f6f73c56dce35bb45 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:13:50 +0900 Subject: [PATCH 10/47] feat(StationManage): stationsDuplicate -> stationExists for using when delete station too and add deleteStationPrint method --- src/main/java/subway/StationManage.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 9ea5508a6..0f3058bc2 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -1,6 +1,7 @@ package subway; import static subway.domain.StationRepository.addStation; +import static subway.domain.StationRepository.deleteStation; import static subway.domain.StationRepository.hasStation; import java.util.Scanner; @@ -41,7 +42,7 @@ private static void addStationPrint(Scanner scanner) { System.out.println("\n[ERROR] 역의 이름은 최소 2자 이상이어야 합니다. "); throw new IllegalArgumentException(); } - if (stationNameDuplicate(stationName)) { + if (stationExists(stationName)) { System.out.println("\n[ERROR] 이미 등록된 역 이름입니다. "); throw new IllegalArgumentException(); } @@ -49,11 +50,22 @@ private static void addStationPrint(Scanner scanner) { System.out.println("\n[INFO] 지하철 역이 등록되었습니다."); } + private static void deleteStationPrint(Scanner scanner) { + System.out.println("\n## 삭제할 역 이름을 입력하세요."); + String stationName = scanner.next(); + if (!stationExists(stationName)) { + System.out.println("\n[ERROR] 존재하지 않는 역 이름입니다. "); + throw new IllegalArgumentException(); + } + deleteStation(stationName); + System.out.println("\n[INFO] 지하철 역이 삭제되었습니다."); + } + private static boolean stationNameLengthValidate(String stationName) { return stationName.length() >= stationNameMinLength; } - private static boolean stationNameDuplicate(String stationName) { + private static boolean stationExists(String stationName) { return hasStation(stationName); } From eab418eb86d6453b39f8edacd10afb648e708a3a Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:17:50 +0900 Subject: [PATCH 11/47] style(StationManage): change class constant format --- src/main/java/subway/StationManage.java | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 0f3058bc2..bbb54bdd4 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -9,11 +9,11 @@ public class StationManage { - static final String stationAddInput = "1"; - static final String stationDeleteInput = "2"; - static final String stationsGetInput = "3"; - static final String backScreenInput = "B"; - static final int stationNameMinLength = 2; + static final String ADD_STATION = "1"; + static final String DELETE_STATION = "2"; + static final String ALL_STATIONS = "3"; + static final String BACK_SCREEN = "B"; + static final int MIN_STATION_NAME_LENGTH = 2; static public void stationManage(Scanner scanner) { stationManagePrint(); @@ -24,11 +24,19 @@ static public void stationManage(Scanner scanner) { } private static boolean inputValidate(Scanner scanner, String mainInput) { - if (mainInput.equalsIgnoreCase(stationAddInput)) { + if (mainInput.equalsIgnoreCase(ADD_STATION)) { addStationPrint(scanner); return true; } - if (mainInput.equalsIgnoreCase(backScreenInput)) { + if (mainInput.equalsIgnoreCase(DELETE_STATION)) { + deleteStationPrint(scanner); + return true; + } + if (mainInput.equalsIgnoreCase(ALL_STATIONS)) { + //allStationsPrint(); + return true; + } + if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { return true; } System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); @@ -62,7 +70,7 @@ private static void deleteStationPrint(Scanner scanner) { } private static boolean stationNameLengthValidate(String stationName) { - return stationName.length() >= stationNameMinLength; + return stationName.length() >= MIN_STATION_NAME_LENGTH; } private static boolean stationExists(String stationName) { From 915a208e47315254ac37a56c392eb084d14be8da Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:44:15 +0900 Subject: [PATCH 12/47] feat(StationRepository): fix bug for hasStation --- src/main/java/subway/domain/StationRepository.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index d88e68ccb..6961c193e 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -6,6 +6,7 @@ import java.util.Objects; public class StationRepository { + private static final List stations = new ArrayList<>(); public static List stations() { @@ -21,6 +22,11 @@ public static boolean deleteStation(String name) { } public static boolean hasStation(String name) { - return stations.contains(new Station(name)); + for (Station station : stations) { + if (station.getName().equals(name)) { + return true; + } + } + return false; } } From ae1633d4fd02eadba1f161476d115b0be15c3431 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:45:12 +0900 Subject: [PATCH 13/47] feat(AllStationsPrint): add allStation show screen method --- src/main/java/subway/Application.java | 2 +- src/main/java/subway/StationManage.java | 12 +++++++++++- src/main/java/subway/domain/Station.java | 4 +++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index ff5566ef1..e854b4e65 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -44,7 +44,7 @@ private static void initSetting() { } private static void mainScreenPrint() { - System.out.println("## 메인 화면\n" + System.out.println("\n## 메인 화면\n" + "1. 역 관리\n" + "2. 노선 관리\n" + "3. 구간 관리\n" diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index bbb54bdd4..6be9748d1 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -3,7 +3,9 @@ import static subway.domain.StationRepository.addStation; import static subway.domain.StationRepository.deleteStation; import static subway.domain.StationRepository.hasStation; +import static subway.domain.StationRepository.stations; +import java.util.List; import java.util.Scanner; import subway.domain.Station; @@ -33,7 +35,7 @@ private static boolean inputValidate(Scanner scanner, String mainInput) { return true; } if (mainInput.equalsIgnoreCase(ALL_STATIONS)) { - //allStationsPrint(); + allStationsPrint(); return true; } if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { @@ -69,6 +71,14 @@ private static void deleteStationPrint(Scanner scanner) { System.out.println("\n[INFO] 지하철 역이 삭제되었습니다."); } + private static void allStationsPrint() { + System.out.println("\n## 역 목록"); + List allStations = stations(); + for (Station station : allStations) { + station.print(); + } + } + private static boolean stationNameLengthValidate(String stationName) { return stationName.length() >= MIN_STATION_NAME_LENGTH; } diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..1561e5516 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -11,5 +11,7 @@ public String getName() { return name; } - // 추가 기능 구현 + public void print() { + System.out.println("[INFO] "+this.name); + } } From 37148520138e75111c937e2b1671b83a96783563 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:50:33 +0900 Subject: [PATCH 14/47] style(StationManage): remove validateFlag --- src/main/java/subway/StationManage.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 6be9748d1..1327aaf7d 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -19,27 +19,25 @@ public class StationManage { static public void stationManage(Scanner scanner) { stationManagePrint(); - boolean validateFlag = true; String stationManageInput = scanner.next(); - validateFlag = inputValidate(scanner, stationManageInput); - + inputValidate(scanner, stationManageInput); } - private static boolean inputValidate(Scanner scanner, String mainInput) { + private static void inputValidate(Scanner scanner, String mainInput) { if (mainInput.equalsIgnoreCase(ADD_STATION)) { addStationPrint(scanner); - return true; + return; } if (mainInput.equalsIgnoreCase(DELETE_STATION)) { deleteStationPrint(scanner); - return true; + return; } if (mainInput.equalsIgnoreCase(ALL_STATIONS)) { allStationsPrint(); - return true; + return; } if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { - return true; + return; } System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); throw new IllegalArgumentException(); From b47dad810251ec0f9dfeb00a8b6491a481f60aeb Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 22:58:48 +0900 Subject: [PATCH 15/47] feat(LineManage): add LineManage interface --- src/main/java/subway/Application.java | 18 ++++++---- src/main/java/subway/LineManage.java | 48 +++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 src/main/java/subway/LineManage.java diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index e854b4e65..0413d5e85 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -12,11 +12,11 @@ public class Application { - static final String stationManageInput = "1"; - static final String lineManageInput = "2"; - static final String sectionManageInput = "3"; - static final String allLinesInfoPrintInput = "4"; - static final String exitInput = "Q"; + static final String STATION_MANAGE = "1"; + static final String LINE_MANAGE = "2"; + static final String SECTION_MANAGE = "3"; + static final String ALL_INFO = "4"; + static final String EXIT = "Q"; public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); @@ -55,11 +55,15 @@ private static void mainScreenPrint() { } private static boolean validateAndNextScreen(Scanner scanner, String mainInput) { - if (mainInput.equalsIgnoreCase(stationManageInput)) { + if (mainInput.equalsIgnoreCase(STATION_MANAGE)) { stationManage(scanner); return false; } - if (mainInput.equalsIgnoreCase(exitInput)) { + if (mainInput.equalsIgnoreCase(LINE_MANAGE)) { + stationManage(scanner); + return false; + } + if (mainInput.equalsIgnoreCase(EXIT)) { return true; } System.out.println("[ERROR] 선택할 수 없는 기능입니다."); diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java new file mode 100644 index 000000000..db3327f22 --- /dev/null +++ b/src/main/java/subway/LineManage.java @@ -0,0 +1,48 @@ +package subway; + +import java.util.Scanner; + +public class LineManage { + + static final String ADD_LINE = "1"; + static final String DELETE_LINE = "2"; + static final String ALL_LINES = "3"; + static final String BACK_SCREEN = "B"; + static final int MIN_LINE_NAME_LENGTH = 2; + + static public void lineManage(Scanner scanner) { + lineManagePrint(); + String lineManageInput = scanner.next(); + inputValidate(scanner, lineManageInput); + } + + private static boolean inputValidate(Scanner scanner, String mainInput) { + if (mainInput.equalsIgnoreCase(ADD_LINE)) { + //addLinePrint(scanner); + return true; + } + if (mainInput.equalsIgnoreCase(DELETE_LINE)) { + //deleteLinePrint(scanner); + return true; + } + if (mainInput.equalsIgnoreCase(ALL_LINES)) { + //allLinesPrint(); + return true; + } + if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { + return true; + } + System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); + throw new IllegalArgumentException(); + } + + private static void lineManagePrint() { + System.out.println("\n## 노선 관리 화면\n" + + "1. 노선 등록\n" + + "2. 노선 삭제\n" + + "3. 노선 조회\n" + + "B. 돌아가기\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } +} From 53dac3475cac1fd65bcefeabd156ecf852427c18 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:11:08 +0900 Subject: [PATCH 16/47] feat(LineManage): add Line method and error handling --- src/main/java/subway/Application.java | 4 +- src/main/java/subway/LineManage.java | 49 ++++++++++++++++++- .../java/subway/domain/LineRepository.java | 9 ++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0413d5e85..26a33e4c7 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,7 +1,9 @@ package subway; +import static subway.LineManage.linaManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; +import static subway.domain.LineRepository.lines; import static subway.domain.StationRepository.addStation; import java.util.ArrayList; @@ -60,7 +62,7 @@ private static boolean validateAndNextScreen(Scanner scanner, String mainInput) return false; } if (mainInput.equalsIgnoreCase(LINE_MANAGE)) { - stationManage(scanner); + linaManage(scanner); return false; } if (mainInput.equalsIgnoreCase(EXIT)) { diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index db3327f22..2a2df2f43 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -1,6 +1,11 @@ package subway; +import static subway.domain.LineRepository.addLine; +import static subway.domain.LineRepository.hasLine; +import static subway.domain.StationRepository.hasStation; + import java.util.Scanner; +import subway.domain.Line; public class LineManage { @@ -10,7 +15,7 @@ public class LineManage { static final String BACK_SCREEN = "B"; static final int MIN_LINE_NAME_LENGTH = 2; - static public void lineManage(Scanner scanner) { + static public void linaManage(Scanner scanner) { lineManagePrint(); String lineManageInput = scanner.next(); inputValidate(scanner, lineManageInput); @@ -18,7 +23,7 @@ static public void lineManage(Scanner scanner) { private static boolean inputValidate(Scanner scanner, String mainInput) { if (mainInput.equalsIgnoreCase(ADD_LINE)) { - //addLinePrint(scanner); + addLinePrint(scanner); return true; } if (mainInput.equalsIgnoreCase(DELETE_LINE)) { @@ -36,6 +41,46 @@ private static boolean inputValidate(Scanner scanner, String mainInput) { throw new IllegalArgumentException(); } + private static void addLinePrint(Scanner scanner) { + System.out.println("\n## 등록할 노선 이름을 입력하세요."); + String lineName = scanner.next(); + lineNameValidate(lineName); + System.out.println("\n## 등록할 노선의 상행 종점역 이름을 입력하세요."); + String upwardTerminal = scanner.next(); + terminalNameValidate(upwardTerminal); + System.out.println("\n## 등록할 노선의 하행 종점역 이름을 입력하세요."); + String downWardTerminal = scanner.next(); + terminalNameValidate(downWardTerminal); + addLine(new Line(lineName)); + System.out.println("\n[INFO] 지하철 노선이 등록되었습니다."); + } + + private static void lineNameValidate(String lineName) { + if (!lineNameLengthValidate(lineName)) { + System.out.println("\n[ERROR] 노선의 이름은 최소 2자 이상이어야 합니다. "); + throw new IllegalArgumentException(); + } + if(lineExists(lineName)) { + System.out.println("\n[ERROR] 이미 등록된 노선 이름입니다. "); + throw new IllegalArgumentException(); + } + } + + private static boolean lineNameLengthValidate(String lineName) { + return lineName.length() >= MIN_LINE_NAME_LENGTH; + } + + private static boolean lineExists(String lineName) { + return hasLine(lineName); + } + + private static void terminalNameValidate(String terminalName) { + if (!hasStation(terminalName)) { + System.out.println("\n[ERROR] 해당 역이 존재하지 않습니다. "); + throw new IllegalArgumentException(); + } + } + private static void lineManagePrint() { System.out.println("\n## 노선 관리 화면\n" + "1. 노선 등록\n" diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 49132ddb6..f9dbaaa10 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -19,4 +19,13 @@ public static void addLine(Line line) { public static boolean deleteLineByName(String name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } + + public static boolean hasLine(String name) { + for (Line line : lines) { + if (line.getName().equals(name)) { + return true; + } + } + return false; + } } From 6948401a38ae8fadf759c3799548bc36ea2e836e Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:13:26 +0900 Subject: [PATCH 17/47] feat(LineManage): add deleteLine method and error handling --- src/main/java/subway/LineManage.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index 2a2df2f43..54ba9d2a0 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -1,6 +1,7 @@ package subway; import static subway.domain.LineRepository.addLine; +import static subway.domain.LineRepository.deleteLineByName; import static subway.domain.LineRepository.hasLine; import static subway.domain.StationRepository.hasStation; @@ -27,7 +28,7 @@ private static boolean inputValidate(Scanner scanner, String mainInput) { return true; } if (mainInput.equalsIgnoreCase(DELETE_LINE)) { - //deleteLinePrint(scanner); + deleteLinePrint(scanner); return true; } if (mainInput.equalsIgnoreCase(ALL_LINES)) { @@ -55,6 +56,17 @@ private static void addLinePrint(Scanner scanner) { System.out.println("\n[INFO] 지하철 노선이 등록되었습니다."); } + private static void deleteLinePrint(Scanner scanner) { + System.out.println("\n## 삭제할 노선 이름을 입력하세요."); + String lineName = scanner.next(); + if (!lineExists(lineName)) { + System.out.println("\n[ERROR] 존재하지 않는 노선 이름입니다. "); + throw new IllegalArgumentException(); + } + deleteLineByName(lineName); + System.out.println("\n[INFO] 지하철 노선이 삭제되었습니다."); + } + private static void lineNameValidate(String lineName) { if (!lineNameLengthValidate(lineName)) { System.out.println("\n[ERROR] 노선의 이름은 최소 2자 이상이어야 합니다. "); From ff1975e7392254764128f29fd4f2244b8c833c6f Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:16:37 +0900 Subject: [PATCH 18/47] feat(LineManage): show all lines names --- src/main/java/subway/LineManage.java | 14 +++++++++++++- src/main/java/subway/domain/Line.java | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index 54ba9d2a0..e22a6fe64 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -3,10 +3,14 @@ import static subway.domain.LineRepository.addLine; import static subway.domain.LineRepository.deleteLineByName; import static subway.domain.LineRepository.hasLine; +import static subway.domain.LineRepository.lines; import static subway.domain.StationRepository.hasStation; +import static subway.domain.StationRepository.stations; +import java.util.List; import java.util.Scanner; import subway.domain.Line; +import subway.domain.Station; public class LineManage { @@ -32,7 +36,7 @@ private static boolean inputValidate(Scanner scanner, String mainInput) { return true; } if (mainInput.equalsIgnoreCase(ALL_LINES)) { - //allLinesPrint(); + allLinesPrint(); return true; } if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { @@ -78,6 +82,14 @@ private static void lineNameValidate(String lineName) { } } + private static void allLinesPrint() { + System.out.println("\n## 역 목록"); + List allLines = lines(); + for (Line line : allLines) { + line.print(); + } + } + private static boolean lineNameLengthValidate(String lineName) { return lineName.length() >= MIN_LINE_NAME_LENGTH; } diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..79fc684af 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -11,5 +11,7 @@ public String getName() { return name; } - // 추가 기능 구현 + public void print() { + System.out.println("[INFO] "+this.name); + } } From 8ce8d37e896d675a3818e8db79317d880deebb46 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:36:39 +0900 Subject: [PATCH 19/47] docs(README.md): add another plan --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e035f3c46..0954810ab 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,4 @@ - 노선 삭제 시에 역 이름 존재 유무 검증 필요 - 구간 등록/삭제 시 노선 유무 검증 필요 - 구간 등록/삭제 시 역 유무 검증 필요 +- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다. From e2d04f754b16810c8a7743944725e0f5f9bcfb42 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:37:37 +0900 Subject: [PATCH 20/47] feat(Line): add another generator for line --- src/main/java/subway/domain/Line.java | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 79fc684af..e7ee68318 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,17 +1,39 @@ package subway.domain; +import java.util.Arrays; +import java.util.LinkedList; + public class Line { - private String name; + private final String name; + private Station upwardTerminal; + private Station downwardTerminal; + private LinkedList terminals; public Line(String name) { this.name = name; + terminals = new LinkedList<>(); + } + public Line(String name, Station upwardTerminal, Station downwardTerminal) { + this.name = name; + this.upwardTerminal = upwardTerminal; + this.downwardTerminal = downwardTerminal; + terminals = new LinkedList(Arrays.asList(upwardTerminal, downwardTerminal)); + } public String getName() { return name; } - public void print() { + public void printName() { System.out.println("[INFO] "+this.name); } + + public void printAllInfo() { + printName(); + System.out.println("---"); + for(Station terminal : terminals) { + terminal.print(); + } + } } From 375a5b51e7eeaf8b1d68c1276e99123a083ac62e Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:42:31 +0900 Subject: [PATCH 21/47] feat(Line): remove another generator for line --- src/main/java/subway/domain/Line.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index e7ee68318..1eaa3731f 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -9,10 +9,6 @@ public class Line { private Station downwardTerminal; private LinkedList terminals; - public Line(String name) { - this.name = name; - terminals = new LinkedList<>(); - } public Line(String name, Station upwardTerminal, Station downwardTerminal) { this.name = name; this.upwardTerminal = upwardTerminal; From 2af739ece865ad5129c7beaafe512a794ded03a1 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:42:58 +0900 Subject: [PATCH 22/47] feat(LineManage): show all line info print --- src/main/java/subway/LineManage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index e22a6fe64..8a723597f 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -56,7 +56,7 @@ private static void addLinePrint(Scanner scanner) { System.out.println("\n## 등록할 노선의 하행 종점역 이름을 입력하세요."); String downWardTerminal = scanner.next(); terminalNameValidate(downWardTerminal); - addLine(new Line(lineName)); + addLine(new Line(lineName, new Station(upwardTerminal), new Station(downWardTerminal))); System.out.println("\n[INFO] 지하철 노선이 등록되었습니다."); } @@ -86,7 +86,7 @@ private static void allLinesPrint() { System.out.println("\n## 역 목록"); List allLines = lines(); for (Line line : allLines) { - line.print(); + line.printName(); } } From dbd54c4e12143895594a692515bdb2d4541614c4 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:43:40 +0900 Subject: [PATCH 23/47] feat(routeMapPrint): show all lines station info (4) --- src/main/java/subway/Application.java | 16 ++++++++++++---- src/main/java/subway/routeMap.java | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/main/java/subway/routeMap.java diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 26a33e4c7..67eb3868c 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -3,8 +3,8 @@ import static subway.LineManage.linaManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; -import static subway.domain.LineRepository.lines; import static subway.domain.StationRepository.addStation; +import static subway.routeMap.routeMapPrint; import java.util.ArrayList; import java.util.Arrays; @@ -40,9 +40,9 @@ private static void initSetting() { for (String stationName : initStations) { addStation(new Station(stationName)); } - for (String lineName : initLines) { - addLine(new Line(lineName)); - } + addLine(new Line("2호선", new Station("교대역"), new Station("역삼역"))); + addLine(new Line("3호선", new Station("교대역"), new Station("매봉역"))); + addLine(new Line("신분당선", new Station("강남역"), new Station("양재시민의숲역"))); } private static void mainScreenPrint() { @@ -65,6 +65,14 @@ private static boolean validateAndNextScreen(Scanner scanner, String mainInput) linaManage(scanner); return false; } + if (mainInput.equalsIgnoreCase(SECTION_MANAGE)) { + //sectionManage(scanner); + return false; + } + if (mainInput.equalsIgnoreCase(ALL_INFO)) { + routeMapPrint(); + return false; + } if (mainInput.equalsIgnoreCase(EXIT)) { return true; } diff --git a/src/main/java/subway/routeMap.java b/src/main/java/subway/routeMap.java new file mode 100644 index 000000000..a86ab23d8 --- /dev/null +++ b/src/main/java/subway/routeMap.java @@ -0,0 +1,17 @@ +package subway; + +import static subway.domain.LineRepository.lines; + +import java.util.List; +import subway.domain.Line; + +public class routeMap { + public static void routeMapPrint() { + System.out.println("\n## 지하철 노선도\n"); + + List allLines = lines(); + for (Line line : allLines) { + line.printAllInfo(); + } + } +} From aa0c70f689b59c5db2d30db42597c32aca8f4893 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:50:40 +0900 Subject: [PATCH 24/47] style(Manage): fix inputvalue variable name --- src/main/java/subway/LineManage.java | 13 ++++++------- src/main/java/subway/StationManage.java | 10 +++++----- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index 8a723597f..d82f37df5 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -5,7 +5,6 @@ import static subway.domain.LineRepository.hasLine; import static subway.domain.LineRepository.lines; import static subway.domain.StationRepository.hasStation; -import static subway.domain.StationRepository.stations; import java.util.List; import java.util.Scanner; @@ -26,20 +25,20 @@ static public void linaManage(Scanner scanner) { inputValidate(scanner, lineManageInput); } - private static boolean inputValidate(Scanner scanner, String mainInput) { - if (mainInput.equalsIgnoreCase(ADD_LINE)) { + private static boolean inputValidate(Scanner scanner, String lineManageInput) { + if (lineManageInput.equalsIgnoreCase(ADD_LINE)) { addLinePrint(scanner); return true; } - if (mainInput.equalsIgnoreCase(DELETE_LINE)) { + if (lineManageInput.equalsIgnoreCase(DELETE_LINE)) { deleteLinePrint(scanner); return true; } - if (mainInput.equalsIgnoreCase(ALL_LINES)) { + if (lineManageInput.equalsIgnoreCase(ALL_LINES)) { allLinesPrint(); return true; } - if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { + if (lineManageInput.equalsIgnoreCase(BACK_SCREEN)) { return true; } System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); @@ -76,7 +75,7 @@ private static void lineNameValidate(String lineName) { System.out.println("\n[ERROR] 노선의 이름은 최소 2자 이상이어야 합니다. "); throw new IllegalArgumentException(); } - if(lineExists(lineName)) { + if (lineExists(lineName)) { System.out.println("\n[ERROR] 이미 등록된 노선 이름입니다. "); throw new IllegalArgumentException(); } diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 1327aaf7d..cdaf01028 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -23,20 +23,20 @@ static public void stationManage(Scanner scanner) { inputValidate(scanner, stationManageInput); } - private static void inputValidate(Scanner scanner, String mainInput) { - if (mainInput.equalsIgnoreCase(ADD_STATION)) { + private static void inputValidate(Scanner scanner, String stationManageInput) { + if (stationManageInput.equalsIgnoreCase(ADD_STATION)) { addStationPrint(scanner); return; } - if (mainInput.equalsIgnoreCase(DELETE_STATION)) { + if (stationManageInput.equalsIgnoreCase(DELETE_STATION)) { deleteStationPrint(scanner); return; } - if (mainInput.equalsIgnoreCase(ALL_STATIONS)) { + if (stationManageInput.equalsIgnoreCase(ALL_STATIONS)) { allStationsPrint(); return; } - if (mainInput.equalsIgnoreCase(BACK_SCREEN)) { + if (stationManageInput.equalsIgnoreCase(BACK_SCREEN)) { return; } System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); From c775c4e2fac05c6025bb2fe7de1f2932be917798 Mon Sep 17 00:00:00 2001 From: amy choi Date: Tue, 15 Dec 2020 23:56:15 +0900 Subject: [PATCH 25/47] feat(SectionManage): section add method --- src/main/java/subway/Application.java | 3 +- src/main/java/subway/LineManage.java | 2 +- src/main/java/subway/SectionManage.java | 71 +++++++++++++++++++++++++ src/main/java/subway/StationManage.java | 2 +- 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/main/java/subway/SectionManage.java diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 67eb3868c..139a93521 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,6 +1,7 @@ package subway; import static subway.LineManage.linaManage; +import static subway.SectionManage.sectionManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; @@ -66,7 +67,7 @@ private static boolean validateAndNextScreen(Scanner scanner, String mainInput) return false; } if (mainInput.equalsIgnoreCase(SECTION_MANAGE)) { - //sectionManage(scanner); + sectionManage(scanner); return false; } if (mainInput.equalsIgnoreCase(ALL_INFO)) { diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index d82f37df5..56fc678b9 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -93,7 +93,7 @@ private static boolean lineNameLengthValidate(String lineName) { return lineName.length() >= MIN_LINE_NAME_LENGTH; } - private static boolean lineExists(String lineName) { + public static boolean lineExists(String lineName) { return hasLine(lineName); } diff --git a/src/main/java/subway/SectionManage.java b/src/main/java/subway/SectionManage.java new file mode 100644 index 000000000..c5630eff5 --- /dev/null +++ b/src/main/java/subway/SectionManage.java @@ -0,0 +1,71 @@ +package subway; + +import static subway.LineManage.lineExists; +import static subway.StationManage.stationExists; +import static subway.domain.LineRepository.deleteLineByName; + +import java.util.Scanner; + +public class SectionManage { + + static final String ADD_SECTION = "1"; + static final String DELETE_SECTION = "2"; + static final String BACK_SCREEN = "B"; + static final int MIN_TERMINAL_SIZE = 2; + + static public void sectionManage(Scanner scanner) { + sectionManagePrint(); + String sectionManageInput = scanner.next(); + inputValidate(scanner, sectionManageInput); + } + + private static void inputValidate(Scanner scanner, String sectionManageInput) { + if (sectionManageInput.equalsIgnoreCase(ADD_SECTION)) { + addSectionPrint(scanner); + return; + } + if (sectionManageInput.equalsIgnoreCase(DELETE_SECTION)) { + //deleteSectionPrint(scanner); + return; + } + if (sectionManageInput.equalsIgnoreCase(BACK_SCREEN)) { + return; + } + System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); + throw new IllegalArgumentException(); + } + + private static void addSectionPrint(Scanner scanner) { + System.out.println("\n## 노선 이름을 입력하세요."); + String lineName = scanner.next(); + if (!lineExists(lineName)) { + System.out.println("\n[ERROR] 존재하지 않는 노선 이름입니다. "); + throw new IllegalArgumentException(); + } + System.out.println("\n## 역 이름을 입력하세요."); + String terminalName = scanner.next(); + if (!stationExists(terminalName)) { + System.out.println("\n[ERROR] 존재하지 않는 역 이름입니다. "); + throw new IllegalArgumentException(); + } + System.out.println("\n## 순서를 입력하세요."); + try { + int position = scanner.nextInt(); + // position validate 필요 + } catch (Exception e) { + System.out.println("\n[ERROR] 잘못된 순서입니다. "); + throw new IllegalArgumentException(); + } + // linkedlist에 추가 필요 + System.out.println("\n[INFO] 지하철 노선이 삭제되었습니다."); + } + + private static void sectionManagePrint() { + System.out.println("\n## 구간 관리 화면\n" + + "1. 구간 등록\n" + + "2. 구간 삭제\n" + + "B. 돌아가기\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } +} diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index cdaf01028..a18a50610 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -81,7 +81,7 @@ private static boolean stationNameLengthValidate(String stationName) { return stationName.length() >= MIN_STATION_NAME_LENGTH; } - private static boolean stationExists(String stationName) { + public static boolean stationExists(String stationName) { return hasStation(stationName); } From c37e0fb22fdef6dfdedbe8bc07cd49a5aee2d48e Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 00:32:04 +0900 Subject: [PATCH 26/47] feat(Logger, ErrorCase, Application): seperate log print from application --- src/main/java/log/ErrorCase.java | 11 ++++++ src/main/java/log/Logger.java | 26 ++++++++++++++ src/main/java/subway/Application.java | 49 ++++++++++++++++----------- 3 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 src/main/java/log/ErrorCase.java create mode 100644 src/main/java/log/Logger.java diff --git a/src/main/java/log/ErrorCase.java b/src/main/java/log/ErrorCase.java new file mode 100644 index 000000000..439000ba6 --- /dev/null +++ b/src/main/java/log/ErrorCase.java @@ -0,0 +1,11 @@ +package log; + +public class ErrorCase { + public static final String FUNCTION_INPUT_ERROR = "선택할 수 없는 기능입니다.\n"; + public static final String ALREADY_EXIST_ERROR = "이미 등록된 역/노선 이름입니다.\n"; + public static final String NAME_LENGTH_ERROR = "이름을 2글자 이상 입력해주세요.\n"; + public static final String NO_SUCH_NAME_ERROR = "등록되지 않은 역/노선 이름입니다.\n"; + public static final String HAS_IN_LINE_ERROR = "노선에 등록된 역은 삭제할 수 없습니다.\n"; + public static final String TERMINAL_LENGTH_ERROR = "노선의 역 수는 2개 이상이어야 합니다."; + +} diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java new file mode 100644 index 000000000..a88b964ac --- /dev/null +++ b/src/main/java/log/Logger.java @@ -0,0 +1,26 @@ +package log; + +public class Logger { + + public static final String LEVEL_ERROR = "[ERROR] "; + public static final String LEVEL_INFO = "[INFO] "; + + public static void errorPrint(String errorBody) { + System.out.println(LEVEL_ERROR + errorBody); + } + + public static void infoPrint(String infoBody) { + System.out.println(LEVEL_INFO + infoBody); + } + + public static void displayMainScreen() { + System.out.println("\n## 메인 화면\n" + + "1. 역 관리\n" + + "2. 노선 관리\n" + + "3. 구간 관리\n" + + "4. 지하철 노선도 출력\n" + + "Q. 종료\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } +} diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 139a93521..1deb0cfab 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,7 +1,9 @@ package subway; +import static log.ErrorCase.FUNCTION_INPUT_ERROR; +import static log.Logger.displayMainScreen; +import static log.Logger.errorPrint; import static subway.LineManage.linaManage; -import static subway.SectionManage.sectionManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; @@ -9,6 +11,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedList; import java.util.Scanner; import subway.domain.Line; import subway.domain.Station; @@ -26,9 +29,9 @@ public static void main(String[] args) { initSetting(); boolean exitFlag = false; while (!exitFlag) { - mainScreenPrint(); + displayMainScreen(); String mainInput = scanner.next(); - exitFlag = validateAndNextScreen(scanner, mainInput); + exitFlag = checkInput(scanner, mainInput); } } @@ -41,23 +44,29 @@ private static void initSetting() { for (String stationName : initStations) { addStation(new Station(stationName)); } - addLine(new Line("2호선", new Station("교대역"), new Station("역삼역"))); - addLine(new Line("3호선", new Station("교대역"), new Station("매봉역"))); - addLine(new Line("신분당선", new Station("강남역"), new Station("양재시민의숲역"))); + addLine(new Line("2호선", + new LinkedList(Arrays.asList( + new Station("교대역"), + new Station("강남역"), + new Station("역삼역") + )))); + addLine(new Line("3호선", + new LinkedList(Arrays.asList( + new Station("교대역"), + new Station("남부터미널역"), + new Station("양재역"), + new Station("매봉역") + )))); + addLine(new Line("3호선", + new LinkedList(Arrays.asList( + new Station("신분당선"), + new Station("강남역"), + new Station("양재역"), + new Station("양재시민의숲역") + )))); } - private static void mainScreenPrint() { - System.out.println("\n## 메인 화면\n" - + "1. 역 관리\n" - + "2. 노선 관리\n" - + "3. 구간 관리\n" - + "4. 지하철 노선도 출력\n" - + "Q. 종료\n" - + "\n" - + "## 원하는 기능을 선택하세요."); - } - - private static boolean validateAndNextScreen(Scanner scanner, String mainInput) { + private static boolean checkInput(Scanner scanner, String mainInput) { if (mainInput.equalsIgnoreCase(STATION_MANAGE)) { stationManage(scanner); return false; @@ -67,7 +76,7 @@ private static boolean validateAndNextScreen(Scanner scanner, String mainInput) return false; } if (mainInput.equalsIgnoreCase(SECTION_MANAGE)) { - sectionManage(scanner); + //sectionManage(scanner); return false; } if (mainInput.equalsIgnoreCase(ALL_INFO)) { @@ -77,7 +86,7 @@ private static boolean validateAndNextScreen(Scanner scanner, String mainInput) if (mainInput.equalsIgnoreCase(EXIT)) { return true; } - System.out.println("[ERROR] 선택할 수 없는 기능입니다."); + errorPrint(FUNCTION_INPUT_ERROR); throw new IllegalArgumentException(); } } From 11989b6733fd3b95fe7e182920765723549ccf30 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 00:32:46 +0900 Subject: [PATCH 27/47] feat(Line): add another generator parameter for LinkedList --- src/main/java/subway/domain/Line.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 1eaa3731f..9d324afb0 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -4,17 +4,22 @@ import java.util.LinkedList; public class Line { + private final String name; private Station upwardTerminal; private Station downwardTerminal; - private LinkedList terminals; + private final LinkedList terminals; public Line(String name, Station upwardTerminal, Station downwardTerminal) { this.name = name; this.upwardTerminal = upwardTerminal; this.downwardTerminal = downwardTerminal; terminals = new LinkedList(Arrays.asList(upwardTerminal, downwardTerminal)); + } + public Line(String name, LinkedList terminals) { + this.name = name; + this.terminals = terminals; } public String getName() { @@ -22,13 +27,13 @@ public String getName() { } public void printName() { - System.out.println("[INFO] "+this.name); + System.out.println("[INFO] " + this.name); } public void printAllInfo() { printName(); System.out.println("---"); - for(Station terminal : terminals) { + for (Station terminal : terminals) { terminal.print(); } } From 62728c064b747483597f6fb5bfc6b5d037e891cd Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 00:38:08 +0900 Subject: [PATCH 28/47] style(Application): shorten code line --- src/main/java/subway/Application.java | 30 +++++++-------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 1deb0cfab..bf70daede 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -38,32 +38,18 @@ public static void main(String[] args) { private static void initSetting() { final ArrayList initStations = new ArrayList<>( Arrays.asList("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역")); - final ArrayList initLines = new ArrayList<>( - Arrays.asList("2호선", "3호선", "신분당선")); for (String stationName : initStations) { addStation(new Station(stationName)); } - addLine(new Line("2호선", - new LinkedList(Arrays.asList( - new Station("교대역"), - new Station("강남역"), - new Station("역삼역") - )))); - addLine(new Line("3호선", - new LinkedList(Arrays.asList( - new Station("교대역"), - new Station("남부터미널역"), - new Station("양재역"), - new Station("매봉역") - )))); - addLine(new Line("3호선", - new LinkedList(Arrays.asList( - new Station("신분당선"), - new Station("강남역"), - new Station("양재역"), - new Station("양재시민의숲역") - )))); + addLine(new Line("2호선", new LinkedList(Arrays.asList( + new Station("교대역"), new Station("강남역"), new Station("역삼역"))))); + addLine(new Line("3호선", new LinkedList(Arrays.asList( + new Station("교대역"), new Station("남부터미널역"), + new Station("양재역"), new Station("매봉역"))))); + addLine(new Line("3호선", new LinkedList(Arrays.asList( + new Station("신분당선"), new Station("강남역"), + new Station("양재역"), new Station("양재시민의숲역"))))); } private static boolean checkInput(Scanner scanner, String mainInput) { From d1118d51b728cdd291b769ad9e160473684bc781 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 00:49:46 +0900 Subject: [PATCH 29/47] feat(log): add guide print method and fix error body --- src/main/java/log/ErrorCase.java | 10 +++++----- src/main/java/log/Logger.java | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/log/ErrorCase.java b/src/main/java/log/ErrorCase.java index 439000ba6..29b710008 100644 --- a/src/main/java/log/ErrorCase.java +++ b/src/main/java/log/ErrorCase.java @@ -1,11 +1,11 @@ package log; public class ErrorCase { - public static final String FUNCTION_INPUT_ERROR = "선택할 수 없는 기능입니다.\n"; - public static final String ALREADY_EXIST_ERROR = "이미 등록된 역/노선 이름입니다.\n"; - public static final String NAME_LENGTH_ERROR = "이름을 2글자 이상 입력해주세요.\n"; - public static final String NO_SUCH_NAME_ERROR = "등록되지 않은 역/노선 이름입니다.\n"; - public static final String HAS_IN_LINE_ERROR = "노선에 등록된 역은 삭제할 수 없습니다.\n"; + public static final String FUNCTION_INPUT_ERROR = "선택할 수 없는 기능입니다."; + public static final String ALREADY_EXIST_ERROR = "이미 등록된 역/노선 이름입니다."; + public static final String NAME_LENGTH_ERROR = "역/노선의 이름은 최소 2자 이상이어야 합니다."; + public static final String NO_SUCH_NAME_ERROR = "등록되지 않은 역/노선 이름입니다."; + public static final String HAS_IN_LINE_ERROR = "노선에 등록된 역은 삭제할 수 없습니다."; public static final String TERMINAL_LENGTH_ERROR = "노선의 역 수는 2개 이상이어야 합니다."; } diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java index a88b964ac..69e884257 100644 --- a/src/main/java/log/Logger.java +++ b/src/main/java/log/Logger.java @@ -1,9 +1,13 @@ package log; public class Logger { + public static final String LEVEL_GUIDE = "\n## "; + public static final String LEVEL_ERROR = "\n[ERROR] "; + public static final String LEVEL_INFO = "\n[INFO] "; - public static final String LEVEL_ERROR = "[ERROR] "; - public static final String LEVEL_INFO = "[INFO] "; + public static void guidePrint(String errorBody) { + System.out.println(LEVEL_GUIDE + errorBody); + } public static void errorPrint(String errorBody) { System.out.println(LEVEL_ERROR + errorBody); @@ -23,4 +27,14 @@ public static void displayMainScreen() { + "\n" + "## 원하는 기능을 선택하세요."); } + + public static void displayLineManageScreen() { + System.out.println("\n## 노선 관리 화면\n" + + "1. 노선 등록\n" + + "2. 노선 삭제\n" + + "3. 노선 조회\n" + + "B. 돌아가기\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } } From 447d49f70cf5018cb1b01fc4d5b7b8c1ffa61a7d Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 00:50:38 +0900 Subject: [PATCH 30/47] style(LineManage): System.out.println -> logger class print methods --- src/main/java/subway/LineManage.java | 71 ++++++++++++++-------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index 56fc678b9..dbcd9892d 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -1,5 +1,13 @@ package subway; +import static log.ErrorCase.ALREADY_EXIST_ERROR; +import static log.ErrorCase.FUNCTION_INPUT_ERROR; +import static log.ErrorCase.NAME_LENGTH_ERROR; +import static log.ErrorCase.NO_SUCH_NAME_ERROR; +import static log.Logger.displayLineManageScreen; +import static log.Logger.errorPrint; +import static log.Logger.guidePrint; +import static log.Logger.infoPrint; import static subway.domain.LineRepository.addLine; import static subway.domain.LineRepository.deleteLineByName; import static subway.domain.LineRepository.hasLine; @@ -20,75 +28,78 @@ public class LineManage { static final int MIN_LINE_NAME_LENGTH = 2; static public void linaManage(Scanner scanner) { - lineManagePrint(); + displayLineManageScreen(); String lineManageInput = scanner.next(); inputValidate(scanner, lineManageInput); } private static boolean inputValidate(Scanner scanner, String lineManageInput) { if (lineManageInput.equalsIgnoreCase(ADD_LINE)) { - addLinePrint(scanner); + addLineControl(scanner); return true; } if (lineManageInput.equalsIgnoreCase(DELETE_LINE)) { - deleteLinePrint(scanner); + deleteLineControl(scanner); return true; } if (lineManageInput.equalsIgnoreCase(ALL_LINES)) { - allLinesPrint(); + allLinesControl(); return true; } if (lineManageInput.equalsIgnoreCase(BACK_SCREEN)) { return true; } - System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); + errorPrint(FUNCTION_INPUT_ERROR); throw new IllegalArgumentException(); } - private static void addLinePrint(Scanner scanner) { - System.out.println("\n## 등록할 노선 이름을 입력하세요."); + private static void addLineControl(Scanner scanner) { + guidePrint("등록할 노선 이름을 입력하세요. "); String lineName = scanner.next(); lineNameValidate(lineName); - System.out.println("\n## 등록할 노선의 상행 종점역 이름을 입력하세요."); + + guidePrint("등록할 노선의 상행 종점역 이름을 입력하세요. "); String upwardTerminal = scanner.next(); terminalNameValidate(upwardTerminal); - System.out.println("\n## 등록할 노선의 하행 종점역 이름을 입력하세요."); + + guidePrint("등록할 노선의 하행 종점역 이름을 입력하세요. "); String downWardTerminal = scanner.next(); terminalNameValidate(downWardTerminal); + addLine(new Line(lineName, new Station(upwardTerminal), new Station(downWardTerminal))); - System.out.println("\n[INFO] 지하철 노선이 등록되었습니다."); + infoPrint("지하철 노선이 등록되었습니다."); } - private static void deleteLinePrint(Scanner scanner) { - System.out.println("\n## 삭제할 노선 이름을 입력하세요."); + private static void deleteLineControl(Scanner scanner) { + guidePrint("삭제할 노선 이름을 입력하세요. "); String lineName = scanner.next(); if (!lineExists(lineName)) { - System.out.println("\n[ERROR] 존재하지 않는 노선 이름입니다. "); + errorPrint(NO_SUCH_NAME_ERROR); throw new IllegalArgumentException(); } deleteLineByName(lineName); - System.out.println("\n[INFO] 지하철 노선이 삭제되었습니다."); + infoPrint("지하철 노선이 삭제되었습니다. "); + } + + private static void allLinesControl() { + guidePrint("역 목록"); + List allLines = lines(); + for (Line line : allLines) { + line.printName(); + } } private static void lineNameValidate(String lineName) { if (!lineNameLengthValidate(lineName)) { - System.out.println("\n[ERROR] 노선의 이름은 최소 2자 이상이어야 합니다. "); + errorPrint(NAME_LENGTH_ERROR); throw new IllegalArgumentException(); } if (lineExists(lineName)) { - System.out.println("\n[ERROR] 이미 등록된 노선 이름입니다. "); + errorPrint(ALREADY_EXIST_ERROR); throw new IllegalArgumentException(); } } - private static void allLinesPrint() { - System.out.println("\n## 역 목록"); - List allLines = lines(); - for (Line line : allLines) { - line.printName(); - } - } - private static boolean lineNameLengthValidate(String lineName) { return lineName.length() >= MIN_LINE_NAME_LENGTH; } @@ -99,18 +110,8 @@ public static boolean lineExists(String lineName) { private static void terminalNameValidate(String terminalName) { if (!hasStation(terminalName)) { - System.out.println("\n[ERROR] 해당 역이 존재하지 않습니다. "); + errorPrint(NO_SUCH_NAME_ERROR); throw new IllegalArgumentException(); } } - - private static void lineManagePrint() { - System.out.println("\n## 노선 관리 화면\n" - + "1. 노선 등록\n" - + "2. 노선 삭제\n" - + "3. 노선 조회\n" - + "B. 돌아가기\n" - + "\n" - + "## 원하는 기능을 선택하세요."); - } } From 8f20d968c2103297ea42139a498743ae36efe69e Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 00:59:31 +0900 Subject: [PATCH 31/47] style(StationManage): seperate manage screen print method, and logger print add --- src/main/java/log/Logger.java | 10 +++++++ src/main/java/subway/StationManage.java | 38 ++++++++++++------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java index 69e884257..8bd51acff 100644 --- a/src/main/java/log/Logger.java +++ b/src/main/java/log/Logger.java @@ -28,6 +28,16 @@ public static void displayMainScreen() { + "## 원하는 기능을 선택하세요."); } + public static void displayStationManageScreen() { + System.out.println("\n## 역 관리 화면\n" + + "1. 역 등록\n" + + "2. 역 삭제\n" + + "3. 역 조회\n" + + "B. 돌아가기\n" + + "\n" + + "## 원하는 기능을 선택하세요."); + } + public static void displayLineManageScreen() { System.out.println("\n## 노선 관리 화면\n" + "1. 노선 등록\n" diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index a18a50610..3b4b663cb 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -1,5 +1,13 @@ package subway; +import static log.ErrorCase.ALREADY_EXIST_ERROR; +import static log.ErrorCase.FUNCTION_INPUT_ERROR; +import static log.ErrorCase.NAME_LENGTH_ERROR; +import static log.ErrorCase.NO_SUCH_NAME_ERROR; +import static log.Logger.displayStationManageScreen; +import static log.Logger.errorPrint; +import static log.Logger.guidePrint; +import static log.Logger.infoPrint; import static subway.domain.StationRepository.addStation; import static subway.domain.StationRepository.deleteStation; import static subway.domain.StationRepository.hasStation; @@ -18,7 +26,7 @@ public class StationManage { static final int MIN_STATION_NAME_LENGTH = 2; static public void stationManage(Scanner scanner) { - stationManagePrint(); + displayStationManageScreen(); String stationManageInput = scanner.next(); inputValidate(scanner, stationManageInput); } @@ -39,38 +47,38 @@ private static void inputValidate(Scanner scanner, String stationManageInput) { if (stationManageInput.equalsIgnoreCase(BACK_SCREEN)) { return; } - System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); + errorPrint(FUNCTION_INPUT_ERROR); throw new IllegalArgumentException(); } private static void addStationPrint(Scanner scanner) { - System.out.println("\n## 등록할 역 이름을 입력하세요."); + guidePrint("등록할 역 이름을 입력하세요. "); String stationName = scanner.next(); if (!stationNameLengthValidate(stationName)) { - System.out.println("\n[ERROR] 역의 이름은 최소 2자 이상이어야 합니다. "); + errorPrint(NAME_LENGTH_ERROR); throw new IllegalArgumentException(); } if (stationExists(stationName)) { - System.out.println("\n[ERROR] 이미 등록된 역 이름입니다. "); + errorPrint(ALREADY_EXIST_ERROR); throw new IllegalArgumentException(); } addStation(new Station(stationName)); - System.out.println("\n[INFO] 지하철 역이 등록되었습니다."); + infoPrint("지하철 역이 등록되었습니다. "); } private static void deleteStationPrint(Scanner scanner) { - System.out.println("\n## 삭제할 역 이름을 입력하세요."); + guidePrint("삭제할 역 이름을 입력하세요. "); String stationName = scanner.next(); if (!stationExists(stationName)) { - System.out.println("\n[ERROR] 존재하지 않는 역 이름입니다. "); + errorPrint(NO_SUCH_NAME_ERROR); throw new IllegalArgumentException(); } deleteStation(stationName); - System.out.println("\n[INFO] 지하철 역이 삭제되었습니다."); + infoPrint("지하철 역이 삭제되었습니다. "); } private static void allStationsPrint() { - System.out.println("\n## 역 목록"); + guidePrint("역 목록"); List allStations = stations(); for (Station station : allStations) { station.print(); @@ -84,14 +92,4 @@ private static boolean stationNameLengthValidate(String stationName) { public static boolean stationExists(String stationName) { return hasStation(stationName); } - - private static void stationManagePrint() { - System.out.println("\n## 역 관리 화면\n" - + "1. 역 등록\n" - + "2. 역 삭제\n" - + "3. 역 조회\n" - + "B. 돌아가기\n" - + "\n" - + "## 원하는 기능을 선택하세요."); - } } From aaf8c2c71d302c75c25f38838c32607a31f4e78b Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 02:00:31 +0900 Subject: [PATCH 32/47] fix(Application): remove error throw --- src/main/java/subway/Application.java | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index bf70daede..fbf613030 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -4,6 +4,7 @@ import static log.Logger.displayMainScreen; import static log.Logger.errorPrint; import static subway.LineManage.linaManage; +import static subway.SectionManage.sectionManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; @@ -31,7 +32,11 @@ public static void main(String[] args) { while (!exitFlag) { displayMainScreen(); String mainInput = scanner.next(); - exitFlag = checkInput(scanner, mainInput); + + if (mainInput.equalsIgnoreCase(EXIT)) { + exitFlag = true; + } + checkInput(scanner, mainInput); } } @@ -52,27 +57,23 @@ private static void initSetting() { new Station("양재역"), new Station("양재시민의숲역"))))); } - private static boolean checkInput(Scanner scanner, String mainInput) { + private static void checkInput(Scanner scanner, String mainInput) { if (mainInput.equalsIgnoreCase(STATION_MANAGE)) { stationManage(scanner); - return false; + return; } if (mainInput.equalsIgnoreCase(LINE_MANAGE)) { linaManage(scanner); - return false; + return; } if (mainInput.equalsIgnoreCase(SECTION_MANAGE)) { - //sectionManage(scanner); - return false; + sectionManage(scanner); + return; } if (mainInput.equalsIgnoreCase(ALL_INFO)) { routeMapPrint(); - return false; - } - if (mainInput.equalsIgnoreCase(EXIT)) { - return true; + return; } errorPrint(FUNCTION_INPUT_ERROR); - throw new IllegalArgumentException(); } } From 71da82ac95bbef3ad7b68f7d22d338fc54da6c36 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 02:20:35 +0900 Subject: [PATCH 33/47] fix(StationManage): remove throw error handling and print -> control --- src/main/java/subway/StationManage.java | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 3b4b663cb..596500601 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -33,51 +33,50 @@ static public void stationManage(Scanner scanner) { private static void inputValidate(Scanner scanner, String stationManageInput) { if (stationManageInput.equalsIgnoreCase(ADD_STATION)) { - addStationPrint(scanner); + addStationControl(scanner); return; } if (stationManageInput.equalsIgnoreCase(DELETE_STATION)) { - deleteStationPrint(scanner); + deleteStationControl(scanner); return; } if (stationManageInput.equalsIgnoreCase(ALL_STATIONS)) { - allStationsPrint(); + allStationsContol(); return; } if (stationManageInput.equalsIgnoreCase(BACK_SCREEN)) { return; } errorPrint(FUNCTION_INPUT_ERROR); - throw new IllegalArgumentException(); } - private static void addStationPrint(Scanner scanner) { + private static void addStationControl(Scanner scanner) { guidePrint("등록할 역 이름을 입력하세요. "); String stationName = scanner.next(); if (!stationNameLengthValidate(stationName)) { errorPrint(NAME_LENGTH_ERROR); - throw new IllegalArgumentException(); + return; } if (stationExists(stationName)) { errorPrint(ALREADY_EXIST_ERROR); - throw new IllegalArgumentException(); + return; } addStation(new Station(stationName)); infoPrint("지하철 역이 등록되었습니다. "); } - private static void deleteStationPrint(Scanner scanner) { + private static void deleteStationControl(Scanner scanner) { guidePrint("삭제할 역 이름을 입력하세요. "); String stationName = scanner.next(); if (!stationExists(stationName)) { errorPrint(NO_SUCH_NAME_ERROR); - throw new IllegalArgumentException(); + return; } deleteStation(stationName); infoPrint("지하철 역이 삭제되었습니다. "); } - private static void allStationsPrint() { + private static void allStationsContol() { guidePrint("역 목록"); List allStations = stations(); for (Station station : allStations) { @@ -89,7 +88,7 @@ private static boolean stationNameLengthValidate(String stationName) { return stationName.length() >= MIN_STATION_NAME_LENGTH; } - public static boolean stationExists(String stationName) { + private static boolean stationExists(String stationName) { return hasStation(stationName); } } From 75f05823207a67dcc47de415de48579e9f52c965 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 02:55:28 +0900 Subject: [PATCH 34/47] feat(Logger), fix(Application): seperate input screen from main --- src/main/java/log/Logger.java | 33 ++++++++++++++++++++++----- src/main/java/subway/Application.java | 32 ++++++++++++-------------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java index 8bd51acff..912a09e87 100644 --- a/src/main/java/log/Logger.java +++ b/src/main/java/log/Logger.java @@ -1,5 +1,10 @@ package log; +import static log.ErrorCase.FUNCTION_INPUT_ERROR; + +import java.util.List; +import java.util.Scanner; + public class Logger { public static final String LEVEL_GUIDE = "\n## "; public static final String LEVEL_ERROR = "\n[ERROR] "; @@ -28,14 +33,25 @@ public static void displayMainScreen() { + "## 원하는 기능을 선택하세요."); } + public static String displayInputScreen(Scanner scanner, List whiteList) { + String input; + while(true) { + guidePrint("원하는 기능을 선택하세요."); + input = scanner.next(); + if (whiteList.contains(input)) { + break; + } + errorPrint(FUNCTION_INPUT_ERROR); + } + return input; + } + public static void displayStationManageScreen() { System.out.println("\n## 역 관리 화면\n" + "1. 역 등록\n" + "2. 역 삭제\n" + "3. 역 조회\n" - + "B. 돌아가기\n" - + "\n" - + "## 원하는 기능을 선택하세요."); + + "B. 돌아가기"); } public static void displayLineManageScreen() { @@ -43,8 +59,13 @@ public static void displayLineManageScreen() { + "1. 노선 등록\n" + "2. 노선 삭제\n" + "3. 노선 조회\n" - + "B. 돌아가기\n" - + "\n" - + "## 원하는 기능을 선택하세요."); + + "B. 돌아가기"); + } + + public static void displaySectionManageScreen() { + System.out.println("\n## 구간 관리 화면\n" + + "1. 구간 등록\n" + + "2. 구간 삭제\n" + + "B. 돌아가기"); } } diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index fbf613030..278f1a16f 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,8 +1,7 @@ package subway; -import static log.ErrorCase.FUNCTION_INPUT_ERROR; +import static log.Logger.displayInputScreen; import static log.Logger.displayMainScreen; -import static log.Logger.errorPrint; import static subway.LineManage.linaManage; import static subway.SectionManage.sectionManage; import static subway.StationManage.stationManage; @@ -31,12 +30,7 @@ public static void main(String[] args) { boolean exitFlag = false; while (!exitFlag) { displayMainScreen(); - String mainInput = scanner.next(); - - if (mainInput.equalsIgnoreCase(EXIT)) { - exitFlag = true; - } - checkInput(scanner, mainInput); + exitFlag = isExit(scanner); } } @@ -57,23 +51,25 @@ private static void initSetting() { new Station("양재역"), new Station("양재시민의숲역"))))); } - private static void checkInput(Scanner scanner, String mainInput) { - if (mainInput.equalsIgnoreCase(STATION_MANAGE)) { + private static boolean isExit(Scanner scanner) { + String input = displayInputScreen(scanner, new ArrayList<>(Arrays.asList( + STATION_MANAGE, LINE_MANAGE, SECTION_MANAGE, ALL_INFO, EXIT))); + + if (input.equalsIgnoreCase(EXIT)) { + return true; + } + if (input.equalsIgnoreCase(STATION_MANAGE)) { stationManage(scanner); - return; } - if (mainInput.equalsIgnoreCase(LINE_MANAGE)) { + if (input.equalsIgnoreCase(LINE_MANAGE)) { linaManage(scanner); - return; } - if (mainInput.equalsIgnoreCase(SECTION_MANAGE)) { + if (input.equalsIgnoreCase(SECTION_MANAGE)) { sectionManage(scanner); - return; } - if (mainInput.equalsIgnoreCase(ALL_INFO)) { + if (input.equalsIgnoreCase(ALL_INFO)) { routeMapPrint(); - return; } - errorPrint(FUNCTION_INPUT_ERROR); + return false; } } From 9eb5937230e4f4ba422aced4cb17305e7c6941fa Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 02:58:13 +0900 Subject: [PATCH 35/47] style(Logger, Application) --- src/main/java/log/Logger.java | 4 +--- src/main/java/subway/Application.java | 13 ++++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java index 912a09e87..10b690a3c 100644 --- a/src/main/java/log/Logger.java +++ b/src/main/java/log/Logger.java @@ -28,9 +28,7 @@ public static void displayMainScreen() { + "2. 노선 관리\n" + "3. 구간 관리\n" + "4. 지하철 노선도 출력\n" - + "Q. 종료\n" - + "\n" - + "## 원하는 기능을 선택하세요."); + + "Q. 종료"); } public static String displayInputScreen(Scanner scanner, List whiteList) { diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 278f1a16f..28e98f252 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -3,7 +3,6 @@ import static log.Logger.displayInputScreen; import static log.Logger.displayMainScreen; import static subway.LineManage.linaManage; -import static subway.SectionManage.sectionManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; @@ -55,19 +54,19 @@ private static boolean isExit(Scanner scanner) { String input = displayInputScreen(scanner, new ArrayList<>(Arrays.asList( STATION_MANAGE, LINE_MANAGE, SECTION_MANAGE, ALL_INFO, EXIT))); - if (input.equalsIgnoreCase(EXIT)) { + if (input.equals(EXIT)) { return true; } - if (input.equalsIgnoreCase(STATION_MANAGE)) { + if (input.equals(STATION_MANAGE)) { stationManage(scanner); } - if (input.equalsIgnoreCase(LINE_MANAGE)) { + if (input.equals(LINE_MANAGE)) { linaManage(scanner); } - if (input.equalsIgnoreCase(SECTION_MANAGE)) { - sectionManage(scanner); + if (input.equals(SECTION_MANAGE)) { + //sectionManage(scanner); } - if (input.equalsIgnoreCase(ALL_INFO)) { + if (input.equals(ALL_INFO)) { routeMapPrint(); } return false; From 6fea827e9f15c307caa4a9c77248f4bc4987acf8 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 03:24:59 +0900 Subject: [PATCH 36/47] feat(Application): seperate displayInputScreen from stationManage --- src/main/java/subway/StationManage.java | 34 ++++++++++++++----------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 596500601..b22093438 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -1,9 +1,10 @@ package subway; import static log.ErrorCase.ALREADY_EXIST_ERROR; -import static log.ErrorCase.FUNCTION_INPUT_ERROR; import static log.ErrorCase.NAME_LENGTH_ERROR; import static log.ErrorCase.NO_SUCH_NAME_ERROR; +import static log.Logger.displayInputScreen; +import static log.Logger.displayMainScreen; import static log.Logger.displayStationManageScreen; import static log.Logger.errorPrint; import static log.Logger.guidePrint; @@ -13,6 +14,8 @@ import static subway.domain.StationRepository.hasStation; import static subway.domain.StationRepository.stations; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Scanner; import subway.domain.Station; @@ -26,28 +29,29 @@ public class StationManage { static final int MIN_STATION_NAME_LENGTH = 2; static public void stationManage(Scanner scanner) { - displayStationManageScreen(); - String stationManageInput = scanner.next(); - inputValidate(scanner, stationManageInput); + boolean exitFlag = false; + while (!exitFlag) { + displayStationManageScreen(); + exitFlag = isExit(scanner); + } } - private static void inputValidate(Scanner scanner, String stationManageInput) { - if (stationManageInput.equalsIgnoreCase(ADD_STATION)) { + private static boolean isExit(Scanner scanner) { + String input = displayInputScreen(scanner, new ArrayList<>(Arrays.asList( + ADD_STATION, DELETE_STATION, ALL_STATIONS, BACK_SCREEN))); + if (input.equals(BACK_SCREEN)) { + return true; + } + if (input.equals(ADD_STATION)) { addStationControl(scanner); - return; } - if (stationManageInput.equalsIgnoreCase(DELETE_STATION)) { + if (input.equals(DELETE_STATION)) { deleteStationControl(scanner); - return; } - if (stationManageInput.equalsIgnoreCase(ALL_STATIONS)) { + if (input.equals(ALL_STATIONS)) { allStationsContol(); - return; - } - if (stationManageInput.equalsIgnoreCase(BACK_SCREEN)) { - return; } - errorPrint(FUNCTION_INPUT_ERROR); + return false; } private static void addStationControl(Scanner scanner) { From 230aeb44fdaf7979a0dd0b32d25f0cc4da331617 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 03:31:40 +0900 Subject: [PATCH 37/47] fix(StationManage): return false when error generate --- src/main/java/subway/StationManage.java | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index b22093438..871ea6b80 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -4,7 +4,6 @@ import static log.ErrorCase.NAME_LENGTH_ERROR; import static log.ErrorCase.NO_SUCH_NAME_ERROR; import static log.Logger.displayInputScreen; -import static log.Logger.displayMainScreen; import static log.Logger.displayStationManageScreen; import static log.Logger.errorPrint; import static log.Logger.guidePrint; @@ -43,49 +42,52 @@ private static boolean isExit(Scanner scanner) { return true; } if (input.equals(ADD_STATION)) { - addStationControl(scanner); + return addStationControl(scanner); } if (input.equals(DELETE_STATION)) { - deleteStationControl(scanner); + return deleteStationControl(scanner); } if (input.equals(ALL_STATIONS)) { - allStationsContol(); + return allStationsContol(); } return false; } - private static void addStationControl(Scanner scanner) { + private static boolean addStationControl(Scanner scanner) { guidePrint("등록할 역 이름을 입력하세요. "); String stationName = scanner.next(); if (!stationNameLengthValidate(stationName)) { errorPrint(NAME_LENGTH_ERROR); - return; + return false; } if (stationExists(stationName)) { errorPrint(ALREADY_EXIST_ERROR); - return; + return false; } addStation(new Station(stationName)); infoPrint("지하철 역이 등록되었습니다. "); + return true; } - private static void deleteStationControl(Scanner scanner) { + private static boolean deleteStationControl(Scanner scanner) { guidePrint("삭제할 역 이름을 입력하세요. "); String stationName = scanner.next(); if (!stationExists(stationName)) { errorPrint(NO_SUCH_NAME_ERROR); - return; + return false; } deleteStation(stationName); infoPrint("지하철 역이 삭제되었습니다. "); + return true; } - private static void allStationsContol() { + private static boolean allStationsContol() { guidePrint("역 목록"); List allStations = stations(); for (Station station : allStations) { station.print(); } + return true; } private static boolean stationNameLengthValidate(String stationName) { From 12f3d39caae8a6169dbb2f914e57209ad3275c99 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 03:52:25 +0900 Subject: [PATCH 38/47] style(Logger, StationManage): logger formatting --- src/main/java/log/Logger.java | 6 +++--- src/main/java/subway/StationManage.java | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java index 10b690a3c..869632229 100644 --- a/src/main/java/log/Logger.java +++ b/src/main/java/log/Logger.java @@ -11,7 +11,7 @@ public class Logger { public static final String LEVEL_INFO = "\n[INFO] "; public static void guidePrint(String errorBody) { - System.out.println(LEVEL_GUIDE + errorBody); + System.out.print(LEVEL_GUIDE + errorBody); } public static void errorPrint(String errorBody) { @@ -19,7 +19,7 @@ public static void errorPrint(String errorBody) { } public static void infoPrint(String infoBody) { - System.out.println(LEVEL_INFO + infoBody); + System.out.print(LEVEL_INFO + infoBody); } public static void displayMainScreen() { @@ -34,7 +34,7 @@ public static void displayMainScreen() { public static String displayInputScreen(Scanner scanner, List whiteList) { String input; while(true) { - guidePrint("원하는 기능을 선택하세요."); + guidePrint("원하는 기능을 선택하세요.\n"); input = scanner.next(); if (whiteList.contains(input)) { break; diff --git a/src/main/java/subway/StationManage.java b/src/main/java/subway/StationManage.java index 871ea6b80..c0c8a646c 100644 --- a/src/main/java/subway/StationManage.java +++ b/src/main/java/subway/StationManage.java @@ -54,7 +54,7 @@ private static boolean isExit(Scanner scanner) { } private static boolean addStationControl(Scanner scanner) { - guidePrint("등록할 역 이름을 입력하세요. "); + guidePrint("등록할 역 이름을 입력하세요. \n"); String stationName = scanner.next(); if (!stationNameLengthValidate(stationName)) { errorPrint(NAME_LENGTH_ERROR); @@ -65,24 +65,24 @@ private static boolean addStationControl(Scanner scanner) { return false; } addStation(new Station(stationName)); - infoPrint("지하철 역이 등록되었습니다. "); + infoPrint("지하철 역이 등록되었습니다. \n"); return true; } private static boolean deleteStationControl(Scanner scanner) { - guidePrint("삭제할 역 이름을 입력하세요. "); + guidePrint("삭제할 역 이름을 입력하세요. \n"); String stationName = scanner.next(); if (!stationExists(stationName)) { errorPrint(NO_SUCH_NAME_ERROR); return false; } deleteStation(stationName); - infoPrint("지하철 역이 삭제되었습니다. "); + infoPrint("지하철 역이 삭제되었습니다. \n"); return true; } private static boolean allStationsContol() { - guidePrint("역 목록"); + guidePrint("역 목록\n"); List allStations = stations(); for (Station station : allStations) { station.print(); From e96eaa7d8cd3f875e04676166981387bef5c40ee Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 03:57:09 +0900 Subject: [PATCH 39/47] fix(initSetiing) --- src/main/java/subway/Application.java | 5 +- src/main/java/subway/LineManage.java | 101 ++++++++++++++------------ 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 28e98f252..f4783cb03 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -45,9 +45,8 @@ private static void initSetting() { addLine(new Line("3호선", new LinkedList(Arrays.asList( new Station("교대역"), new Station("남부터미널역"), new Station("양재역"), new Station("매봉역"))))); - addLine(new Line("3호선", new LinkedList(Arrays.asList( - new Station("신분당선"), new Station("강남역"), - new Station("양재역"), new Station("양재시민의숲역"))))); + addLine(new Line("신분당선", new LinkedList(Arrays.asList( + new Station("강남역"), new Station("양재역"), new Station("양재시민의숲역"))))); } private static boolean isExit(Scanner scanner) { diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index dbcd9892d..5d5331387 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -1,9 +1,9 @@ package subway; import static log.ErrorCase.ALREADY_EXIST_ERROR; -import static log.ErrorCase.FUNCTION_INPUT_ERROR; import static log.ErrorCase.NAME_LENGTH_ERROR; import static log.ErrorCase.NO_SUCH_NAME_ERROR; +import static log.Logger.displayInputScreen; import static log.Logger.displayLineManageScreen; import static log.Logger.errorPrint; import static log.Logger.guidePrint; @@ -14,6 +14,8 @@ import static subway.domain.LineRepository.lines; import static subway.domain.StationRepository.hasStation; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Scanner; import subway.domain.Line; @@ -28,90 +30,97 @@ public class LineManage { static final int MIN_LINE_NAME_LENGTH = 2; static public void linaManage(Scanner scanner) { - displayLineManageScreen(); - String lineManageInput = scanner.next(); - inputValidate(scanner, lineManageInput); + boolean exitFlag = false; + while (!exitFlag) { + displayLineManageScreen(); + exitFlag = isExit(scanner); + } } - private static boolean inputValidate(Scanner scanner, String lineManageInput) { - if (lineManageInput.equalsIgnoreCase(ADD_LINE)) { - addLineControl(scanner); - return true; - } - if (lineManageInput.equalsIgnoreCase(DELETE_LINE)) { - deleteLineControl(scanner); - return true; + private static boolean isExit(Scanner scanner) { + String input = displayInputScreen(scanner, new ArrayList<>(Arrays.asList( + ADD_LINE, DELETE_LINE, ALL_LINES, BACK_SCREEN))); + if (input.equalsIgnoreCase(ADD_LINE)) { + return addLineControl(scanner); } - if (lineManageInput.equalsIgnoreCase(ALL_LINES)) { - allLinesControl(); - return true; + if (input.equalsIgnoreCase(DELETE_LINE)) { + return deleteLineControl(scanner); } - if (lineManageInput.equalsIgnoreCase(BACK_SCREEN)) { - return true; + if (input.equalsIgnoreCase(ALL_LINES)) { + return allLinesControl(); } - errorPrint(FUNCTION_INPUT_ERROR); - throw new IllegalArgumentException(); + return input.equalsIgnoreCase(BACK_SCREEN); } - private static void addLineControl(Scanner scanner) { - guidePrint("등록할 노선 이름을 입력하세요. "); + private static boolean addLineControl(Scanner scanner) { + guidePrint("등록할 노선 이름을 입력하세요. \n"); String lineName = scanner.next(); - lineNameValidate(lineName); - - guidePrint("등록할 노선의 상행 종점역 이름을 입력하세요. "); + if (!validateLineName(lineName)) { + return false; + } + guidePrint("등록할 노선의 상행 종점역 이름을 입력하세요. \n"); String upwardTerminal = scanner.next(); - terminalNameValidate(upwardTerminal); - - guidePrint("등록할 노선의 하행 종점역 이름을 입력하세요. "); + if (!validateTerminalName(upwardTerminal)) { + return false; + } + guidePrint("등록할 노선의 하행 종점역 이름을 입력하세요. \n"); String downWardTerminal = scanner.next(); - terminalNameValidate(downWardTerminal); - + if (!validateTerminalName(downWardTerminal)) { + return false; + } addLine(new Line(lineName, new Station(upwardTerminal), new Station(downWardTerminal))); - infoPrint("지하철 노선이 등록되었습니다."); + infoPrint("지하철 노선이 등록되었습니다. \n"); + return true; } - private static void deleteLineControl(Scanner scanner) { - guidePrint("삭제할 노선 이름을 입력하세요. "); + private static boolean deleteLineControl(Scanner scanner) { + guidePrint("삭제할 노선 이름을 입력하세요. \n"); String lineName = scanner.next(); if (!lineExists(lineName)) { errorPrint(NO_SUCH_NAME_ERROR); - throw new IllegalArgumentException(); + return false; } deleteLineByName(lineName); - infoPrint("지하철 노선이 삭제되었습니다. "); + infoPrint("지하철 노선이 삭제되었습니다. \n"); + return true; } - private static void allLinesControl() { - guidePrint("역 목록"); + private static boolean allLinesControl() { + guidePrint("노선 목록"); List allLines = lines(); for (Line line : allLines) { line.printName(); } + System.out.println(); + return true; } - private static void lineNameValidate(String lineName) { + private static boolean validateLineName(String lineName) { if (!lineNameLengthValidate(lineName)) { errorPrint(NAME_LENGTH_ERROR); - throw new IllegalArgumentException(); + return false; } if (lineExists(lineName)) { errorPrint(ALREADY_EXIST_ERROR); - throw new IllegalArgumentException(); + return false; } + return true; + } + + private static boolean validateTerminalName(String terminalName) { + if (!hasStation(terminalName)) { + errorPrint(NO_SUCH_NAME_ERROR); + return false; + } + return true; } private static boolean lineNameLengthValidate(String lineName) { return lineName.length() >= MIN_LINE_NAME_LENGTH; } - public static boolean lineExists(String lineName) { + private static boolean lineExists(String lineName) { return hasLine(lineName); } - private static void terminalNameValidate(String terminalName) { - if (!hasStation(terminalName)) { - errorPrint(NO_SUCH_NAME_ERROR); - throw new IllegalArgumentException(); - } - } } From 227636509eeb231a76bdd909eecd7cb6662ae1d3 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 03:57:37 +0900 Subject: [PATCH 40/47] style(routeMap) --- src/main/java/subway/routeMap.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/subway/routeMap.java b/src/main/java/subway/routeMap.java index a86ab23d8..a4c200d2a 100644 --- a/src/main/java/subway/routeMap.java +++ b/src/main/java/subway/routeMap.java @@ -1,5 +1,6 @@ package subway; +import static log.Logger.guidePrint; import static subway.domain.LineRepository.lines; import java.util.List; @@ -7,7 +8,7 @@ public class routeMap { public static void routeMapPrint() { - System.out.println("\n## 지하철 노선도\n"); + guidePrint("지하철 노선도"); List allLines = lines(); for (Line line : allLines) { From e64fc55145e99de18dc4124e97a6fd6600e78081 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:06:42 +0900 Subject: [PATCH 41/47] feat(ERrorCase): add error cases --- src/main/java/log/ErrorCase.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/log/ErrorCase.java b/src/main/java/log/ErrorCase.java index 29b710008..63cbd1fec 100644 --- a/src/main/java/log/ErrorCase.java +++ b/src/main/java/log/ErrorCase.java @@ -1,11 +1,12 @@ package log; public class ErrorCase { - public static final String FUNCTION_INPUT_ERROR = "선택할 수 없는 기능입니다."; - public static final String ALREADY_EXIST_ERROR = "이미 등록된 역/노선 이름입니다."; - public static final String NAME_LENGTH_ERROR = "역/노선의 이름은 최소 2자 이상이어야 합니다."; - public static final String NO_SUCH_NAME_ERROR = "등록되지 않은 역/노선 이름입니다."; - public static final String HAS_IN_LINE_ERROR = "노선에 등록된 역은 삭제할 수 없습니다."; - public static final String TERMINAL_LENGTH_ERROR = "노선의 역 수는 2개 이상이어야 합니다."; + public static final String FUNCTION_INPUT_ERROR = "선택할 수 없는 기능입니다. "; + public static final String ALREADY_EXIST_ERROR = "이미 등록된 역/노선 이름입니다. "; + public static final String NAME_LENGTH_ERROR = "역/노선의 이름은 최소 2자 이상이어야 합니다. "; + public static final String NO_SUCH_NAME_ERROR = "등록되지 않은 역/노선 이름입니다. "; + public static final String INVALID_POSITION_ERROR = "잘못된 위치값입니다. "; + public static final String HAS_IN_LINE_ERROR = "노선에 등록된 역은 삭제할 수 없습니다. "; + public static final String TERMINAL_LENGTH_ERROR = "노선의 역 수는 2개 이상이어야 합니다. "; } From cbc64136c458fcea99bb74b08a56482254857fc8 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:07:29 +0900 Subject: [PATCH 42/47] style(LineManage): equaulsIgnoreCase -> equals --- src/main/java/subway/LineManage.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/subway/LineManage.java b/src/main/java/subway/LineManage.java index 5d5331387..3133fc78e 100644 --- a/src/main/java/subway/LineManage.java +++ b/src/main/java/subway/LineManage.java @@ -40,16 +40,16 @@ static public void linaManage(Scanner scanner) { private static boolean isExit(Scanner scanner) { String input = displayInputScreen(scanner, new ArrayList<>(Arrays.asList( ADD_LINE, DELETE_LINE, ALL_LINES, BACK_SCREEN))); - if (input.equalsIgnoreCase(ADD_LINE)) { + if (input.equals(ADD_LINE)) { return addLineControl(scanner); } - if (input.equalsIgnoreCase(DELETE_LINE)) { + if (input.equals(DELETE_LINE)) { return deleteLineControl(scanner); } - if (input.equalsIgnoreCase(ALL_LINES)) { + if (input.equals(ALL_LINES)) { return allLinesControl(); } - return input.equalsIgnoreCase(BACK_SCREEN); + return input.equals(BACK_SCREEN); } private static boolean addLineControl(Scanner scanner) { From 63cd450fdb9d35b49d33b3e0a509d730293eb3fa Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:10:35 +0900 Subject: [PATCH 43/47] feat(SectionManage): add section(terminal) method --- src/main/java/subway/Application.java | 3 +- src/main/java/subway/SectionManage.java | 122 +++++++++++++++--------- 2 files changed, 81 insertions(+), 44 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index f4783cb03..fdb68add2 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -3,6 +3,7 @@ import static log.Logger.displayInputScreen; import static log.Logger.displayMainScreen; import static subway.LineManage.linaManage; +import static subway.SectionManage.sectionManage; import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; @@ -63,7 +64,7 @@ private static boolean isExit(Scanner scanner) { linaManage(scanner); } if (input.equals(SECTION_MANAGE)) { - //sectionManage(scanner); + sectionManage(scanner); } if (input.equals(ALL_INFO)) { routeMapPrint(); diff --git a/src/main/java/subway/SectionManage.java b/src/main/java/subway/SectionManage.java index c5630eff5..aa12e72f7 100644 --- a/src/main/java/subway/SectionManage.java +++ b/src/main/java/subway/SectionManage.java @@ -1,71 +1,107 @@ package subway; -import static subway.LineManage.lineExists; -import static subway.StationManage.stationExists; -import static subway.domain.LineRepository.deleteLineByName; +import static log.ErrorCase.ALREADY_EXIST_ERROR; +import static log.ErrorCase.INVALID_POSITION_ERROR; +import static log.ErrorCase.NO_SUCH_NAME_ERROR; +import static log.Logger.displayInputScreen; +import static log.Logger.displaySectionManageScreen; +import static log.Logger.errorPrint; +import static log.Logger.guidePrint; +import static log.Logger.infoPrint; +import static subway.domain.LineRepository.getLineByName; +import static subway.domain.StationRepository.getStationByName; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Scanner; +import subway.domain.Line; +import subway.domain.Station; public class SectionManage { static final String ADD_SECTION = "1"; static final String DELETE_SECTION = "2"; static final String BACK_SCREEN = "B"; - static final int MIN_TERMINAL_SIZE = 2; + static final int MIN_LINE_LENGTH = 2; + static boolean errorFlag = false; static public void sectionManage(Scanner scanner) { - sectionManagePrint(); - String sectionManageInput = scanner.next(); - inputValidate(scanner, sectionManageInput); + boolean exitFlag = false; + while (!exitFlag) { + displaySectionManageScreen(); + exitFlag = isExit(scanner); + } } - private static void inputValidate(Scanner scanner, String sectionManageInput) { - if (sectionManageInput.equalsIgnoreCase(ADD_SECTION)) { - addSectionPrint(scanner); - return; + private static boolean isExit(Scanner scanner) { + String input = displayInputScreen(scanner, new ArrayList<>(Arrays.asList( + ADD_SECTION, DELETE_SECTION, BACK_SCREEN))); + if (input.equals(ADD_SECTION)) { + return addSectionControl(scanner); } - if (sectionManageInput.equalsIgnoreCase(DELETE_SECTION)) { - //deleteSectionPrint(scanner); - return; + if (input.equals(DELETE_SECTION)) { + //return deleteSectionPrint(scanner); } - if (sectionManageInput.equalsIgnoreCase(BACK_SCREEN)) { - return; + if (input.equals(BACK_SCREEN)) { + return true; } - System.out.println("\n[ERROR] 선택할 수 없는 기능입니다."); - throw new IllegalArgumentException(); + return false; } - private static void addSectionPrint(Scanner scanner) { - System.out.println("\n## 노선 이름을 입력하세요."); + private static boolean addSectionControl(Scanner scanner) { + errorFlag = false; + Line line = inputLine(scanner); + if (errorFlag) { + return false; + } + Station terminal = inputTerminal(scanner, line); + if (errorFlag) { + return false; + } + int position = inputPosition(scanner, line.getLength()); + if (errorFlag) { + return false; + } + line.addTerminal(position - 1, terminal); + infoPrint("구간이 등록되었습니다. \n"); + return true; + } + + private static Line inputLine(Scanner scanner) { + guidePrint("노선 이름을 입력하세요. \n"); String lineName = scanner.next(); - if (!lineExists(lineName)) { - System.out.println("\n[ERROR] 존재하지 않는 노선 이름입니다. "); - throw new IllegalArgumentException(); + Line line = getLineByName(lineName); + if (line == null) { + errorPrint(NO_SUCH_NAME_ERROR); + errorFlag = true; } - System.out.println("\n## 역 이름을 입력하세요."); + return line; + } + + private static Station inputTerminal(Scanner scanner, Line line) { + guidePrint("역 이름을 입력하세요. \n"); String terminalName = scanner.next(); - if (!stationExists(terminalName)) { - System.out.println("\n[ERROR] 존재하지 않는 역 이름입니다. "); - throw new IllegalArgumentException(); + Station terminal = getStationByName(terminalName); + if (terminal == null) { + errorPrint(NO_SUCH_NAME_ERROR); + errorFlag = true; } - System.out.println("\n## 순서를 입력하세요."); - try { - int position = scanner.nextInt(); - // position validate 필요 - } catch (Exception e) { - System.out.println("\n[ERROR] 잘못된 순서입니다. "); - throw new IllegalArgumentException(); + if (line.hasTerminal(terminalName)) { + errorPrint(ALREADY_EXIST_ERROR); + errorFlag = true; } - // linkedlist에 추가 필요 - System.out.println("\n[INFO] 지하철 노선이 삭제되었습니다."); + return terminal; } - private static void sectionManagePrint() { - System.out.println("\n## 구간 관리 화면\n" - + "1. 구간 등록\n" - + "2. 구간 삭제\n" - + "B. 돌아가기\n" - + "\n" - + "## 원하는 기능을 선택하세요."); + private static int inputPosition(Scanner scanner, int max) { + guidePrint("순서를 입력하세요. \n"); + final int MIN_POSITION = 1; + final int MAX_POSITION = max + 1; + int position = scanner.nextInt(); + if (position < MIN_POSITION || position > MAX_POSITION) { + errorPrint(INVALID_POSITION_ERROR); + errorFlag = true; + } + return position; } } From 1ef4b70b8ff771e27f35f04a73558fa3c383a988 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:12:32 +0900 Subject: [PATCH 44/47] feat(Line, LIneRepository, StationRepository): for help section add method(get Line by name...etc) --- src/main/java/subway/SectionManage.java | 5 +--- src/main/java/subway/domain/Line.java | 29 +++++++++++++++++-- .../java/subway/domain/LineRepository.java | 9 ++++++ .../java/subway/domain/StationRepository.java | 9 ++++++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main/java/subway/SectionManage.java b/src/main/java/subway/SectionManage.java index aa12e72f7..042258d9a 100644 --- a/src/main/java/subway/SectionManage.java +++ b/src/main/java/subway/SectionManage.java @@ -42,10 +42,7 @@ private static boolean isExit(Scanner scanner) { if (input.equals(DELETE_SECTION)) { //return deleteSectionPrint(scanner); } - if (input.equals(BACK_SCREEN)) { - return true; - } - return false; + return input.equals(BACK_SCREEN); } private static boolean addSectionControl(Scanner scanner) { diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 9d324afb0..50f5610cc 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,14 +1,16 @@ package subway.domain; +import static log.Logger.infoPrint; + import java.util.Arrays; import java.util.LinkedList; public class Line { private final String name; + private final LinkedList terminals; private Station upwardTerminal; private Station downwardTerminal; - private final LinkedList terminals; public Line(String name, Station upwardTerminal, Station downwardTerminal) { this.name = name; @@ -26,13 +28,34 @@ public String getName() { return name; } + public int getLength() { + return terminals.size(); + } + + public boolean hasTerminal(String terminalName) { + for (Station terminal : terminals) { + if (terminal.getName().equals(terminalName)) { + return true; + } + } + return false; + } + + public void addTerminal(int position, Station newTerminal) { + terminals.add(position, newTerminal); + } + + public void deleteTerminal(String terminalName) { + terminals.removeIf(terminal -> terminal.getName().equals(terminalName)); + } + public void printName() { - System.out.println("[INFO] " + this.name); + infoPrint(this.name); } public void printAllInfo() { printName(); - System.out.println("---"); + infoPrint("---\n"); for (Station terminal : terminals) { terminal.print(); } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index f9dbaaa10..045f9122b 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -28,4 +28,13 @@ public static boolean hasLine(String name) { } return false; } + + public static Line getLineByName(String name) { + for (Line line : lines) { + if (line.getName().equals(name)) { + return line; + } + } + return null; + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 6961c193e..6400ccaf8 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -29,4 +29,13 @@ public static boolean hasStation(String name) { } return false; } + + public static Station getStationByName(String name) { + for (Station station : stations) { + if (station.getName().equals(name)) { + return station; + } + } + return null; + } } From 29c83f0d3949c31b3ab3dc95dc221d3483353cc7 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:13:59 +0900 Subject: [PATCH 45/47] fix(Line): delete upwardTerminal, downwardTerminal instance variables --- src/main/java/subway/domain/Line.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 50f5610cc..96c69f73e 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -9,13 +9,9 @@ public class Line { private final String name; private final LinkedList terminals; - private Station upwardTerminal; - private Station downwardTerminal; public Line(String name, Station upwardTerminal, Station downwardTerminal) { this.name = name; - this.upwardTerminal = upwardTerminal; - this.downwardTerminal = downwardTerminal; terminals = new LinkedList(Arrays.asList(upwardTerminal, downwardTerminal)); } From 3a1c0cdc52a422426fa90d5dd4e3091ca1086106 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:45:57 +0900 Subject: [PATCH 46/47] feat(Application, SectionManage): add delete terminal, fix init setting --- src/main/java/subway/Application.java | 9 ++-- src/main/java/subway/SectionManage.java | 61 +++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index fdb68add2..1d47822b9 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -7,6 +7,7 @@ import static subway.StationManage.stationManage; import static subway.domain.LineRepository.addLine; import static subway.domain.StationRepository.addStation; +import static subway.domain.StationRepository.getStationByName; import static subway.routeMap.routeMapPrint; import java.util.ArrayList; @@ -42,12 +43,12 @@ private static void initSetting() { addStation(new Station(stationName)); } addLine(new Line("2호선", new LinkedList(Arrays.asList( - new Station("교대역"), new Station("강남역"), new Station("역삼역"))))); + getStationByName("교대역"), getStationByName("강남역"), getStationByName("역삼역"))))); addLine(new Line("3호선", new LinkedList(Arrays.asList( - new Station("교대역"), new Station("남부터미널역"), - new Station("양재역"), new Station("매봉역"))))); + getStationByName("교대역"), getStationByName("남부터미널역"), getStationByName("양재역"), + getStationByName("매봉역"))))); addLine(new Line("신분당선", new LinkedList(Arrays.asList( - new Station("강남역"), new Station("양재역"), new Station("양재시민의숲역"))))); + getStationByName("강남역"), getStationByName("양재역"), getStationByName("양재시민의숲역"))))); } private static boolean isExit(Scanner scanner) { diff --git a/src/main/java/subway/SectionManage.java b/src/main/java/subway/SectionManage.java index 042258d9a..4d059e360 100644 --- a/src/main/java/subway/SectionManage.java +++ b/src/main/java/subway/SectionManage.java @@ -3,6 +3,7 @@ import static log.ErrorCase.ALREADY_EXIST_ERROR; import static log.ErrorCase.INVALID_POSITION_ERROR; import static log.ErrorCase.NO_SUCH_NAME_ERROR; +import static log.ErrorCase.TERMINAL_LENGTH_ERROR; import static log.Logger.displayInputScreen; import static log.Logger.displaySectionManageScreen; import static log.Logger.errorPrint; @@ -40,18 +41,18 @@ private static boolean isExit(Scanner scanner) { return addSectionControl(scanner); } if (input.equals(DELETE_SECTION)) { - //return deleteSectionPrint(scanner); + return deleteSectionControl(scanner); } return input.equals(BACK_SCREEN); } private static boolean addSectionControl(Scanner scanner) { errorFlag = false; - Line line = inputLine(scanner); + Line line = inputAddLine(scanner); if (errorFlag) { return false; } - Station terminal = inputTerminal(scanner, line); + Station terminal = inputAddTerminal(scanner, line); if (errorFlag) { return false; } @@ -64,7 +65,22 @@ private static boolean addSectionControl(Scanner scanner) { return true; } - private static Line inputLine(Scanner scanner) { + private static boolean deleteSectionControl(Scanner scanner) { + errorFlag = false; + Line line = inputDeleteLine(scanner); + if (errorFlag) { + return false; + } + String terminalName = inputDeleteTerminal(scanner, line); + if (errorFlag) { + return false; + } + line.deleteTerminal(terminalName); + infoPrint("구간이 삭제되었습니다. \n"); + return true; + } + + private static Line inputAddLine(Scanner scanner) { guidePrint("노선 이름을 입력하세요. \n"); String lineName = scanner.next(); Line line = getLineByName(lineName); @@ -75,13 +91,14 @@ private static Line inputLine(Scanner scanner) { return line; } - private static Station inputTerminal(Scanner scanner, Line line) { + private static Station inputAddTerminal(Scanner scanner, Line line) { guidePrint("역 이름을 입력하세요. \n"); String terminalName = scanner.next(); Station terminal = getStationByName(terminalName); if (terminal == null) { errorPrint(NO_SUCH_NAME_ERROR); errorFlag = true; + return null; } if (line.hasTerminal(terminalName)) { errorPrint(ALREADY_EXIST_ERROR); @@ -90,6 +107,40 @@ private static Station inputTerminal(Scanner scanner, Line line) { return terminal; } + private static Line inputDeleteLine(Scanner scanner) { + guidePrint("삭제할 구간의 노선을 입력하세요. \n"); + String lineName = scanner.next(); + Line line = getLineByName(lineName); + if (line == null) { + errorPrint(NO_SUCH_NAME_ERROR); + errorFlag = true; + return null; + } + if (line.getLength() <= 2) { + errorPrint(TERMINAL_LENGTH_ERROR); + errorFlag = true; + return null; + } + return line; + } + + private static String inputDeleteTerminal(Scanner scanner, Line line) { + guidePrint("삭제할 구간의 역을 입력하세요. \n"); + String terminalName = scanner.next(); + Station terminal = getStationByName(terminalName); + if (terminal == null) { + errorPrint(NO_SUCH_NAME_ERROR); + errorFlag = true; + return null; + } + if (!line.hasTerminal(terminalName)) { + errorPrint(NO_SUCH_NAME_ERROR); + errorFlag = true; + return null; + } + return terminalName; + } + private static int inputPosition(Scanner scanner, int max) { guidePrint("순서를 입력하세요. \n"); final int MIN_POSITION = 1; From 7f8b0061bb217897633e37fe001a930aefe5c094 Mon Sep 17 00:00:00 2001 From: amy choi Date: Wed, 16 Dec 2020 22:46:09 +0900 Subject: [PATCH 47/47] style(Logger, Station) --- src/main/java/log/Logger.java | 2 +- src/main/java/subway/domain/Station.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/log/Logger.java b/src/main/java/log/Logger.java index 869632229..cba5572c2 100644 --- a/src/main/java/log/Logger.java +++ b/src/main/java/log/Logger.java @@ -33,7 +33,7 @@ public static void displayMainScreen() { public static String displayInputScreen(Scanner scanner, List whiteList) { String input; - while(true) { + while (true) { guidePrint("원하는 기능을 선택하세요.\n"); input = scanner.next(); if (whiteList.contains(input)) { diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index 1561e5516..c7c47ee05 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -12,6 +12,6 @@ public String getName() { } public void print() { - System.out.println("[INFO] "+this.name); + System.out.println("[INFO] " + this.name); } }