From e41011194abf51995744da86ed1cfac58736b85e Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 04:24:45 +0900 Subject: [PATCH 01/26] =?UTF-8?q?docs(subway):=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..fda5cd2e2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,67 @@ +# 지하철 노선도 미션 +- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다. + +## 구현 기능 목록 + +- [ ] 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅한다. +``` + 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. + 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. + 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점) + - 2호선: 교대역 - 강남역 - 역삼역 + - 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역 + - 신분당선: 강남역 - 양재역 - 양재시민의숲역 + ``` +- [ ] 지하철 역을 생성 한다 + - 에외: 지하철 역 이름 입력 포멧이 ~역 이 아닌 경우 + - ~역이 아닌 입력을 허용하고 역을 붙이는 식으로 개발 시, 역이 역 이름의 역인지, station의 역인지 의미를가 불명확 하기 때문에 포멧 통일 + - 예외: 역 이름이 2자 이상이 아닌 경우 + +- [ ] 지하철 역을 등록 한다 + - 예외: 지하철 역 이름이 중복인 경우 + +- [ ] 지하철 역을 삭제 한다 + - 예외: 노선에 등록된 역을 삭제할 경우 + - 예외: 존재 하지 않는 역을 삭제할 경우 + +- [ ] 지하철 역의 목록을 조회 한다 + - `[INFO]`를 붙여서 출력한다 + +- [ ] 지하철 노선을 생성 한다 + - 구현: 상행 종점 역과 하행 종점 역을 입력 받아 노선을 생성 한다 + - 예외: 상행 종점과 하행 종점 역이 같은 경우 + - 예외: 노선 이름이 2자 이상이 아닌 경우 + - 예외: 상행역 및 하행역이 등록된 지하철 역이 아닐 경우 + - 에외: 지하철 노선 이름 입력 포멧이 ~선 이 아닌 경우 + +- [ ] 지하철 노선을 등록 한다 + - 예외: 지하철 노선의 이름이 중복인 경우 + +- [ ] 지하철 노선을 삭제 한다 + - 구현: 노선에 등록된 지하철 역들의 상태를 등록 안된 상태로 변경 + +- [ ] 지하철 노선의 목록을 조회 한다 + - `[INFO]`를 붙여서 출력한다 + +- [ ] 지하철 노선에 역을 추가 한다 (구간 추가) + - 구현: 하나의 역은 여러개의 노선에 추가될 수 있다 + - 구현: 역과 역 사이에 새로운 역이 추가될 수 있다 + - 순서는 1부터 시작한다 + - 예외: 동일한 노선에 동일한 역이 추가 될 경우 + - 예외: 역 등록 위치 입력 시 숫자가 아닌 경우 + - 예외: 역 등록 위치 입력 시 구간 범위 를 벗어난 경우 + - 1 ~ 구간.size()-1 까지 + +- [ ] 지하철 노선에 역을 삭제 한다 (구간 삭제) + - 구현: 종점을 제거할 경우 다음 역이 종점이 된다 + - 예외: 노선에 포함된 역이 2개 이하일 때 역을 제거하려 하는 경우 + +- [ ] 지하철 노선에 등록된 역을 조회할 수 있다 + - 구현: 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다 + +- [ ] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. + + +## 📝 License + +This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed. From 3f39067b5cf44969b0f7a7124d6391b6e5f2cc14 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 04:26:36 +0900 Subject: [PATCH 02/26] =?UTF-8?q?refactor(subway):=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8,=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EB=B3=84=EB=A1=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/{ => line}/Line.java | 2 +- src/main/java/subway/domain/{ => station}/Station.java | 2 +- .../subway/{domain => repository/line}/LineRepository.java | 4 +++- .../{domain => repository/station}/StationRepository.java | 4 +++- 4 files changed, 8 insertions(+), 4 deletions(-) rename src/main/java/subway/domain/{ => line}/Line.java (87%) rename src/main/java/subway/domain/{ => station}/Station.java (86%) rename src/main/java/subway/{domain => repository/line}/LineRepository.java (88%) rename src/main/java/subway/{domain => repository/station}/StationRepository.java (88%) diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/line/Line.java similarity index 87% rename from src/main/java/subway/domain/Line.java rename to src/main/java/subway/domain/line/Line.java index f4d738d5a..bb1a937bb 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -1,4 +1,4 @@ -package subway.domain; +package subway.domain.line; public class Line { private String name; diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/station/Station.java similarity index 86% rename from src/main/java/subway/domain/Station.java rename to src/main/java/subway/domain/station/Station.java index bdb142590..ef99213b8 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/station/Station.java @@ -1,4 +1,4 @@ -package subway.domain; +package subway.domain.station; public class Station { private String name; diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/repository/line/LineRepository.java similarity index 88% rename from src/main/java/subway/domain/LineRepository.java rename to src/main/java/subway/repository/line/LineRepository.java index 49132ddb6..92d94d7fc 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/repository/line/LineRepository.java @@ -1,4 +1,6 @@ -package subway.domain; +package subway.repository.line; + +import subway.domain.line.Line; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/repository/station/StationRepository.java similarity index 88% rename from src/main/java/subway/domain/StationRepository.java rename to src/main/java/subway/repository/station/StationRepository.java index b7245c0f3..f14bc8c8b 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/repository/station/StationRepository.java @@ -1,4 +1,6 @@ -package subway.domain; +package subway.repository.station; + +import subway.domain.station.Station; import java.util.ArrayList; import java.util.Collections; From 2c96e5cb8d889b02b6909030193cdf923b509937 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 04:42:29 +0900 Subject: [PATCH 03/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 치하철 역 이름은 값 객체로 취급하며 검증 책임을 부여함 --- docs/README.md | 2 +- .../exception/StationNameFormatException.java | 4 ++ .../exception/StationNameLengthException.java | 4 ++ .../java/subway/domain/station/Station.java | 21 ++++++-- .../subway/domain/station/StationName.java | 53 +++++++++++++++++++ 5 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 src/main/java/subway/domain/exception/StationNameFormatException.java create mode 100644 src/main/java/subway/domain/exception/StationNameLengthException.java create mode 100644 src/main/java/subway/domain/station/StationName.java diff --git a/docs/README.md b/docs/README.md index fda5cd2e2..2d83521d1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ - 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역 - 신분당선: 강남역 - 양재역 - 양재시민의숲역 ``` -- [ ] 지하철 역을 생성 한다 +- [x] 지하철 역을 생성 한다 - 에외: 지하철 역 이름 입력 포멧이 ~역 이 아닌 경우 - ~역이 아닌 입력을 허용하고 역을 붙이는 식으로 개발 시, 역이 역 이름의 역인지, station의 역인지 의미를가 불명확 하기 때문에 포멧 통일 - 예외: 역 이름이 2자 이상이 아닌 경우 diff --git a/src/main/java/subway/domain/exception/StationNameFormatException.java b/src/main/java/subway/domain/exception/StationNameFormatException.java new file mode 100644 index 000000000..a543eb5a1 --- /dev/null +++ b/src/main/java/subway/domain/exception/StationNameFormatException.java @@ -0,0 +1,4 @@ +package subway.domain.exception; + +public class StationNameFormatException extends RuntimeException { +} diff --git a/src/main/java/subway/domain/exception/StationNameLengthException.java b/src/main/java/subway/domain/exception/StationNameLengthException.java new file mode 100644 index 000000000..fe8b9eef9 --- /dev/null +++ b/src/main/java/subway/domain/exception/StationNameLengthException.java @@ -0,0 +1,4 @@ +package subway.domain.exception; + +public class StationNameLengthException extends RuntimeException { +} diff --git a/src/main/java/subway/domain/station/Station.java b/src/main/java/subway/domain/station/Station.java index ef99213b8..7bc094835 100644 --- a/src/main/java/subway/domain/station/Station.java +++ b/src/main/java/subway/domain/station/Station.java @@ -1,15 +1,28 @@ package subway.domain.station; +import java.util.Objects; + public class Station { - private String name; + private StationName name; - public Station(String name) { + private Station(StationName name) { this.name = name; } - public String getName() { + public static Station of(StationName name) { + return new Station(name); + } + + public StationName getName() { return name; } - // 추가 기능 구현 + @Override + public boolean equals(Object o) { + if(o instanceof Station) { + return Objects.equals(((Station) o).name, this.name); + } + + return false; + } } diff --git a/src/main/java/subway/domain/station/StationName.java b/src/main/java/subway/domain/station/StationName.java new file mode 100644 index 000000000..773d28900 --- /dev/null +++ b/src/main/java/subway/domain/station/StationName.java @@ -0,0 +1,53 @@ +package subway.domain.station; + +import subway.domain.exception.StationNameFormatException; +import subway.domain.exception.StationNameLengthException; + +import java.util.Objects; + +public class StationName { + private static final int MINIMUM_STATION_NAME_SIZE = 2; + private static final String STATION_IN_KOREAN = "역"; + + private String name; + + private StationName(String name) { + validateName(name); + this.name = name; + } + + public static StationName of(String name) { + return new StationName(name); + } + + private void validateName(String name) { + validateEndWithStation(name); + validateLength(name); + } + + private void validateEndWithStation(String name) { + if (!name.endsWith(STATION_IN_KOREAN)) { + throw new StationNameFormatException(); + } + } + + private void validateLength(String name) { + if (!(name.length() - STATION_IN_KOREAN.length() >= MINIMUM_STATION_NAME_SIZE)) { + throw new StationNameLengthException(); + } + } + + @Override + public String toString() { + return name; + } + + @Override + public boolean equals(Object o) { + if (o instanceof StationName) { + return Objects.equals(name, ((StationName) o).name); + } + + return false; + } +} From 8eabeb5c833291b5268bfe8746d4d1314826a6a4 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 04:46:22 +0900 Subject: [PATCH 04/26] =?UTF-8?q?refactor(subway):=20=EB=A0=88=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=EB=A5=BC=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=ED=99=94=20=EC=8B=9C=ED=82=A4?= =?UTF-8?q?=EA=B3=A0=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 레포지토리는 저장소의 역할만 하도록 하였으며 OCP를 만족하기 위해 인터페이스화 시킴 --- .../exception/StationNotFoundException.java | 4 ++ .../repository/line/LineRepository.java | 23 +++-------- .../repository/line/LineRepositoryImpl.java | 27 +++++++++++++ .../repository/station/StationRepository.java | 23 +++-------- .../station/StationRepositoryImpl.java | 40 +++++++++++++++++++ 5 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 src/main/java/subway/domain/exception/StationNotFoundException.java create mode 100644 src/main/java/subway/repository/line/LineRepositoryImpl.java create mode 100644 src/main/java/subway/repository/station/StationRepositoryImpl.java diff --git a/src/main/java/subway/domain/exception/StationNotFoundException.java b/src/main/java/subway/domain/exception/StationNotFoundException.java new file mode 100644 index 000000000..179cdf492 --- /dev/null +++ b/src/main/java/subway/domain/exception/StationNotFoundException.java @@ -0,0 +1,4 @@ +package subway.domain.exception; + +public class StationNotFoundException extends RuntimeException { +} diff --git a/src/main/java/subway/repository/line/LineRepository.java b/src/main/java/subway/repository/line/LineRepository.java index 92d94d7fc..d4c559eaa 100644 --- a/src/main/java/subway/repository/line/LineRepository.java +++ b/src/main/java/subway/repository/line/LineRepository.java @@ -1,24 +1,11 @@ package subway.repository.line; -import subway.domain.line.Line; +import subway.domain.Line.Line; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Objects; -public class LineRepository { - private static final List lines = new ArrayList<>(); - - public static List lines() { - return Collections.unmodifiableList(lines); - } - - public static void addLine(Line line) { - lines.add(line); - } - - public static boolean deleteLineByName(String name) { - return lines.removeIf(line -> Objects.equals(line.getName(), name)); - } +public interface LineRepository { + List lines(); + void addLine(Line line); + boolean deleteLineByName(String name); } diff --git a/src/main/java/subway/repository/line/LineRepositoryImpl.java b/src/main/java/subway/repository/line/LineRepositoryImpl.java new file mode 100644 index 000000000..11d14aeae --- /dev/null +++ b/src/main/java/subway/repository/line/LineRepositoryImpl.java @@ -0,0 +1,27 @@ +package subway.repository.line; + +import subway.domain.Line.Line; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class LineRepositoryImpl implements subway.domain.repository.line.LineRepository { + private final List lines = new ArrayList<>(); + + @Override + public List lines() { + return Collections.unmodifiableList(lines); + } + + @Override + public void addLine(Line line) { + lines.add(line); + } + + @Override + public boolean deleteLineByName(String name) { + return lines.removeIf(line -> Objects.equals(line.getName(), name)); + } +} diff --git a/src/main/java/subway/repository/station/StationRepository.java b/src/main/java/subway/repository/station/StationRepository.java index f14bc8c8b..0e6321e95 100644 --- a/src/main/java/subway/repository/station/StationRepository.java +++ b/src/main/java/subway/repository/station/StationRepository.java @@ -1,24 +1,13 @@ package subway.repository.station; import subway.domain.station.Station; +import subway.domain.station.StationName; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Objects; -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } +public interface StationRepository { + List stations(); + void addStation(Station station); + boolean deleteStation(StationName name); + Station getStationByName(StationName name); } diff --git a/src/main/java/subway/repository/station/StationRepositoryImpl.java b/src/main/java/subway/repository/station/StationRepositoryImpl.java new file mode 100644 index 000000000..ba6d2f012 --- /dev/null +++ b/src/main/java/subway/repository/station/StationRepositoryImpl.java @@ -0,0 +1,40 @@ +package subway.repository.station; + +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.domain.exception.StationNotFoundException; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +public class StationRepositoryImpl implements StationRepository { + private final List stations = new ArrayList<>(); + + @Override + public List stations() { + return Collections.unmodifiableList(stations); + } + + public void addStation(Station station) { + stations.add(station); + } + + + + @Override + public boolean deleteStation(StationName name) { + return stations.removeIf(station -> Objects.equals(station.getName(), name)); + } + + @Override + public Station getStationByName(StationName name) { + Station goalStation = stations.stream() + .filter(station -> Objects.equals(station.getName(), name)) + .findAny() + .orElseThrow(() -> new StationNotFoundException()); + + return goalStation; + } +} From 1720c996b2e222c7432290ab9c8c97d96ec72d01 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 04:58:23 +0900 Subject: [PATCH 05/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EB=93=B1=EB=A1=9D=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자의 등록 요청을 수행하기 위한 어플리케이션 서비스 객체 생성 검증 과정을 위해 repository 에서 데이터를 불러와야 하는데 이를 위해 도메인 객체에 repository 의존성을 주입하는것이 부자연스러워 명세를 활용한 검증 로직으로 구현 역 이름은 값객체로 하였으며 스스로에 대한 검증은 스스로 하도록 책임을 부여함. --- docs/README.md | 2 +- .../subway/domain/station/StationName.java | 4 +- .../StationAlreadyExistException.java | 4 ++ .../StationApplicationException.java | 7 ++++ .../exception/StationNameFormatException.java | 2 +- .../exception/StationNameLengthException.java | 2 +- .../exception/StationNotFoundException.java | 2 +- .../station/StationRepositoryImpl.java | 2 +- .../service/StationRegisterService.java | 40 +++++++++++++++++++ .../StationExistSpecification.java | 19 +++++++++ 10 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/main/java/subway/exception/StationAlreadyExistException.java create mode 100644 src/main/java/subway/exception/StationApplicationException.java rename src/main/java/subway/{domain => }/exception/StationNameFormatException.java (67%) rename src/main/java/subway/{domain => }/exception/StationNameLengthException.java (67%) rename src/main/java/subway/{domain => }/exception/StationNotFoundException.java (67%) create mode 100644 src/main/java/subway/service/StationRegisterService.java create mode 100644 src/main/java/subway/specification/StationExistSpecification.java diff --git a/docs/README.md b/docs/README.md index 2d83521d1..c65e3b1ef 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ - ~역이 아닌 입력을 허용하고 역을 붙이는 식으로 개발 시, 역이 역 이름의 역인지, station의 역인지 의미를가 불명확 하기 때문에 포멧 통일 - 예외: 역 이름이 2자 이상이 아닌 경우 -- [ ] 지하철 역을 등록 한다 +- [x] 지하철 역을 등록 한다 - 예외: 지하철 역 이름이 중복인 경우 - [ ] 지하철 역을 삭제 한다 diff --git a/src/main/java/subway/domain/station/StationName.java b/src/main/java/subway/domain/station/StationName.java index 773d28900..08d8e4d32 100644 --- a/src/main/java/subway/domain/station/StationName.java +++ b/src/main/java/subway/domain/station/StationName.java @@ -1,7 +1,7 @@ package subway.domain.station; -import subway.domain.exception.StationNameFormatException; -import subway.domain.exception.StationNameLengthException; +import subway.exception.StationNameFormatException; +import subway.exception.StationNameLengthException; import java.util.Objects; diff --git a/src/main/java/subway/exception/StationAlreadyExistException.java b/src/main/java/subway/exception/StationAlreadyExistException.java new file mode 100644 index 000000000..eb3eb71c4 --- /dev/null +++ b/src/main/java/subway/exception/StationAlreadyExistException.java @@ -0,0 +1,4 @@ +package subway.exception; + +public class StationAlreadyExistException extends RuntimeException { +} diff --git a/src/main/java/subway/exception/StationApplicationException.java b/src/main/java/subway/exception/StationApplicationException.java new file mode 100644 index 000000000..24fb8e3d2 --- /dev/null +++ b/src/main/java/subway/exception/StationApplicationException.java @@ -0,0 +1,7 @@ +package subway.exception; + +public class StationApplicationException extends RuntimeException { + public StationApplicationException(RuntimeException e) { + super(e); + } +} diff --git a/src/main/java/subway/domain/exception/StationNameFormatException.java b/src/main/java/subway/exception/StationNameFormatException.java similarity index 67% rename from src/main/java/subway/domain/exception/StationNameFormatException.java rename to src/main/java/subway/exception/StationNameFormatException.java index a543eb5a1..4d2703edf 100644 --- a/src/main/java/subway/domain/exception/StationNameFormatException.java +++ b/src/main/java/subway/exception/StationNameFormatException.java @@ -1,4 +1,4 @@ -package subway.domain.exception; +package subway.exception; public class StationNameFormatException extends RuntimeException { } diff --git a/src/main/java/subway/domain/exception/StationNameLengthException.java b/src/main/java/subway/exception/StationNameLengthException.java similarity index 67% rename from src/main/java/subway/domain/exception/StationNameLengthException.java rename to src/main/java/subway/exception/StationNameLengthException.java index fe8b9eef9..8e4dddd40 100644 --- a/src/main/java/subway/domain/exception/StationNameLengthException.java +++ b/src/main/java/subway/exception/StationNameLengthException.java @@ -1,4 +1,4 @@ -package subway.domain.exception; +package subway.exception; public class StationNameLengthException extends RuntimeException { } diff --git a/src/main/java/subway/domain/exception/StationNotFoundException.java b/src/main/java/subway/exception/StationNotFoundException.java similarity index 67% rename from src/main/java/subway/domain/exception/StationNotFoundException.java rename to src/main/java/subway/exception/StationNotFoundException.java index 179cdf492..e0a8b8042 100644 --- a/src/main/java/subway/domain/exception/StationNotFoundException.java +++ b/src/main/java/subway/exception/StationNotFoundException.java @@ -1,4 +1,4 @@ -package subway.domain.exception; +package subway.exception; public class StationNotFoundException extends RuntimeException { } diff --git a/src/main/java/subway/repository/station/StationRepositoryImpl.java b/src/main/java/subway/repository/station/StationRepositoryImpl.java index ba6d2f012..4042d23d7 100644 --- a/src/main/java/subway/repository/station/StationRepositoryImpl.java +++ b/src/main/java/subway/repository/station/StationRepositoryImpl.java @@ -2,7 +2,7 @@ import subway.domain.station.Station; import subway.domain.station.StationName; -import subway.domain.exception.StationNotFoundException; +import subway.exception.StationNotFoundException; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/subway/service/StationRegisterService.java b/src/main/java/subway/service/StationRegisterService.java new file mode 100644 index 000000000..8293bde7d --- /dev/null +++ b/src/main/java/subway/service/StationRegisterService.java @@ -0,0 +1,40 @@ +package subway.service; + +import subway.exception.*; +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.repository.station.StationRepository; +import subway.specification.StationExistSpecification; + +public class StationRegisterService { + private final StationRepository stationRepository; + + public StationRegisterService(StationRepository stationRepository) { + this.stationRepository = stationRepository; + } + + public void register(String name) { + try { + StationName stationName = StationName.of(name); + Station station = Station.of(stationName); + validateAlreadyExist(stationName); + stationRepository.addStation(station); + } catch (StationNotFoundException e) { + throw new StationApplicationException(e); + } catch (StationNameFormatException e) { + throw new StationApplicationException(e); + } catch (StationNameLengthException e) { + throw new StationApplicationException(e); + } + } + + private void validateAlreadyExist(StationName name) { + StationExistSpecification stationExistSpecification = + new StationExistSpecification(stationRepository); + + if (stationExistSpecification.isSatisfiedBy(name)) { + throw new StationAlreadyExistException(); + } + } + +} diff --git a/src/main/java/subway/specification/StationExistSpecification.java b/src/main/java/subway/specification/StationExistSpecification.java new file mode 100644 index 000000000..3f9ad65a9 --- /dev/null +++ b/src/main/java/subway/specification/StationExistSpecification.java @@ -0,0 +1,19 @@ +package subway.specification; + +import subway.domain.station.StationName; +import subway.repository.station.StationRepository; + +import java.util.Objects; + +public class StationExistSpecification { + private final StationRepository stationRepository; + + public StationExistSpecification(StationRepository stationRepository) { + this.stationRepository = stationRepository; + } + + public boolean isSatisfiedBy(StationName name) { + return stationRepository.stations().stream() + .anyMatch(station -> Objects.equals(station.getName(), name)); + } +} From 9cfbfea3e5059ce3cf4865bacc502deb50eb46de Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 05:35:29 +0900 Subject: [PATCH 06/26] =?UTF-8?q?refactor(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 생성 및 등록을 서비스 객체로 생성 -> 모든게 사용자의 요청이기 때문 래핑 exception의 이름 오타 수정 --- .../StationApplicationException.java | 7 ------ .../exception/SubwayApplicationException.java | 7 ++++++ .../service/GenerateNewStationService.java | 22 +++++++++++++++++++ .../service/StationRegisterService.java | 14 ++++-------- 4 files changed, 33 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/subway/exception/StationApplicationException.java create mode 100644 src/main/java/subway/exception/SubwayApplicationException.java create mode 100644 src/main/java/subway/service/GenerateNewStationService.java diff --git a/src/main/java/subway/exception/StationApplicationException.java b/src/main/java/subway/exception/StationApplicationException.java deleted file mode 100644 index 24fb8e3d2..000000000 --- a/src/main/java/subway/exception/StationApplicationException.java +++ /dev/null @@ -1,7 +0,0 @@ -package subway.exception; - -public class StationApplicationException extends RuntimeException { - public StationApplicationException(RuntimeException e) { - super(e); - } -} diff --git a/src/main/java/subway/exception/SubwayApplicationException.java b/src/main/java/subway/exception/SubwayApplicationException.java new file mode 100644 index 000000000..e114da429 --- /dev/null +++ b/src/main/java/subway/exception/SubwayApplicationException.java @@ -0,0 +1,7 @@ +package subway.exception; + +public class SubwayApplicationException extends RuntimeException { + public SubwayApplicationException(RuntimeException e) { + super(e); + } +} diff --git a/src/main/java/subway/service/GenerateNewStationService.java b/src/main/java/subway/service/GenerateNewStationService.java new file mode 100644 index 000000000..9ebfa5e3e --- /dev/null +++ b/src/main/java/subway/service/GenerateNewStationService.java @@ -0,0 +1,22 @@ +package subway.service; + +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.exception.StationNameFormatException; +import subway.exception.StationNameLengthException; +import subway.exception.SubwayApplicationException; + +public class GenerateNewStationService { + public Station generate(String name) { + Station station; + + try { + StationName stationName = StationName.of(name); + station = Station.of(stationName); + } catch(StationNameFormatException | StationNameLengthException e) { + throw new SubwayApplicationException(e); + } + + return station; + } +} diff --git a/src/main/java/subway/service/StationRegisterService.java b/src/main/java/subway/service/StationRegisterService.java index 8293bde7d..8de2871d2 100644 --- a/src/main/java/subway/service/StationRegisterService.java +++ b/src/main/java/subway/service/StationRegisterService.java @@ -13,18 +13,12 @@ public StationRegisterService(StationRepository stationRepository) { this.stationRepository = stationRepository; } - public void register(String name) { + public void register(Station station) { try { - StationName stationName = StationName.of(name); - Station station = Station.of(stationName); - validateAlreadyExist(stationName); + validateAlreadyExist(station.getName()); stationRepository.addStation(station); - } catch (StationNotFoundException e) { - throw new StationApplicationException(e); - } catch (StationNameFormatException e) { - throw new StationApplicationException(e); - } catch (StationNameLengthException e) { - throw new StationApplicationException(e); + } catch (StationAlreadyExistException e) { + throw new SubwayApplicationException(e); } } From be0294c13611605278926886379dbe8cd7a40909 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:10:47 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=20=EC=83=9D=EC=84=B1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지하철 노선을 생성하기 위한 서비스 객체 생성. 노선 이름은 값 객체로 취급하여 스스로 검증하도록 하였음. 노선 생성 예외는 repository 가 필요하므로 명세를 사용하여 서비스에서 검증. 모든 예외는 래핑하여 던짐. --- docs/README.md | 2 +- src/main/java/subway/domain/line/Line.java | 30 ++++++++++- .../java/subway/domain/line/LineName.java | 37 ++++++++++++++ .../exception/LineNameFormatException.java | 4 ++ .../exception/LineNameLengthException.java | 4 ++ .../SameUpLineAndDownLineException.java | 4 ++ .../repository/line/LineRepository.java | 2 +- .../repository/line/LineRepositoryImpl.java | 5 +- .../service/GenerateNewLineService.java | 51 +++++++++++++++++++ ...AlreadyRegisteredStationSpecification.java | 23 +++++++++ .../SameUpLineAndDownLineSpecification.java | 11 ++++ 11 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 src/main/java/subway/domain/line/LineName.java create mode 100644 src/main/java/subway/exception/LineNameFormatException.java create mode 100644 src/main/java/subway/exception/LineNameLengthException.java create mode 100644 src/main/java/subway/exception/SameUpLineAndDownLineException.java create mode 100644 src/main/java/subway/service/GenerateNewLineService.java create mode 100644 src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java create mode 100644 src/main/java/subway/specification/SameUpLineAndDownLineSpecification.java diff --git a/docs/README.md b/docs/README.md index c65e3b1ef..bd2e1230e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,7 +27,7 @@ - [ ] 지하철 역의 목록을 조회 한다 - `[INFO]`를 붙여서 출력한다 -- [ ] 지하철 노선을 생성 한다 +- [x] 지하철 노선을 생성 한다 - 구현: 상행 종점 역과 하행 종점 역을 입력 받아 노선을 생성 한다 - 예외: 상행 종점과 하행 종점 역이 같은 경우 - 예외: 노선 이름이 2자 이상이 아닌 경우 diff --git a/src/main/java/subway/domain/line/Line.java b/src/main/java/subway/domain/line/Line.java index bb1a937bb..a7aa10f49 100644 --- a/src/main/java/subway/domain/line/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -1,15 +1,41 @@ package subway.domain.line; +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.exception.SameUpLineAndDownLineException; + +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + public class Line { private String name; + private List sections; - public Line(String name) { + private Line(String name, Station upLine, Station downLine) { + List sections = createSectionsWithUpLineAndDownLine(upLine, downLine); this.name = name; + this.sections = sections; + } + + public static Line fromNameAndUpLineAndDownLine(String name, Station upLine, Station downLine) { + return new Line(name, upLine, downLine); + } + + private static List createSectionsWithUpLineAndDownLine(Station upLine, Station downLine) { + List sections = new LinkedList<>(); + sections.add(upLine); + sections.add(downLine); + + return sections; } public String getName() { return name; } - // 추가 기능 구현 + public boolean contains(StationName name) { + return sections.stream() + .anyMatch(station -> Objects.equals(name, station.getName())); + } } diff --git a/src/main/java/subway/domain/line/LineName.java b/src/main/java/subway/domain/line/LineName.java new file mode 100644 index 000000000..d429f3ab5 --- /dev/null +++ b/src/main/java/subway/domain/line/LineName.java @@ -0,0 +1,37 @@ +package subway.domain.line; + +import subway.exception.LineNameFormatException; +import subway.exception.LineNameLengthException; + +public class LineName { + private static final int MINIMUM_LINE_NAME_SIZE = 2; + private static final String LINE_IN_KOREAN = "선"; + + private String name; + + private LineName(String name) { + validateName(name); + this.name = name; + } + + public static LineName of(String name) { + return new LineName(name); + } + + private void validateName(String name) { + validateEndWithLine(name); + validateLength(name); + } + + private void validateEndWithLine(String name) { + if (!name.endsWith(LINE_IN_KOREAN)) { + throw new LineNameFormatException(); + } + } + + private void validateLength(String name) { + if (!(name.length() - LINE_IN_KOREAN.length() >= MINIMUM_LINE_NAME_SIZE)) { + throw new LineNameLengthException(); + } + } +} diff --git a/src/main/java/subway/exception/LineNameFormatException.java b/src/main/java/subway/exception/LineNameFormatException.java new file mode 100644 index 000000000..f4059a4e5 --- /dev/null +++ b/src/main/java/subway/exception/LineNameFormatException.java @@ -0,0 +1,4 @@ +package subway.exception; + +public class LineNameFormatException extends RuntimeException { +} diff --git a/src/main/java/subway/exception/LineNameLengthException.java b/src/main/java/subway/exception/LineNameLengthException.java new file mode 100644 index 000000000..0f85baaf4 --- /dev/null +++ b/src/main/java/subway/exception/LineNameLengthException.java @@ -0,0 +1,4 @@ +package subway.exception; + +public class LineNameLengthException extends RuntimeException { +} \ No newline at end of file diff --git a/src/main/java/subway/exception/SameUpLineAndDownLineException.java b/src/main/java/subway/exception/SameUpLineAndDownLineException.java new file mode 100644 index 000000000..f2a89b251 --- /dev/null +++ b/src/main/java/subway/exception/SameUpLineAndDownLineException.java @@ -0,0 +1,4 @@ +package subway.exception; + +public class SameUpLineAndDownLineException extends RuntimeException { +} diff --git a/src/main/java/subway/repository/line/LineRepository.java b/src/main/java/subway/repository/line/LineRepository.java index d4c559eaa..dde876ddb 100644 --- a/src/main/java/subway/repository/line/LineRepository.java +++ b/src/main/java/subway/repository/line/LineRepository.java @@ -1,6 +1,6 @@ package subway.repository.line; -import subway.domain.Line.Line; +import subway.domain.line.Line; import java.util.List; diff --git a/src/main/java/subway/repository/line/LineRepositoryImpl.java b/src/main/java/subway/repository/line/LineRepositoryImpl.java index 11d14aeae..cb1814723 100644 --- a/src/main/java/subway/repository/line/LineRepositoryImpl.java +++ b/src/main/java/subway/repository/line/LineRepositoryImpl.java @@ -1,13 +1,12 @@ package subway.repository.line; -import subway.domain.Line.Line; - +import subway.domain.line.Line; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; -public class LineRepositoryImpl implements subway.domain.repository.line.LineRepository { +public class LineRepositoryImpl implements LineRepository { private final List lines = new ArrayList<>(); @Override diff --git a/src/main/java/subway/service/GenerateNewLineService.java b/src/main/java/subway/service/GenerateNewLineService.java new file mode 100644 index 000000000..2e33f7868 --- /dev/null +++ b/src/main/java/subway/service/GenerateNewLineService.java @@ -0,0 +1,51 @@ +package subway.service; + +import subway.domain.station.Station; +import subway.exception.SameUpLineAndDownLineException; +import subway.exception.StationNotFoundException; +import subway.exception.SubwayApplicationException; +import subway.repository.line.LineRepository; +import subway.repository.line.LineRepositoryImpl; +import subway.repository.station.StationRepository; +import subway.repository.station.StationRepositoryImpl; +import subway.specification.AlreadyRegisteredStationSpecification; +import subway.specification.SameUpLineAndDownLineSpecification; +import subway.domain.line.Line; + +public class GenerateNewLineService { + private final StationRepository stationRepository; + + public GenerateNewLineService(StationRepository stationRepository) { + this.stationRepository = stationRepository; + } + + public Line generate(String name, Station upLine, Station downLine) { + try { + validateSameUpLineAndDownLine(upLine, downLine); + validateIsRegisteredStation(upLine); + validateIsRegisteredStation(downLine); + } catch (SameUpLineAndDownLineException | StationNotFoundException e) { + throw new SubwayApplicationException(e); + } + + return Line.fromNameAndUpLineAndDownLine(name, upLine, downLine); + } + + private void validateSameUpLineAndDownLine(Station upLine, Station DownLine) { + SameUpLineAndDownLineSpecification sameUpLineAndDownLineSpecification = + new SameUpLineAndDownLineSpecification(); + + if (sameUpLineAndDownLineSpecification.isSatisfiedBy(upLine, DownLine)) { + throw new SameUpLineAndDownLineException(); + } + } + + private void validateIsRegisteredStation(Station station) { + AlreadyRegisteredStationSpecification alreadyRegisteredStationSpecification = + new AlreadyRegisteredStationSpecification(stationRepository); + + if (!alreadyRegisteredStationSpecification.isSatisfiedBy(station)) { + throw new StationNotFoundException(); + } + } +} diff --git a/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java b/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java new file mode 100644 index 000000000..d5cdf4235 --- /dev/null +++ b/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java @@ -0,0 +1,23 @@ +package subway.specification; + +import subway.domain.station.Station; +import subway.exception.StationNotFoundException; +import subway.repository.station.StationRepository; + +public class AlreadyRegisteredStationSpecification { + StationRepository stationRepository; + + public AlreadyRegisteredStationSpecification(StationRepository stationRepository) { + this.stationRepository = stationRepository; + } + + public boolean isSatisfiedBy(Station station) { + try { + stationRepository.getStationByName(station.getName()); + } catch(StationNotFoundException e) { + return false; + } + + return true; + } +} diff --git a/src/main/java/subway/specification/SameUpLineAndDownLineSpecification.java b/src/main/java/subway/specification/SameUpLineAndDownLineSpecification.java new file mode 100644 index 000000000..433b3fdd1 --- /dev/null +++ b/src/main/java/subway/specification/SameUpLineAndDownLineSpecification.java @@ -0,0 +1,11 @@ +package subway.specification; + +import subway.domain.station.Station; + +import java.util.Objects; + +public class SameUpLineAndDownLineSpecification { + public boolean isSatisfiedBy(Station upLine, Station downLine) { + return Objects.equals(upLine, downLine); + } +} From 1a3dd914f15e4ce516aa7170c43b3d99ad3a1e10 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:16:47 +0900 Subject: [PATCH 08/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EC=82=AD=EC=A0=9C=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지하철 역이 존재하는지 판단하기 위해서는 repository가 필요하므로 명세를 이용하여 검증로직을 만들고 서비스 객체에서 수행하게 하였음. --- docs/README.md | 2 +- .../StationRegisteredOnLineException.java | 4 ++ .../subway/service/StationDeleteService.java | 45 +++++++++++++++++++ .../StationExistOnLineSpecification.java | 17 +++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/exception/StationRegisteredOnLineException.java create mode 100644 src/main/java/subway/service/StationDeleteService.java create mode 100644 src/main/java/subway/specification/StationExistOnLineSpecification.java diff --git a/docs/README.md b/docs/README.md index bd2e1230e..e8b2bfc1c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,7 +20,7 @@ - [x] 지하철 역을 등록 한다 - 예외: 지하철 역 이름이 중복인 경우 -- [ ] 지하철 역을 삭제 한다 +- [x] 지하철 역을 삭제 한다 - 예외: 노선에 등록된 역을 삭제할 경우 - 예외: 존재 하지 않는 역을 삭제할 경우 diff --git a/src/main/java/subway/exception/StationRegisteredOnLineException.java b/src/main/java/subway/exception/StationRegisteredOnLineException.java new file mode 100644 index 000000000..8fb851084 --- /dev/null +++ b/src/main/java/subway/exception/StationRegisteredOnLineException.java @@ -0,0 +1,4 @@ +package subway.exception; + +public class StationRegisteredOnLineException extends RuntimeException { +} diff --git a/src/main/java/subway/service/StationDeleteService.java b/src/main/java/subway/service/StationDeleteService.java new file mode 100644 index 000000000..88cac914f --- /dev/null +++ b/src/main/java/subway/service/StationDeleteService.java @@ -0,0 +1,45 @@ +package subway.service; + +import subway.domain.station.StationName; +import subway.exception.StationRegisteredOnLineException; +import subway.exception.SubwayApplicationException; +import subway.exception.StationNotFoundException; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.specification.StationExistOnLineSpecification; + +public class StationDeleteService { + private final StationRepository stationRepository; + private final LineRepository lineRepository; + + public StationDeleteService(StationRepository stationRepository, + LineRepository lineRepository) { + this.stationRepository = stationRepository; + this.lineRepository = lineRepository; + } + + public void delete(StationName name) { + try { + validateLineContainsStation(name); + deleteStation(name); + } catch (StationNotFoundException | StationRegisteredOnLineException e) { + throw new SubwayApplicationException(e); + } + } + + private void deleteStation(StationName name) { + boolean success = stationRepository.deleteStation(name); + if (!success) { + throw new StationNotFoundException(); + } + } + + private void validateLineContainsStation(StationName name) { + StationExistOnLineSpecification stationExistOnLineSpecification = + new StationExistOnLineSpecification(lineRepository); + + if (stationExistOnLineSpecification.isSatisfiedBy(name)) { + throw new StationRegisteredOnLineException(); + } + } +} diff --git a/src/main/java/subway/specification/StationExistOnLineSpecification.java b/src/main/java/subway/specification/StationExistOnLineSpecification.java new file mode 100644 index 000000000..6695f4539 --- /dev/null +++ b/src/main/java/subway/specification/StationExistOnLineSpecification.java @@ -0,0 +1,17 @@ +package subway.specification; + +import subway.domain.station.StationName; +import subway.repository.line.LineRepository; + +public class StationExistOnLineSpecification { + private final LineRepository lineRepository; + + public StationExistOnLineSpecification(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public boolean isSatisfiedBy(StationName name) { + return lineRepository.lines().stream() + .anyMatch(line -> line.contains(name)); + } +} From db8a9daf374592c4f6354ea1d7c662b4e0ee2efb Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:20:08 +0900 Subject: [PATCH 09/26] =?UTF-8?q?refactor(subway):=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84?= =?UTF-8?q?=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/line/Line.java | 1 - src/main/java/subway/domain/line/LineName.java | 4 ++-- src/main/java/subway/domain/station/StationName.java | 4 ++-- .../exception/{ => line}/LineNameFormatException.java | 2 +- .../exception/{ => line}/LineNameLengthException.java | 2 +- .../{ => station}/SameUpLineAndDownLineException.java | 2 +- .../{ => station}/StationAlreadyExistException.java | 2 +- .../{ => station}/StationNameFormatException.java | 2 +- .../{ => station}/StationNameLengthException.java | 2 +- .../exception/{ => station}/StationNotFoundException.java | 2 +- .../{ => station}/StationRegisteredOnLineException.java | 2 +- .../subway/repository/station/StationRepositoryImpl.java | 2 +- src/main/java/subway/service/GenerateNewLineService.java | 7 ++----- .../java/subway/service/GenerateNewStationService.java | 4 ++-- src/main/java/subway/service/StationDeleteService.java | 4 ++-- src/main/java/subway/service/StationRegisterService.java | 1 + .../AlreadyRegisteredStationSpecification.java | 2 +- 17 files changed, 21 insertions(+), 24 deletions(-) rename src/main/java/subway/exception/{ => line}/LineNameFormatException.java (68%) rename src/main/java/subway/exception/{ => line}/LineNameLengthException.java (68%) rename src/main/java/subway/exception/{ => station}/SameUpLineAndDownLineException.java (68%) rename src/main/java/subway/exception/{ => station}/StationAlreadyExistException.java (67%) rename src/main/java/subway/exception/{ => station}/StationNameFormatException.java (67%) rename src/main/java/subway/exception/{ => station}/StationNameLengthException.java (67%) rename src/main/java/subway/exception/{ => station}/StationNotFoundException.java (66%) rename src/main/java/subway/exception/{ => station}/StationRegisteredOnLineException.java (69%) diff --git a/src/main/java/subway/domain/line/Line.java b/src/main/java/subway/domain/line/Line.java index a7aa10f49..6f151cdad 100644 --- a/src/main/java/subway/domain/line/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -2,7 +2,6 @@ import subway.domain.station.Station; import subway.domain.station.StationName; -import subway.exception.SameUpLineAndDownLineException; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/subway/domain/line/LineName.java b/src/main/java/subway/domain/line/LineName.java index d429f3ab5..c9c58e9ad 100644 --- a/src/main/java/subway/domain/line/LineName.java +++ b/src/main/java/subway/domain/line/LineName.java @@ -1,7 +1,7 @@ package subway.domain.line; -import subway.exception.LineNameFormatException; -import subway.exception.LineNameLengthException; +import subway.exception.line.LineNameFormatException; +import subway.exception.line.LineNameLengthException; public class LineName { private static final int MINIMUM_LINE_NAME_SIZE = 2; diff --git a/src/main/java/subway/domain/station/StationName.java b/src/main/java/subway/domain/station/StationName.java index 08d8e4d32..2da45537d 100644 --- a/src/main/java/subway/domain/station/StationName.java +++ b/src/main/java/subway/domain/station/StationName.java @@ -1,7 +1,7 @@ package subway.domain.station; -import subway.exception.StationNameFormatException; -import subway.exception.StationNameLengthException; +import subway.exception.station.StationNameFormatException; +import subway.exception.station.StationNameLengthException; import java.util.Objects; diff --git a/src/main/java/subway/exception/LineNameFormatException.java b/src/main/java/subway/exception/line/LineNameFormatException.java similarity index 68% rename from src/main/java/subway/exception/LineNameFormatException.java rename to src/main/java/subway/exception/line/LineNameFormatException.java index f4059a4e5..fb9e009ca 100644 --- a/src/main/java/subway/exception/LineNameFormatException.java +++ b/src/main/java/subway/exception/line/LineNameFormatException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.line; public class LineNameFormatException extends RuntimeException { } diff --git a/src/main/java/subway/exception/LineNameLengthException.java b/src/main/java/subway/exception/line/LineNameLengthException.java similarity index 68% rename from src/main/java/subway/exception/LineNameLengthException.java rename to src/main/java/subway/exception/line/LineNameLengthException.java index 0f85baaf4..4e73306a4 100644 --- a/src/main/java/subway/exception/LineNameLengthException.java +++ b/src/main/java/subway/exception/line/LineNameLengthException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.line; public class LineNameLengthException extends RuntimeException { } \ No newline at end of file diff --git a/src/main/java/subway/exception/SameUpLineAndDownLineException.java b/src/main/java/subway/exception/station/SameUpLineAndDownLineException.java similarity index 68% rename from src/main/java/subway/exception/SameUpLineAndDownLineException.java rename to src/main/java/subway/exception/station/SameUpLineAndDownLineException.java index f2a89b251..e9dd6d16d 100644 --- a/src/main/java/subway/exception/SameUpLineAndDownLineException.java +++ b/src/main/java/subway/exception/station/SameUpLineAndDownLineException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.station; public class SameUpLineAndDownLineException extends RuntimeException { } diff --git a/src/main/java/subway/exception/StationAlreadyExistException.java b/src/main/java/subway/exception/station/StationAlreadyExistException.java similarity index 67% rename from src/main/java/subway/exception/StationAlreadyExistException.java rename to src/main/java/subway/exception/station/StationAlreadyExistException.java index eb3eb71c4..1f67907f0 100644 --- a/src/main/java/subway/exception/StationAlreadyExistException.java +++ b/src/main/java/subway/exception/station/StationAlreadyExistException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.station; public class StationAlreadyExistException extends RuntimeException { } diff --git a/src/main/java/subway/exception/StationNameFormatException.java b/src/main/java/subway/exception/station/StationNameFormatException.java similarity index 67% rename from src/main/java/subway/exception/StationNameFormatException.java rename to src/main/java/subway/exception/station/StationNameFormatException.java index 4d2703edf..ea00583bb 100644 --- a/src/main/java/subway/exception/StationNameFormatException.java +++ b/src/main/java/subway/exception/station/StationNameFormatException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.station; public class StationNameFormatException extends RuntimeException { } diff --git a/src/main/java/subway/exception/StationNameLengthException.java b/src/main/java/subway/exception/station/StationNameLengthException.java similarity index 67% rename from src/main/java/subway/exception/StationNameLengthException.java rename to src/main/java/subway/exception/station/StationNameLengthException.java index 8e4dddd40..51f584e93 100644 --- a/src/main/java/subway/exception/StationNameLengthException.java +++ b/src/main/java/subway/exception/station/StationNameLengthException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.station; public class StationNameLengthException extends RuntimeException { } diff --git a/src/main/java/subway/exception/StationNotFoundException.java b/src/main/java/subway/exception/station/StationNotFoundException.java similarity index 66% rename from src/main/java/subway/exception/StationNotFoundException.java rename to src/main/java/subway/exception/station/StationNotFoundException.java index e0a8b8042..64cb748dc 100644 --- a/src/main/java/subway/exception/StationNotFoundException.java +++ b/src/main/java/subway/exception/station/StationNotFoundException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.station; public class StationNotFoundException extends RuntimeException { } diff --git a/src/main/java/subway/exception/StationRegisteredOnLineException.java b/src/main/java/subway/exception/station/StationRegisteredOnLineException.java similarity index 69% rename from src/main/java/subway/exception/StationRegisteredOnLineException.java rename to src/main/java/subway/exception/station/StationRegisteredOnLineException.java index 8fb851084..230b1ea07 100644 --- a/src/main/java/subway/exception/StationRegisteredOnLineException.java +++ b/src/main/java/subway/exception/station/StationRegisteredOnLineException.java @@ -1,4 +1,4 @@ -package subway.exception; +package subway.exception.station; public class StationRegisteredOnLineException extends RuntimeException { } diff --git a/src/main/java/subway/repository/station/StationRepositoryImpl.java b/src/main/java/subway/repository/station/StationRepositoryImpl.java index 4042d23d7..71c5cc65d 100644 --- a/src/main/java/subway/repository/station/StationRepositoryImpl.java +++ b/src/main/java/subway/repository/station/StationRepositoryImpl.java @@ -2,7 +2,7 @@ import subway.domain.station.Station; import subway.domain.station.StationName; -import subway.exception.StationNotFoundException; +import subway.exception.station.StationNotFoundException; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/subway/service/GenerateNewLineService.java b/src/main/java/subway/service/GenerateNewLineService.java index 2e33f7868..14d0b58a7 100644 --- a/src/main/java/subway/service/GenerateNewLineService.java +++ b/src/main/java/subway/service/GenerateNewLineService.java @@ -1,13 +1,10 @@ package subway.service; import subway.domain.station.Station; -import subway.exception.SameUpLineAndDownLineException; -import subway.exception.StationNotFoundException; +import subway.exception.station.SameUpLineAndDownLineException; +import subway.exception.station.StationNotFoundException; import subway.exception.SubwayApplicationException; -import subway.repository.line.LineRepository; -import subway.repository.line.LineRepositoryImpl; import subway.repository.station.StationRepository; -import subway.repository.station.StationRepositoryImpl; import subway.specification.AlreadyRegisteredStationSpecification; import subway.specification.SameUpLineAndDownLineSpecification; import subway.domain.line.Line; diff --git a/src/main/java/subway/service/GenerateNewStationService.java b/src/main/java/subway/service/GenerateNewStationService.java index 9ebfa5e3e..e4225a597 100644 --- a/src/main/java/subway/service/GenerateNewStationService.java +++ b/src/main/java/subway/service/GenerateNewStationService.java @@ -2,8 +2,8 @@ import subway.domain.station.Station; import subway.domain.station.StationName; -import subway.exception.StationNameFormatException; -import subway.exception.StationNameLengthException; +import subway.exception.station.StationNameFormatException; +import subway.exception.station.StationNameLengthException; import subway.exception.SubwayApplicationException; public class GenerateNewStationService { diff --git a/src/main/java/subway/service/StationDeleteService.java b/src/main/java/subway/service/StationDeleteService.java index 88cac914f..7fbcd43dc 100644 --- a/src/main/java/subway/service/StationDeleteService.java +++ b/src/main/java/subway/service/StationDeleteService.java @@ -1,9 +1,9 @@ package subway.service; import subway.domain.station.StationName; -import subway.exception.StationRegisteredOnLineException; +import subway.exception.station.StationRegisteredOnLineException; import subway.exception.SubwayApplicationException; -import subway.exception.StationNotFoundException; +import subway.exception.station.StationNotFoundException; import subway.repository.line.LineRepository; import subway.repository.station.StationRepository; import subway.specification.StationExistOnLineSpecification; diff --git a/src/main/java/subway/service/StationRegisterService.java b/src/main/java/subway/service/StationRegisterService.java index 8de2871d2..2f12a088b 100644 --- a/src/main/java/subway/service/StationRegisterService.java +++ b/src/main/java/subway/service/StationRegisterService.java @@ -3,6 +3,7 @@ import subway.exception.*; import subway.domain.station.Station; import subway.domain.station.StationName; +import subway.exception.station.StationAlreadyExistException; import subway.repository.station.StationRepository; import subway.specification.StationExistSpecification; diff --git a/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java b/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java index d5cdf4235..dd9dcddbe 100644 --- a/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java +++ b/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java @@ -1,7 +1,7 @@ package subway.specification; import subway.domain.station.Station; -import subway.exception.StationNotFoundException; +import subway.exception.station.StationNotFoundException; import subway.repository.station.StationRepository; public class AlreadyRegisteredStationSpecification { From cfe35c4f4264daac8d68ba674021f0c7b5875879 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:30:31 +0900 Subject: [PATCH 10/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지하철 목록을 가지고 오는 서비스 객체를 생성(StationListService.java) 받아온 데이터를 OutputView로 넘기면 출력. --- docs/README.md | 2 +- .../subway/domain/service/StationService.java | 5 ++++ .../subway/service/StationListService.java | 18 ++++++++++++++ .../java/subway/view/output/OutputView.java | 24 +++++++++++++++++++ .../java/subway/view/utils/Formatter.java | 15 ++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/domain/service/StationService.java create mode 100644 src/main/java/subway/service/StationListService.java create mode 100644 src/main/java/subway/view/output/OutputView.java create mode 100644 src/main/java/subway/view/utils/Formatter.java diff --git a/docs/README.md b/docs/README.md index e8b2bfc1c..eea8219d6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,7 +24,7 @@ - 예외: 노선에 등록된 역을 삭제할 경우 - 예외: 존재 하지 않는 역을 삭제할 경우 -- [ ] 지하철 역의 목록을 조회 한다 +- [x] 지하철 역의 목록을 조회 한다 - `[INFO]`를 붙여서 출력한다 - [x] 지하철 노선을 생성 한다 diff --git a/src/main/java/subway/domain/service/StationService.java b/src/main/java/subway/domain/service/StationService.java new file mode 100644 index 000000000..03291fcca --- /dev/null +++ b/src/main/java/subway/domain/service/StationService.java @@ -0,0 +1,5 @@ +package subway.domain.service; + +public class StationService { + +} diff --git a/src/main/java/subway/service/StationListService.java b/src/main/java/subway/service/StationListService.java new file mode 100644 index 000000000..50f05729c --- /dev/null +++ b/src/main/java/subway/service/StationListService.java @@ -0,0 +1,18 @@ +package subway.service; + +import subway.domain.station.Station; +import subway.repository.station.StationRepository; + +import java.util.List; + +public class StationListService { + private final StationRepository stationRepository; + + public StationListService(StationRepository stationRepository) { + this.stationRepository = stationRepository; + } + + public List get() { + return stationRepository.stations(); + } +} diff --git a/src/main/java/subway/view/output/OutputView.java b/src/main/java/subway/view/output/OutputView.java new file mode 100644 index 000000000..93cf8d23a --- /dev/null +++ b/src/main/java/subway/view/output/OutputView.java @@ -0,0 +1,24 @@ +package subway.view.output; + +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.view.utils.Formatter; + +import java.util.ArrayList; +import java.util.List; + +public class OutputView { + private static final String PRINT_STATION_HEADER = "## 역 목록"; + + public static void printStationList(List list) { + System.out.println(PRINT_STATION_HEADER); + + list.stream() + .map(Station::getName) + .map(StationName::toString) + .map(Formatter::Info) + .forEach(System.out::println); + + System.out.println(); + } +} diff --git a/src/main/java/subway/view/utils/Formatter.java b/src/main/java/subway/view/utils/Formatter.java new file mode 100644 index 000000000..5855c332c --- /dev/null +++ b/src/main/java/subway/view/utils/Formatter.java @@ -0,0 +1,15 @@ +package subway.view.utils; + +public class Formatter { + private static final String INFO_PREFIX = "[INFO]"; + private static final String ERROR_PREFIX = "[ERROR]"; + private static final String DELIMINATOR = " "; + + public static String Info(String message) { + return String.join(DELIMINATOR, INFO_PREFIX, message); + } + + public static String Error(String message) { + return String.join(DELIMINATOR, ERROR_PREFIX, message); + } +} From 8ba3059e86fa49da20736e9e7649fac962818187 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:40:31 +0900 Subject: [PATCH 11/26] =?UTF-8?q?refactor(subway):=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=EC=97=90=20=EB=A7=9E=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eNewLineService.java => LineGenerateService.java} | 12 ++++++------ ...ationService.java => StationGenerateService.java} | 2 +- ...va => StationAlreadyRegisteredSpecification.java} | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename src/main/java/subway/service/{GenerateNewLineService.java => LineGenerateService.java} (79%) rename src/main/java/subway/service/{GenerateNewStationService.java => StationGenerateService.java} (93%) rename src/main/java/subway/specification/{AlreadyRegisteredStationSpecification.java => StationAlreadyRegisteredSpecification.java} (82%) diff --git a/src/main/java/subway/service/GenerateNewLineService.java b/src/main/java/subway/service/LineGenerateService.java similarity index 79% rename from src/main/java/subway/service/GenerateNewLineService.java rename to src/main/java/subway/service/LineGenerateService.java index 14d0b58a7..528657e91 100644 --- a/src/main/java/subway/service/GenerateNewLineService.java +++ b/src/main/java/subway/service/LineGenerateService.java @@ -5,14 +5,14 @@ import subway.exception.station.StationNotFoundException; import subway.exception.SubwayApplicationException; import subway.repository.station.StationRepository; -import subway.specification.AlreadyRegisteredStationSpecification; +import subway.specification.StationAlreadyRegisteredSpecification; import subway.specification.SameUpLineAndDownLineSpecification; import subway.domain.line.Line; -public class GenerateNewLineService { +public class LineGenerateService { private final StationRepository stationRepository; - public GenerateNewLineService(StationRepository stationRepository) { + public LineGenerateService(StationRepository stationRepository) { this.stationRepository = stationRepository; } @@ -38,10 +38,10 @@ private void validateSameUpLineAndDownLine(Station upLine, Station DownLine) { } private void validateIsRegisteredStation(Station station) { - AlreadyRegisteredStationSpecification alreadyRegisteredStationSpecification = - new AlreadyRegisteredStationSpecification(stationRepository); + StationAlreadyRegisteredSpecification stationAlreadyRegisteredSpecification = + new StationAlreadyRegisteredSpecification(stationRepository); - if (!alreadyRegisteredStationSpecification.isSatisfiedBy(station)) { + if (!stationAlreadyRegisteredSpecification.isSatisfiedBy(station)) { throw new StationNotFoundException(); } } diff --git a/src/main/java/subway/service/GenerateNewStationService.java b/src/main/java/subway/service/StationGenerateService.java similarity index 93% rename from src/main/java/subway/service/GenerateNewStationService.java rename to src/main/java/subway/service/StationGenerateService.java index e4225a597..eb3a5ad17 100644 --- a/src/main/java/subway/service/GenerateNewStationService.java +++ b/src/main/java/subway/service/StationGenerateService.java @@ -6,7 +6,7 @@ import subway.exception.station.StationNameLengthException; import subway.exception.SubwayApplicationException; -public class GenerateNewStationService { +public class StationGenerateService { public Station generate(String name) { Station station; diff --git a/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java b/src/main/java/subway/specification/StationAlreadyRegisteredSpecification.java similarity index 82% rename from src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java rename to src/main/java/subway/specification/StationAlreadyRegisteredSpecification.java index dd9dcddbe..51d98c828 100644 --- a/src/main/java/subway/specification/AlreadyRegisteredStationSpecification.java +++ b/src/main/java/subway/specification/StationAlreadyRegisteredSpecification.java @@ -4,10 +4,10 @@ import subway.exception.station.StationNotFoundException; import subway.repository.station.StationRepository; -public class AlreadyRegisteredStationSpecification { +public class StationAlreadyRegisteredSpecification { StationRepository stationRepository; - public AlreadyRegisteredStationSpecification(StationRepository stationRepository) { + public StationAlreadyRegisteredSpecification(StationRepository stationRepository) { this.stationRepository = stationRepository; } From de891c3a742b6c1f643ea243739c1ee50a7c0a3e Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:47:18 +0900 Subject: [PATCH 12/26] =?UTF-8?q?fix(subway):=20Line=20=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=B4=20String=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=90=98=EC=96=B4=EC=9E=88=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Line의 이름이 LineName 으로 되어 있어야 하는데 String으로 되어 있어 잘못된 값에 대한 검증이 안돼 수정 --- src/main/java/subway/domain/line/Line.java | 8 ++++---- src/main/java/subway/service/LineGenerateService.java | 11 +++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/domain/line/Line.java b/src/main/java/subway/domain/line/Line.java index 6f151cdad..35a24f4cc 100644 --- a/src/main/java/subway/domain/line/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -8,16 +8,16 @@ import java.util.Objects; public class Line { - private String name; + private LineName name; private List sections; - private Line(String name, Station upLine, Station downLine) { + private Line(LineName name, Station upLine, Station downLine) { List sections = createSectionsWithUpLineAndDownLine(upLine, downLine); this.name = name; this.sections = sections; } - public static Line fromNameAndUpLineAndDownLine(String name, Station upLine, Station downLine) { + public static Line fromNameAndUpLineAndDownLine(LineName name, Station upLine, Station downLine) { return new Line(name, upLine, downLine); } @@ -29,7 +29,7 @@ private static List createSectionsWithUpLineAndDownLine(Station upLine, return sections; } - public String getName() { + public LineName getName() { return name; } diff --git a/src/main/java/subway/service/LineGenerateService.java b/src/main/java/subway/service/LineGenerateService.java index 528657e91..7bd5b0d97 100644 --- a/src/main/java/subway/service/LineGenerateService.java +++ b/src/main/java/subway/service/LineGenerateService.java @@ -1,6 +1,9 @@ package subway.service; +import subway.domain.line.LineName; import subway.domain.station.Station; +import subway.exception.line.LineNameFormatException; +import subway.exception.line.LineNameLengthException; import subway.exception.station.SameUpLineAndDownLineException; import subway.exception.station.StationNotFoundException; import subway.exception.SubwayApplicationException; @@ -17,15 +20,19 @@ public LineGenerateService(StationRepository stationRepository) { } public Line generate(String name, Station upLine, Station downLine) { + LineName lineName; try { validateSameUpLineAndDownLine(upLine, downLine); validateIsRegisteredStation(upLine); validateIsRegisteredStation(downLine); - } catch (SameUpLineAndDownLineException | StationNotFoundException e) { + + lineName = LineName.of(name); + } catch (SameUpLineAndDownLineException | StationNotFoundException | + LineNameFormatException | LineNameLengthException e) { throw new SubwayApplicationException(e); } - return Line.fromNameAndUpLineAndDownLine(name, upLine, downLine); + return Line.fromNameAndUpLineAndDownLine(lineName, upLine, downLine); } private void validateSameUpLineAndDownLine(Station upLine, Station DownLine) { From 6208fa6150e12f924911c8a0c58446431ff0d8a0 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:52:19 +0900 Subject: [PATCH 13/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=20=EB=93=B1=EB=A1=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지하철 노선 중복 검증 로직의 경우 repository를 참조해야 하기에 명세로 표현 --- docs/README.md | 2 +- .../line/LineAlreadyExistException.java | 4 +++ .../subway/service/LineRegisterService.java | 35 +++++++++++++++++++ .../specification/LineExistSpecification.java | 20 +++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/exception/line/LineAlreadyExistException.java create mode 100644 src/main/java/subway/service/LineRegisterService.java create mode 100644 src/main/java/subway/specification/LineExistSpecification.java diff --git a/docs/README.md b/docs/README.md index eea8219d6..72c954f01 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,7 +34,7 @@ - 예외: 상행역 및 하행역이 등록된 지하철 역이 아닐 경우 - 에외: 지하철 노선 이름 입력 포멧이 ~선 이 아닌 경우 -- [ ] 지하철 노선을 등록 한다 +- [x] 지하철 노선을 등록 한다 - 예외: 지하철 노선의 이름이 중복인 경우 - [ ] 지하철 노선을 삭제 한다 diff --git a/src/main/java/subway/exception/line/LineAlreadyExistException.java b/src/main/java/subway/exception/line/LineAlreadyExistException.java new file mode 100644 index 000000000..ca2f1ce7e --- /dev/null +++ b/src/main/java/subway/exception/line/LineAlreadyExistException.java @@ -0,0 +1,4 @@ +package subway.exception.line; + +public class LineAlreadyExistException extends RuntimeException { +} diff --git a/src/main/java/subway/service/LineRegisterService.java b/src/main/java/subway/service/LineRegisterService.java new file mode 100644 index 000000000..75617e5a0 --- /dev/null +++ b/src/main/java/subway/service/LineRegisterService.java @@ -0,0 +1,35 @@ +package subway.service; + +import subway.domain.line.Line; +import subway.domain.line.LineName; +import subway.exception.SubwayApplicationException; +import subway.exception.line.LineAlreadyExistException; +import subway.exception.station.StationAlreadyExistException; +import subway.repository.line.LineRepository;; +import subway.specification.LineExistSpecification; + +public class LineRegisterService { + private final LineRepository lineRepository; + + public LineRegisterService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public void register(Line line) { + try { + validateAlreadyExist(line.getName()); + lineRepository.addLine(line); + } catch (StationAlreadyExistException e) { + throw new SubwayApplicationException(e); + } + } + + private void validateAlreadyExist(LineName name) { + LineExistSpecification lineExistSpecification = + new LineExistSpecification(lineRepository); + + if (lineExistSpecification.isSatisfiedBy(name)) { + throw new LineAlreadyExistException(); + } + } +} diff --git a/src/main/java/subway/specification/LineExistSpecification.java b/src/main/java/subway/specification/LineExistSpecification.java new file mode 100644 index 000000000..531ac1528 --- /dev/null +++ b/src/main/java/subway/specification/LineExistSpecification.java @@ -0,0 +1,20 @@ +package subway.specification; + +import subway.domain.line.LineName; +import subway.repository.line.LineRepository; + +import java.util.Objects; + +public class LineExistSpecification { + private final LineRepository lineRepository; + + public LineExistSpecification(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public boolean isSatisfiedBy(LineName name) { + return lineRepository.lines().stream() + .anyMatch(line -> Objects.equals(line.getName(), name)); + } + +} From 82265e951c12b4795c9c4b3f5f0927daad1afe6c Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 06:59:40 +0900 Subject: [PATCH 14/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=20=EC=82=AD=EC=A0=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++-- .../exception/line/LineNotFoundException.java | 4 +++ .../repository/line/LineRepository.java | 3 +- .../repository/line/LineRepositoryImpl.java | 4 ++- .../subway/service/LineDeleteService.java | 29 +++++++++++++++++++ 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/main/java/subway/exception/line/LineNotFoundException.java create mode 100644 src/main/java/subway/service/LineDeleteService.java diff --git a/docs/README.md b/docs/README.md index 72c954f01..675682d27 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,8 +37,9 @@ - [x] 지하철 노선을 등록 한다 - 예외: 지하철 노선의 이름이 중복인 경우 -- [ ] 지하철 노선을 삭제 한다 - - 구현: 노선에 등록된 지하철 역들의 상태를 등록 안된 상태로 변경 +- [x] 지하철 노선을 삭제 한다 + - 구현: 지하철 노선을 삭제한다 + - 예외: 존재하지 않는 노선 삭제 - [ ] 지하철 노선의 목록을 조회 한다 - `[INFO]`를 붙여서 출력한다 diff --git a/src/main/java/subway/exception/line/LineNotFoundException.java b/src/main/java/subway/exception/line/LineNotFoundException.java new file mode 100644 index 000000000..7ec669aaf --- /dev/null +++ b/src/main/java/subway/exception/line/LineNotFoundException.java @@ -0,0 +1,4 @@ +package subway.exception.line; + +public class LineNotFoundException extends RuntimeException { +} diff --git a/src/main/java/subway/repository/line/LineRepository.java b/src/main/java/subway/repository/line/LineRepository.java index dde876ddb..f655d5cc6 100644 --- a/src/main/java/subway/repository/line/LineRepository.java +++ b/src/main/java/subway/repository/line/LineRepository.java @@ -1,11 +1,12 @@ package subway.repository.line; import subway.domain.line.Line; +import subway.domain.line.LineName; import java.util.List; public interface LineRepository { List lines(); void addLine(Line line); - boolean deleteLineByName(String name); + boolean deleteLineByName(LineName name); } diff --git a/src/main/java/subway/repository/line/LineRepositoryImpl.java b/src/main/java/subway/repository/line/LineRepositoryImpl.java index cb1814723..ef029de10 100644 --- a/src/main/java/subway/repository/line/LineRepositoryImpl.java +++ b/src/main/java/subway/repository/line/LineRepositoryImpl.java @@ -1,6 +1,8 @@ package subway.repository.line; import subway.domain.line.Line; +import subway.domain.line.LineName; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -20,7 +22,7 @@ public void addLine(Line line) { } @Override - public boolean deleteLineByName(String name) { + public boolean deleteLineByName(LineName name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } } diff --git a/src/main/java/subway/service/LineDeleteService.java b/src/main/java/subway/service/LineDeleteService.java new file mode 100644 index 000000000..a011aae7a --- /dev/null +++ b/src/main/java/subway/service/LineDeleteService.java @@ -0,0 +1,29 @@ +package subway.service; + +import subway.domain.line.LineName; +import subway.exception.SubwayApplicationException; +import subway.exception.line.LineNotFoundException; +import subway.repository.line.LineRepository; + +public class LineDeleteService { + private final LineRepository lineRepository; + + public LineDeleteService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public void delete(LineName name) { + try { + deleteLine(name); + } catch (LineNotFoundException e) { + throw new SubwayApplicationException(e); + } + } + + private void deleteLine(LineName name) { + boolean success = lineRepository.deleteLineByName(name); + if (!success) { + throw new LineNotFoundException(); + } + } +} From 54a6518796c82cbe7390eeb6ab1fe46077cdef6a Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 07:05:07 +0900 Subject: [PATCH 15/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 서비스 객체를 통해 노선 목록을 불러오고 outputView를 통해 출력한다. --- docs/README.md | 2 +- src/main/java/subway/domain/line/LineName.java | 5 +++++ .../java/subway/service/LineListService.java | 18 ++++++++++++++++++ .../java/subway/view/output/OutputView.java | 16 +++++++++++++++- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/main/java/subway/service/LineListService.java diff --git a/docs/README.md b/docs/README.md index 675682d27..a2f9f50da 100644 --- a/docs/README.md +++ b/docs/README.md @@ -41,7 +41,7 @@ - 구현: 지하철 노선을 삭제한다 - 예외: 존재하지 않는 노선 삭제 -- [ ] 지하철 노선의 목록을 조회 한다 +- [x] 지하철 노선의 목록을 조회 한다 - `[INFO]`를 붙여서 출력한다 - [ ] 지하철 노선에 역을 추가 한다 (구간 추가) diff --git a/src/main/java/subway/domain/line/LineName.java b/src/main/java/subway/domain/line/LineName.java index c9c58e9ad..3494eb49c 100644 --- a/src/main/java/subway/domain/line/LineName.java +++ b/src/main/java/subway/domain/line/LineName.java @@ -34,4 +34,9 @@ private void validateLength(String name) { throw new LineNameLengthException(); } } + + @Override + public String toString() { + return name; + } } diff --git a/src/main/java/subway/service/LineListService.java b/src/main/java/subway/service/LineListService.java new file mode 100644 index 000000000..81ff3d6dc --- /dev/null +++ b/src/main/java/subway/service/LineListService.java @@ -0,0 +1,18 @@ +package subway.service; + +import subway.domain.line.Line; +import subway.repository.line.LineRepository; + +import java.util.List; + +public class LineListService { + private final LineRepository lineRepository; + + public LineListService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public List get() { + return lineRepository.lines(); + } +} diff --git a/src/main/java/subway/view/output/OutputView.java b/src/main/java/subway/view/output/OutputView.java index 93cf8d23a..447011b43 100644 --- a/src/main/java/subway/view/output/OutputView.java +++ b/src/main/java/subway/view/output/OutputView.java @@ -1,14 +1,16 @@ package subway.view.output; +import subway.domain.line.Line; +import subway.domain.line.LineName; import subway.domain.station.Station; import subway.domain.station.StationName; import subway.view.utils.Formatter; -import java.util.ArrayList; import java.util.List; public class OutputView { private static final String PRINT_STATION_HEADER = "## 역 목록"; + private static final String PRINT_LINE_HEADER = "## 노선 목록"; public static void printStationList(List list) { System.out.println(PRINT_STATION_HEADER); @@ -21,4 +23,16 @@ public static void printStationList(List list) { System.out.println(); } + + public static void printLineList(List list) { + System.out.println(PRINT_LINE_HEADER); + + list.stream() + .map(Line::getName) + .map(LineName::toString) + .map(Formatter::Info) + .forEach(System.out::println); + + System.out.println(); + } } From 2761d7c00903d82ad454607418d7dfdf0ad01f38 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 08:28:56 +0900 Subject: [PATCH 16/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=EC=97=90=20=EC=97=AD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/subway/domain/line/Line.java | 10 +++ .../java/subway/domain/line/LineName.java | 12 ++++ .../subway/domain/service/StationService.java | 5 -- .../line/PositionRangeException.java | 4 ++ .../repository/line/LineRepository.java | 1 + .../repository/line/LineRepositoryImpl.java | 9 +++ .../service/StationAddToLineService.java | 68 +++++++++++++++++++ ...ationExistOnSpecificLineSpecification.java | 17 +++++ 9 files changed, 122 insertions(+), 6 deletions(-) delete mode 100644 src/main/java/subway/domain/service/StationService.java create mode 100644 src/main/java/subway/exception/line/PositionRangeException.java create mode 100644 src/main/java/subway/service/StationAddToLineService.java create mode 100644 src/main/java/subway/specification/StationExistOnSpecificLineSpecification.java diff --git a/docs/README.md b/docs/README.md index a2f9f50da..5440da6cb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -44,7 +44,7 @@ - [x] 지하철 노선의 목록을 조회 한다 - `[INFO]`를 붙여서 출력한다 -- [ ] 지하철 노선에 역을 추가 한다 (구간 추가) +- [x] 지하철 노선에 역을 추가 한다 (구간 추가) - 구현: 하나의 역은 여러개의 노선에 추가될 수 있다 - 구현: 역과 역 사이에 새로운 역이 추가될 수 있다 - 순서는 1부터 시작한다 diff --git a/src/main/java/subway/domain/line/Line.java b/src/main/java/subway/domain/line/Line.java index 35a24f4cc..97179375d 100644 --- a/src/main/java/subway/domain/line/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -8,6 +8,8 @@ import java.util.Objects; public class Line { + private static final int MINIMUM_POSITION_RANGE = 1; + private LineName name; private List sections; @@ -29,6 +31,14 @@ private static List createSectionsWithUpLineAndDownLine(Station upLine, return sections; } + public boolean isRightPosition(int position) { + return MINIMUM_POSITION_RANGE <= position && position < sections.size(); + } + + public void add(int position, Station station) { + sections.add(position, station); + } + public LineName getName() { return name; } diff --git a/src/main/java/subway/domain/line/LineName.java b/src/main/java/subway/domain/line/LineName.java index 3494eb49c..1a701d187 100644 --- a/src/main/java/subway/domain/line/LineName.java +++ b/src/main/java/subway/domain/line/LineName.java @@ -1,8 +1,11 @@ package subway.domain.line; +import subway.domain.station.StationName; import subway.exception.line.LineNameFormatException; import subway.exception.line.LineNameLengthException; +import java.util.Objects; + public class LineName { private static final int MINIMUM_LINE_NAME_SIZE = 2; private static final String LINE_IN_KOREAN = "선"; @@ -35,6 +38,15 @@ private void validateLength(String name) { } } + @Override + public boolean equals(Object o) { + if (o instanceof LineName) { + return Objects.equals(name, ((LineName) o).name); + } + + return false; + } + @Override public String toString() { return name; diff --git a/src/main/java/subway/domain/service/StationService.java b/src/main/java/subway/domain/service/StationService.java deleted file mode 100644 index 03291fcca..000000000 --- a/src/main/java/subway/domain/service/StationService.java +++ /dev/null @@ -1,5 +0,0 @@ -package subway.domain.service; - -public class StationService { - -} diff --git a/src/main/java/subway/exception/line/PositionRangeException.java b/src/main/java/subway/exception/line/PositionRangeException.java new file mode 100644 index 000000000..4fc91a7fd --- /dev/null +++ b/src/main/java/subway/exception/line/PositionRangeException.java @@ -0,0 +1,4 @@ +package subway.exception.line; + +public class PositionRangeException extends RuntimeException { +} diff --git a/src/main/java/subway/repository/line/LineRepository.java b/src/main/java/subway/repository/line/LineRepository.java index f655d5cc6..1407b8ad9 100644 --- a/src/main/java/subway/repository/line/LineRepository.java +++ b/src/main/java/subway/repository/line/LineRepository.java @@ -9,4 +9,5 @@ public interface LineRepository { List lines(); void addLine(Line line); boolean deleteLineByName(LineName name); + Line findLineByName(LineName name); } diff --git a/src/main/java/subway/repository/line/LineRepositoryImpl.java b/src/main/java/subway/repository/line/LineRepositoryImpl.java index ef029de10..0da82f9a5 100644 --- a/src/main/java/subway/repository/line/LineRepositoryImpl.java +++ b/src/main/java/subway/repository/line/LineRepositoryImpl.java @@ -2,6 +2,7 @@ import subway.domain.line.Line; import subway.domain.line.LineName; +import subway.exception.line.LineNotFoundException; import java.util.ArrayList; import java.util.Collections; @@ -25,4 +26,12 @@ public void addLine(Line line) { public boolean deleteLineByName(LineName name) { return lines.removeIf(line -> Objects.equals(line.getName(), name)); } + + @Override + public Line findLineByName(LineName name) { + return lines.stream() + .filter(line -> Objects.equals(line.getName(), name)) + .findAny() + .orElseThrow(() -> new LineNotFoundException()); + } } diff --git a/src/main/java/subway/service/StationAddToLineService.java b/src/main/java/subway/service/StationAddToLineService.java new file mode 100644 index 000000000..1bdbcb401 --- /dev/null +++ b/src/main/java/subway/service/StationAddToLineService.java @@ -0,0 +1,68 @@ +package subway.service; + +import subway.domain.line.Line; +import subway.domain.line.LineName; +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.exception.SubwayApplicationException; +import subway.exception.line.PositionRangeException; +import subway.exception.station.StationAlreadyExistException; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.specification.StationExistOnSpecificLineSpecification; + +public class StationAddToLineService { + private final StationRepository stationRepository; + private final LineRepository lineRepository; + + public StationAddToLineService(StationRepository stationRepository, + LineRepository lineRepository) { + this.stationRepository = stationRepository; + this.lineRepository = lineRepository; + } + + public void add(String lineName, String stationName, String position) { + try { + StationName convertedStationName = StationName.of(stationName); + LineName convertedLineName = LineName.of(lineName); + + Station station = findStationFromRepository(convertedStationName); + Line line = findLineFromRepository(convertedLineName); + + isRightPosition(line, toInteger(position)); + validateDuplicateStationOnLine(convertedLineName, station.getName()); + + lineRepository.findLineByName(convertedLineName).add(toInteger(position), station); + } catch (RuntimeException e) { + throw new SubwayApplicationException(e); + } + } + + private int toInteger(String position) { + return Integer.parseInt(position); + } + + + private void isRightPosition(Line line, int position) { + if (!line.isRightPosition(position)) { + throw new PositionRangeException(); + } + } + + private Station findStationFromRepository(StationName stationName) { + return stationRepository.getStationByName(stationName); + } + + private Line findLineFromRepository(LineName lineName) { + return lineRepository.findLineByName(lineName); + } + + private void validateDuplicateStationOnLine(LineName lineName, StationName stationName) { + StationExistOnSpecificLineSpecification stationExistOnSpecificLineSpecification = + new StationExistOnSpecificLineSpecification(lineRepository); + + if (stationExistOnSpecificLineSpecification.isSatisfiedBy(lineName, stationName)) { + throw new StationAlreadyExistException(); + } + } +} diff --git a/src/main/java/subway/specification/StationExistOnSpecificLineSpecification.java b/src/main/java/subway/specification/StationExistOnSpecificLineSpecification.java new file mode 100644 index 000000000..100f2e322 --- /dev/null +++ b/src/main/java/subway/specification/StationExistOnSpecificLineSpecification.java @@ -0,0 +1,17 @@ +package subway.specification; + +import subway.domain.line.LineName; +import subway.domain.station.StationName; +import subway.repository.line.LineRepository; + +public class StationExistOnSpecificLineSpecification { + private final LineRepository lineRepository; + + public StationExistOnSpecificLineSpecification(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public boolean isSatisfiedBy(LineName lineName, StationName stationName) { + return lineRepository.findLineByName(lineName).contains(stationName); + } +} From 2565e79b942f27fa2f3c9940bfd6e5ebe9f6f7b8 Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 08:47:43 +0900 Subject: [PATCH 17/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=EC=97=90=20=EC=97=AD=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/subway/domain/line/Line.java | 10 +++++ .../line/SectionSizeLowException.java | 4 ++ .../service/LineDeleteStationService.java | 38 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/exception/line/SectionSizeLowException.java create mode 100644 src/main/java/subway/service/LineDeleteStationService.java diff --git a/docs/README.md b/docs/README.md index 5440da6cb..b8e496b04 100644 --- a/docs/README.md +++ b/docs/README.md @@ -53,7 +53,7 @@ - 예외: 역 등록 위치 입력 시 구간 범위 를 벗어난 경우 - 1 ~ 구간.size()-1 까지 -- [ ] 지하철 노선에 역을 삭제 한다 (구간 삭제) +- [x] 지하철 노선에 역을 삭제 한다 (구간 삭제) - 구현: 종점을 제거할 경우 다음 역이 종점이 된다 - 예외: 노선에 포함된 역이 2개 이하일 때 역을 제거하려 하는 경우 diff --git a/src/main/java/subway/domain/line/Line.java b/src/main/java/subway/domain/line/Line.java index 97179375d..97aff4706 100644 --- a/src/main/java/subway/domain/line/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -2,12 +2,14 @@ import subway.domain.station.Station; import subway.domain.station.StationName; +import subway.exception.line.SectionSizeLowException; import java.util.LinkedList; import java.util.List; import java.util.Objects; public class Line { + private static final int MINIMUM_SECTIONS_LENGTH = 2; private static final int MINIMUM_POSITION_RANGE = 1; private LineName name; @@ -39,6 +41,14 @@ public void add(int position, Station station) { sections.add(position, station); } + public boolean deleteStationByName(StationName stationName) { + if (sections.size() == MINIMUM_SECTIONS_LENGTH) { + throw new SectionSizeLowException(); + } + + return sections.removeIf(station -> Objects.equals(station.getName(), name)); + } + public LineName getName() { return name; } diff --git a/src/main/java/subway/exception/line/SectionSizeLowException.java b/src/main/java/subway/exception/line/SectionSizeLowException.java new file mode 100644 index 000000000..3a9f18d3c --- /dev/null +++ b/src/main/java/subway/exception/line/SectionSizeLowException.java @@ -0,0 +1,4 @@ +package subway.exception.line; + +public class SectionSizeLowException extends RuntimeException { +} diff --git a/src/main/java/subway/service/LineDeleteStationService.java b/src/main/java/subway/service/LineDeleteStationService.java new file mode 100644 index 000000000..8631c6113 --- /dev/null +++ b/src/main/java/subway/service/LineDeleteStationService.java @@ -0,0 +1,38 @@ +package subway.service; + +import subway.domain.line.Line; +import subway.domain.line.LineName; +import subway.domain.station.StationName; +import subway.exception.SubwayApplicationException; +import subway.exception.line.LineNotFoundException; +import subway.exception.line.SectionSizeLowException; +import subway.exception.station.StationNotFoundException; +import subway.repository.line.LineRepository; + +public class LineDeleteStationService { + private final LineRepository lineRepository; + + public LineDeleteStationService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public void delete(LineName lineName, StationName stationName) { + try { + deleteStation(lineName, stationName); + } catch (LineNotFoundException | StationNotFoundException | SectionSizeLowException e) { + throw new SubwayApplicationException(e); + } + } + + private void deleteStation(LineName lineName, StationName stationName) { + Line line = findLineByName(lineName); + + if (!line.deleteStationByName(stationName)) { + throw new StationNotFoundException(); + } + } + + private Line findLineByName(LineName lineName) { + return lineRepository.findLineByName(lineName); + } +} From f1188c51f90cdd3b3b18672220bcf56873d32e1f Mon Sep 17 00:00:00 2001 From: Minsung Son Date: Tue, 15 Dec 2020 08:53:40 +0900 Subject: [PATCH 18/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=EC=97=90=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EB=90=9C=20=EC=97=AD=EC=9D=84=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/subway/Application.java | 26 ++++++++++++++++--- src/main/java/subway/domain/line/Line.java | 5 ++++ .../subway/service/SectionListService.java | 21 +++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/main/java/subway/service/SectionListService.java diff --git a/docs/README.md b/docs/README.md index b8e496b04..854422c57 100644 --- a/docs/README.md +++ b/docs/README.md @@ -57,7 +57,7 @@ - 구현: 종점을 제거할 경우 다음 역이 종점이 된다 - 예외: 노선에 포함된 역이 2개 이하일 때 역을 제거하려 하는 경우 -- [ ] 지하철 노선에 등록된 역을 조회할 수 있다 +- [x] 지하철 노선에 등록된 역을 조회할 수 있다 - 구현: 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다 - [ ] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..507b6eacb 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,30 @@ package subway; -import java.util.Scanner; +import subway.domain.line.Line; +import subway.domain.station.Station; +import subway.repository.line.LineRepository; +import subway.repository.line.LineRepositoryImpl; +import subway.repository.station.StationRepository; +import subway.repository.station.StationRepositoryImpl; +import subway.service.*; public class Application { public static void main(String[] args) { - final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + LineRepository lineRepository = new LineRepositoryImpl(); + StationRepository stationRepository = new StationRepositoryImpl(); + + Station station1 = new StationGenerateService().generate("테스트역"); + Station station2 = new StationGenerateService().generate("테스트2역"); + Station station3 = new StationGenerateService().generate("테스역"); + + new StationRegisterService(stationRepository).register(station1); + new StationRegisterService(stationRepository).register(station2); + new StationRegisterService(stationRepository).register(station3); + + Line line = new LineGenerateService(stationRepository).generate("테스트선", station1, station2); + new LineRegisterService(lineRepository).register(line); + + new StationAddToLineService(stationRepository, lineRepository).add("테스트선", "테스역", "3"); + new LineListService(lineRepository).get(); } } diff --git a/src/main/java/subway/domain/line/Line.java b/src/main/java/subway/domain/line/Line.java index 97aff4706..9ef082c67 100644 --- a/src/main/java/subway/domain/line/Line.java +++ b/src/main/java/subway/domain/line/Line.java @@ -4,6 +4,7 @@ import subway.domain.station.StationName; import subway.exception.line.SectionSizeLowException; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Objects; @@ -33,6 +34,10 @@ private static List createSectionsWithUpLineAndDownLine(Station upLine, return sections; } + public List sections() { + return Collections.unmodifiableList(sections); + } + public boolean isRightPosition(int position) { return MINIMUM_POSITION_RANGE <= position && position < sections.size(); } diff --git a/src/main/java/subway/service/SectionListService.java b/src/main/java/subway/service/SectionListService.java new file mode 100644 index 000000000..be603493f --- /dev/null +++ b/src/main/java/subway/service/SectionListService.java @@ -0,0 +1,21 @@ +package subway.service; + +import subway.domain.line.Line; +import subway.domain.line.LineName; +import subway.domain.station.Station; +import subway.repository.line.LineRepository; + +import java.util.List; + +public class SectionListService { + private final LineRepository lineRepository; + + public SectionListService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public List get(LineName lineName) { + Line line = lineRepository.findLineByName(lineName); + return line.sections(); + } +} From 6e48845cf02059339b22229fbbdaa1a698845053 Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 20:12:37 +0900 Subject: [PATCH 19/26] =?UTF-8?q?docs(subway):=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9E=85=EB=A0=A5=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 140 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/docs/README.md b/docs/README.md index 854422c57..baef2e8ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -62,6 +62,146 @@ - [ ] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. +- [ ] 메인 화면을 출력한다 + - 구현: 메인화면은 다음과 같이 출력한다 + ``` + ## 메인 화면 + 1. 역 관리 + 2. 노선 관리 + 3. 구간 관리 + 4. 지하철 노선도 출력 + Q. 종료 + ``` + - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. + +- [ ] 메인 화면 입력을 받는다. + - 구현: 사용자로 부터 기능을 선택 받는다. + - 구현: 올바른 입력인 경우, 해당 기능을 수행한다. + - 예외: 존재하지 않는 기능인 경우 + - `[ERROR]` 선택할 수 없는 기능입니다. + - "원하는 기능을 선택하세요." 재 출력 및 재 입력 + +- 공통사항 + - [ ] 입력시 에러가 발생한 경우, 기능 선택이 잘못된 경우를 제외하고는 자신의 상위 화면으로 이동한다. + - [ ] 기능 선택이 잘못된 경우는 기능 선택 메세지를 다시 출력하고 입력받는다. + - [ ] 기능수행 완료 후 메인 화면으로 돌아온다 + +- [ ] 역 관리 화면을 출력한다. + - 구현: 역 관리 화면은 다음과 같이 출력 한다 + ``` + ## 역 관리 화면 + 1. 역 등록 + 2. 역 삭제 + 3. 역 조회 + B. 돌아가기 + ``` + - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. + +- [ ] 역 관리 화면 입력을 받는다. + - 구현: 사용자로 부터 기능을 선택 받는다. + + - 구현: 올바른 입력인 경우 아래와 같이 수행한다 + - 1. 역 등록 + - `## 등록할 역 이름을 입력하세요.` 출력 + - 에러시 에러 메시지 출력 + - 성공 시 `[INFO] 지하철 역이 등록되었습니다.` 출력 + - 2. 역 삭제 + - `## 삭제할 역 이름을 입력하세요.` 출력 + - 에러시 에러 메시지 출력 + - 성공할 경우 `[INFO] 지하철 역이 삭제되었습니다.` 출력 + + - 3. 역 조회 + - 역 조회시 아래와 같이 출력한다. + ``` + ## 역 목록 + $LIST + ``` + + - B. 돌아가기 + - 메인 화면으로 돌아간다 + + - 예외: 존재하지 않는 기능인 경우 + - `[ERROR] 선택할 수 없는 기능입니다.` 출력 + +- [ ] 노선 관리 화면을 출력한다 + - 구현: 역 관리 화면은 다음과 같이 출력 한다 + ``` + ## 역 관리 화면 + 1. 역 등록 + 2. 역 삭제 + 3. 역 조회 + B. 돌아가기 + ``` + - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. + +- [ ] 노선 관리 화면 입력을 받는다. + - 구현: 사용자로 부터 기능을 선택 받는다. + + - 구현: 올바른 입력인 경우 아래와 같이 수행한다 + - 1. 노선 등록 + - `## 등록할 노선 이름을 입력하세요.` 출력 및 입력 + - 에러시 에러 메시지 출력 + - 성공 시 다음 진행 + - `## 등록할 노선의 상행 종점역 이름을 입력하세요.` 출력 및 입력 + - 에러시 에러 메시지 출력 + - 성공 시 다음 진행 + - `## 등록할 노선의 하행 종점역 이름을 입력하세요.` 출력 및 입력 + - 에러시 에러 메시지 출력 + - 성공 시 `[INFO] 지하철 노선이 등록되었습니다.` 출력 + - 2. 역 삭제 + - `## 삭제할 역 이름을 입력하세요.` 출력 + - 실패할 경우 `[ERROR] $ERROR_MESSAGE` 출력 + - 성공할 경우 `[INFO] 지하철 역이 삭제되었습니다.` 출력 + + - 3. 노선 조회 + - 노선 조회시 아래와 같이 출력한다. + ``` + ## 노선 목록 + $LIST + ``` + + - B. 돌아가기 + - 메인 화면으로 돌아간다 + + - 예외: 존재하지 않는 기능인 경우 + - `[ERROR] 선택할 수 없는 기능입니다.` 출력 + +- [ ] 구간 관리 화면을 출력한다 + - 구현: 역 관리 화면은 다음과 같이 출력 한다 + ``` + ## 구간 관리 화면 + 1. 구간 등록 + 2. 구간 삭제 + B. 돌아가기 + ``` + - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. + +- [ ] 노선 관리 화면 입력을 받는다. + - 구현: 사용자로 부터 기능을 선택 받는다. + + - 구현: 올바른 입력인 경우 아래와 같이 수행한다 + - 1. 구간 등록 + - `## 노선을 입력하세요.` 출력 및 입력 + - 에러시 에러 메시지 출력 + - 성공 시 다음 진행 + - `## 역이름을 입력하세요.` 출력 및 입력 + - 에러시 에러 메시지 출력 + - 성공 시 다음 진행 + - `## 순서를 입력하세요.` 출력 및 입력 + - 에러시 에러 메시지 출력 + - 성공 시 `[INFO] 지하철 노선이 등록되었습니다.` 출력 + - 2. 구간 삭제 + - `## 삭제할 구간의 노선을 입력하세요.` 출력 + - 에러시 에러 메시지 출력 + - 성공 시 다음 진행 + - `## 삭제할 구간의 역을 입력하세요.` 출력 + - 에러시 에러 메시지 출력 + - 성공 시 `[INFO] 구간이 삭제되었습니다.` 출력 + - B. 돌아가기 + - 메인 화면으로 돌아간다 + + - 예외: 존재하지 않는 기능인 경우 + - `[ERROR] 선택할 수 없는 기능입니다.` 출력 ## 📝 License From 0a26724abaea65a283a28b7ab8350056a3606672 Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 20:32:47 +0900 Subject: [PATCH 20/26] =?UTF-8?q?feat(subway):=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +- .../java/subway/controller/main/MainMenu.java | 59 +++++++++++++++++++ .../controller/main/MainMenuController.java | 50 ++++++++++++++++ .../exception/InvalidFunctionException.java | 11 ++++ .../java/subway/view/inputView/InputView.java | 11 ++++ .../java/subway/view/output/MainMenuView.java | 8 +++ .../java/subway/view/output/OutputView.java | 37 +----------- .../java/subway/view/output/ScreenView.java | 21 +++++++ 8 files changed, 166 insertions(+), 37 deletions(-) create mode 100644 src/main/java/subway/controller/main/MainMenu.java create mode 100644 src/main/java/subway/controller/main/MainMenuController.java create mode 100644 src/main/java/subway/exception/InvalidFunctionException.java create mode 100644 src/main/java/subway/view/inputView/InputView.java create mode 100644 src/main/java/subway/view/output/MainMenuView.java create mode 100644 src/main/java/subway/view/output/ScreenView.java diff --git a/docs/README.md b/docs/README.md index baef2e8ce..9057a4f49 100644 --- a/docs/README.md +++ b/docs/README.md @@ -60,9 +60,9 @@ - [x] 지하철 노선에 등록된 역을 조회할 수 있다 - 구현: 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다 -- [ ] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. +- [x] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. -- [ ] 메인 화면을 출력한다 +- [x] 메인 화면을 출력한다 - 구현: 메인화면은 다음과 같이 출력한다 ``` ## 메인 화면 @@ -74,7 +74,7 @@ ``` - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. -- [ ] 메인 화면 입력을 받는다. +- [x] 메인 화면 입력을 받는다. - 구현: 사용자로 부터 기능을 선택 받는다. - 구현: 올바른 입력인 경우, 해당 기능을 수행한다. - 예외: 존재하지 않는 기능인 경우 diff --git a/src/main/java/subway/controller/main/MainMenu.java b/src/main/java/subway/controller/main/MainMenu.java new file mode 100644 index 000000000..71e794244 --- /dev/null +++ b/src/main/java/subway/controller/main/MainMenu.java @@ -0,0 +1,59 @@ +package subway.controller.main; + +import subway.exception.InvalidFunctionException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +enum MainMenu { + + STATION_MANAGEMENT("1", "역 관리", () -> { + + }), + LINE_MANAGEMENT("2", "노선 관리", () -> { + + }), + SECTION_MANAGEMENT("3", "구간 관리", () -> { + + }), + PRINT_SUBWAY_MAP("4", "지하철 노선도 출력", () -> { + + }), + EXIT("Q", "종료", null); + + private final static String HEADER = "## 메인 화면"; + private final static String DELIMITER = ". "; + + String order; + String menuName; + Runnable function; + + MainMenu(String order, String menuName, Runnable function) { + this.order = order; + this.menuName = menuName; + this.function = function; + } + + public static String toMenuString() { + List menuList = Arrays.stream(MainMenu.values()) + .map(menu -> String.join(DELIMITER, String.valueOf(menu.order), menu.menuName)) + .collect(Collectors.toList()); + + List output = new ArrayList<>(); + output.add(HEADER); + output.addAll(menuList); + + return String.join(System.lineSeparator(), output); + } + + public static Runnable find(String input) { + return Arrays.stream(MainMenu.values()) + .filter(menu -> Objects.equals(menu.order, input)) + .findAny() + .orElseThrow(() -> new InvalidFunctionException()) + .function; + } +} diff --git a/src/main/java/subway/controller/main/MainMenuController.java b/src/main/java/subway/controller/main/MainMenuController.java new file mode 100644 index 000000000..daa627859 --- /dev/null +++ b/src/main/java/subway/controller/main/MainMenuController.java @@ -0,0 +1,50 @@ +package subway.controller.main; + +import subway.exception.InvalidFunctionException; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.view.inputView.InputView; +import subway.view.output.MainMenuView; +import subway.view.output.OutputView; + +public class MainMenuController implements Runnable { + + private StationRepository stationRepository; + private LineRepository lineRepository; + + public MainMenuController(StationRepository stationRepository, LineRepository lineRepository) { + this.stationRepository = stationRepository; + this.lineRepository = lineRepository; + } + + @Override + public void run() { + while (true) { + MainMenuView.printMenu(MainMenu.toMenuString()); + Runnable function = selectFunction(); + if(function == null) { + break; + } + function.run(); + } + } + + private Runnable selectFunction() { + MainMenuView.chooseFunction(); + String input = InputView.scan(); + + Runnable function; + try { + function = MainMenu.find(input); + } catch (InvalidFunctionException e) { + OutputView.print(e.getMessage()); + return selectFunction(); + } + + return function; + } + + public static void main(String[] args) { + new MainMenuController(null, null).run(); + } +} diff --git a/src/main/java/subway/exception/InvalidFunctionException.java b/src/main/java/subway/exception/InvalidFunctionException.java new file mode 100644 index 000000000..65c03cddd --- /dev/null +++ b/src/main/java/subway/exception/InvalidFunctionException.java @@ -0,0 +1,11 @@ +package subway.exception; + +import subway.view.util.Formatter; + +public class InvalidFunctionException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("선택할 수 없는 기능입니다."); + + public InvalidFunctionException() { + super(MESSAGE); + } +} diff --git a/src/main/java/subway/view/inputView/InputView.java b/src/main/java/subway/view/inputView/InputView.java new file mode 100644 index 000000000..9ad8d444c --- /dev/null +++ b/src/main/java/subway/view/inputView/InputView.java @@ -0,0 +1,11 @@ +package subway.view.inputView; + +import java.util.Scanner; + +public class InputView { + private static Scanner scanner = new Scanner(System.in); + + public static String scan() { + return scanner.nextLine(); + } +} diff --git a/src/main/java/subway/view/output/MainMenuView.java b/src/main/java/subway/view/output/MainMenuView.java new file mode 100644 index 000000000..70557baba --- /dev/null +++ b/src/main/java/subway/view/output/MainMenuView.java @@ -0,0 +1,8 @@ +package subway.view.output; + +public class MainMenuView extends ScreenView { + public static void printMenu(final String menu) { + System.out.println(menu); + System.out.println(); + } +} diff --git a/src/main/java/subway/view/output/OutputView.java b/src/main/java/subway/view/output/OutputView.java index 447011b43..e9c433d0f 100644 --- a/src/main/java/subway/view/output/OutputView.java +++ b/src/main/java/subway/view/output/OutputView.java @@ -1,38 +1,7 @@ package subway.view.output; -import subway.domain.line.Line; -import subway.domain.line.LineName; -import subway.domain.station.Station; -import subway.domain.station.StationName; -import subway.view.utils.Formatter; - -import java.util.List; - public class OutputView { - private static final String PRINT_STATION_HEADER = "## 역 목록"; - private static final String PRINT_LINE_HEADER = "## 노선 목록"; - - public static void printStationList(List list) { - System.out.println(PRINT_STATION_HEADER); - - list.stream() - .map(Station::getName) - .map(StationName::toString) - .map(Formatter::Info) - .forEach(System.out::println); - - System.out.println(); - } - - public static void printLineList(List list) { - System.out.println(PRINT_LINE_HEADER); - - list.stream() - .map(Line::getName) - .map(LineName::toString) - .map(Formatter::Info) - .forEach(System.out::println); - - System.out.println(); - } + public static void print(String message) { + System.out.println(message); + }; } diff --git a/src/main/java/subway/view/output/ScreenView.java b/src/main/java/subway/view/output/ScreenView.java new file mode 100644 index 000000000..d507f94ba --- /dev/null +++ b/src/main/java/subway/view/output/ScreenView.java @@ -0,0 +1,21 @@ +package subway.view.output; + +public class ScreenView { + + private static final String CHOOSE_FUNCTION = "## 원하는 기능을 선택하세요"; + private static final String REGISTER_FUNCTION = "## 등록할 %s %s 이름을 입력하세요"; + private static final String DELETE_FUNCTION = "## 삭제할 %s을 입력하세요"; + + public static void chooseFunction() { + System.out.println(CHOOSE_FUNCTION); + } + + protected static String registerFunction(String function, String name) { + return String.format(REGISTER_FUNCTION, function, name); + } + + protected static String deleteFunction(String function) { + return String.format(DELETE_FUNCTION, function); + } + +} From f45a976bb680418f7439114844633088d3fbcf1e Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 21:00:11 +0900 Subject: [PATCH 21/26] =?UTF-8?q?feat(subway):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=EB=8F=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 3 +- .../java/subway/controller/main/MainMenu.java | 11 ++++-- .../controller/main/MainMenuController.java | 5 +++ .../java/subway/service/RouteMapService.java | 39 +++++++++++++++++++ 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 src/main/java/subway/service/RouteMapService.java diff --git a/docs/README.md b/docs/README.md index 9057a4f49..5266501d5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -60,7 +60,7 @@ - [x] 지하철 노선에 등록된 역을 조회할 수 있다 - 구현: 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다 -- [x] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. +- [x] 에러 발생 시 `[ERROR]`를 붙여서 출력한다. - [x] 메인 화면을 출력한다 - 구현: 메인화면은 다음과 같이 출력한다 @@ -73,6 +73,7 @@ Q. 종료 ``` - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. + - [x] 구현: 지하철 노선도를 구현한다. - [x] 메인 화면 입력을 받는다. - 구현: 사용자로 부터 기능을 선택 받는다. diff --git a/src/main/java/subway/controller/main/MainMenu.java b/src/main/java/subway/controller/main/MainMenu.java index 71e794244..f84910305 100644 --- a/src/main/java/subway/controller/main/MainMenu.java +++ b/src/main/java/subway/controller/main/MainMenu.java @@ -1,6 +1,8 @@ package subway.controller.main; +import subway.controller.ControllerContainer; import subway.exception.InvalidFunctionException; +import subway.view.output.OutputView; import java.util.ArrayList; import java.util.Arrays; @@ -11,16 +13,17 @@ enum MainMenu { STATION_MANAGEMENT("1", "역 관리", () -> { - + ControllerContainer.getStationManagementController().run(); }), LINE_MANAGEMENT("2", "노선 관리", () -> { - + ControllerContainer.getLineManagementController().run(); }), SECTION_MANAGEMENT("3", "구간 관리", () -> { - + ControllerContainer.getSectionManagementController().run(); }), PRINT_SUBWAY_MAP("4", "지하철 노선도 출력", () -> { - + String routeMap = ControllerContainer.getMainMenuController().getRouteMap(); + OutputView.print(routeMap); }), EXIT("Q", "종료", null); diff --git a/src/main/java/subway/controller/main/MainMenuController.java b/src/main/java/subway/controller/main/MainMenuController.java index daa627859..cd685a176 100644 --- a/src/main/java/subway/controller/main/MainMenuController.java +++ b/src/main/java/subway/controller/main/MainMenuController.java @@ -3,6 +3,7 @@ import subway.exception.InvalidFunctionException; import subway.repository.line.LineRepository; import subway.repository.station.StationRepository; +import subway.service.RouteMapService; import subway.view.inputView.InputView; import subway.view.output.MainMenuView; import subway.view.output.OutputView; @@ -44,6 +45,10 @@ private Runnable selectFunction() { return function; } + public String getRouteMap() { + return new RouteMapService(lineRepository).get(); + } + public static void main(String[] args) { new MainMenuController(null, null).run(); } diff --git a/src/main/java/subway/service/RouteMapService.java b/src/main/java/subway/service/RouteMapService.java new file mode 100644 index 000000000..6ddb3ecc9 --- /dev/null +++ b/src/main/java/subway/service/RouteMapService.java @@ -0,0 +1,39 @@ +package subway.service; + +import subway.domain.line.Line; +import subway.repository.line.LineRepository; +import subway.view.util.Formatter; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class RouteMapService { + private static final String DOTS = "---"; + + private final LineRepository lineRepository; + + public RouteMapService(LineRepository lineRepository) { + this.lineRepository = lineRepository; + } + + public String get() { + return toRouteMap(); + } + + private String toRouteMap() { + List routeMap = lineRepository.lines().stream().map(line -> { + List lineMap = new ArrayList<>(); + + lineMap.add(Formatter.Info(line.getName().toString())); + lineMap.add(Formatter.Info(DOTS)); + lineMap.addAll(line.sections().stream() + .map(station -> Formatter.Info(station.getName().toString())) + .collect(Collectors.toList())); + + return String.join(System.lineSeparator(), lineMap); + }).collect(Collectors.toList()); + + return String.join(System.lineSeparator(), routeMap); + } +} From 8421620bd9793682106989345195ecb27cbb4e91 Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 22:32:36 +0900 Subject: [PATCH 22/26] =?UTF-8?q?feat(subway):=20=EC=97=AD=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=EB=B0=8F=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +- .../station/StationManagementController.java | 87 +++++++++++++++++++ .../station/StationManagementMenu.java | 60 +++++++++++++ .../subway/domain/station/StationName.java | 8 +- .../view/output/StationManagementView.java | 42 +++++++++ .../view/{utils => util}/Formatter.java | 6 +- 6 files changed, 201 insertions(+), 6 deletions(-) create mode 100644 src/main/java/subway/controller/station/StationManagementController.java create mode 100644 src/main/java/subway/controller/station/StationManagementMenu.java create mode 100644 src/main/java/subway/view/output/StationManagementView.java rename src/main/java/subway/view/{utils => util}/Formatter.java (66%) diff --git a/docs/README.md b/docs/README.md index 5266501d5..ae1b90963 100644 --- a/docs/README.md +++ b/docs/README.md @@ -87,7 +87,7 @@ - [ ] 기능 선택이 잘못된 경우는 기능 선택 메세지를 다시 출력하고 입력받는다. - [ ] 기능수행 완료 후 메인 화면으로 돌아온다 -- [ ] 역 관리 화면을 출력한다. +- [x] 역 관리 화면을 출력한다. - 구현: 역 관리 화면은 다음과 같이 출력 한다 ``` ## 역 관리 화면 @@ -98,7 +98,7 @@ ``` - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. -- [ ] 역 관리 화면 입력을 받는다. +- [x] 역 관리 화면 입력을 받는다. - 구현: 사용자로 부터 기능을 선택 받는다. - 구현: 올바른 입력인 경우 아래와 같이 수행한다 diff --git a/src/main/java/subway/controller/station/StationManagementController.java b/src/main/java/subway/controller/station/StationManagementController.java new file mode 100644 index 000000000..54a153426 --- /dev/null +++ b/src/main/java/subway/controller/station/StationManagementController.java @@ -0,0 +1,87 @@ +package subway.controller.station; + +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.exception.InvalidFunctionException; +import subway.exception.SubwayApplicationException; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.service.StationDeleteService; +import subway.service.StationGenerateService; +import subway.service.StationListService; +import subway.service.StationRegisterService; +import subway.view.inputView.InputView; +import subway.view.output.MainMenuView; +import subway.view.output.OutputView; +import subway.view.output.StationManagementView; + +import java.util.List; + +public class StationManagementController implements Runnable { + + private StationRepository stationRepository; + private LineRepository lineRepository; + + public StationManagementController(StationRepository stationRepository, LineRepository lineRepository) { + this.stationRepository = stationRepository; + this.lineRepository = lineRepository; + } + + @Override + public void run() { + try { + MainMenuView.printMenu(StationManagementMenu.toMenuString()); + Runnable function = selectFunction(); + + if (function == null) { + return; + } + + function.run(); + } catch (SubwayApplicationException e) { + run(); + } + } + + private Runnable selectFunction() { + MainMenuView.chooseFunction(); + String input = InputView.scan(); + + Runnable function; + try { + function = StationManagementMenu.find(input); + } catch (InvalidFunctionException e) { + OutputView.print(e.getMessage()); + return selectFunction(); + } + + return function; + } + + public void registerStation() { + StationManagementView.printRegisterMessage(); + + String name = InputView.scan(); + + Station station = new StationGenerateService().generate(name); + new StationRegisterService(stationRepository).register(station); + + StationManagementView.printRegisterFinishMessage(); + } + + public void deleteStation() { + StationManagementView.printDeleteMessage(); + + String name = InputView.scan(); + + StationName stationName = StationName.of(name); + new StationDeleteService(stationRepository, lineRepository).delete(stationName); + + StationManagementView.printDeleteFinishMessage(); + } + + public void viewStations() { + List stations = new StationListService(stationRepository).get(); + StationManagementView.printStationList(stations); + } +} diff --git a/src/main/java/subway/controller/station/StationManagementMenu.java b/src/main/java/subway/controller/station/StationManagementMenu.java new file mode 100644 index 000000000..e34b6a699 --- /dev/null +++ b/src/main/java/subway/controller/station/StationManagementMenu.java @@ -0,0 +1,60 @@ +package subway.controller.station; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import subway.controller.ControllerContainer; +import subway.exception.InvalidFunctionException; + +public enum StationManagementMenu { + + + STATION_REGISTER("1", "역 등록", () -> { + ControllerContainer.getStationManagementController().registerStation(); + }), + STATION_DELETE("2", "역 삭제", () -> { + ControllerContainer.getStationManagementController().deleteStation(); + }), + STATION_SCAN("3", "역 조회", () -> { + ControllerContainer.getStationManagementController().viewStations(); + }), + BACK("B", "돌아가기", null), + ; + + private static final String HEADER = "\n## 역 관리 화면"; + private final static String DELIMITER = ". "; + + String order; + String menuName; + Runnable function; + + StationManagementMenu(String order, String menuName, Runnable function) { + this.order = order; + this.menuName = menuName; + this.function = function; + } + + public static String toMenuString() { + List menuList = Arrays.stream(StationManagementMenu.values()) + .map(menu -> String.join(DELIMITER, String.valueOf(menu.order), menu.menuName)) + .collect(Collectors.toList()); + + List output = new ArrayList<>(); + output.add(HEADER); + output.addAll(menuList); + + return String.join(System.lineSeparator(), output); + } + + public static Runnable find(String input) { + return Arrays.stream(StationManagementMenu.values()) + .filter(menu -> Objects.equals(menu.order, input)) + .findAny() + .orElseThrow(() -> new InvalidFunctionException()) + .function; + } + +} diff --git a/src/main/java/subway/domain/station/StationName.java b/src/main/java/subway/domain/station/StationName.java index 2da45537d..ff016af9f 100644 --- a/src/main/java/subway/domain/station/StationName.java +++ b/src/main/java/subway/domain/station/StationName.java @@ -1,5 +1,6 @@ package subway.domain.station; +import subway.exception.SubwayApplicationException; import subway.exception.station.StationNameFormatException; import subway.exception.station.StationNameLengthException; @@ -12,7 +13,12 @@ public class StationName { private String name; private StationName(String name) { - validateName(name); + try { + validateName(name); + } catch (StationNameFormatException | StationNameLengthException e) { + throw new SubwayApplicationException(e); + } + this.name = name; } diff --git a/src/main/java/subway/view/output/StationManagementView.java b/src/main/java/subway/view/output/StationManagementView.java new file mode 100644 index 000000000..20bb7ef5b --- /dev/null +++ b/src/main/java/subway/view/output/StationManagementView.java @@ -0,0 +1,42 @@ +package subway.view.output; + +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.view.util.Formatter; + +import java.util.List; + +public class StationManagementView extends ScreenView { + private static final String HEADER = "## 역 목록"; + private static final String FUNCTION = "역"; + private static final String REGISTER_FINISH_MESSAGE = Formatter.Info("지하철 역이 등록되었습니다."); + private static final String DELETE_FINISH_MESSAGE = Formatter.Info("지하철 역이 삭제되었습니다."); + + public static void printDeleteMessage() { + System.out.println(deleteFunction(FUNCTION)); + } + + public static void printRegisterMessage() { + System.out.println(registerFunction(FUNCTION)); + } + + public static void printRegisterFinishMessage() { + System.out.println(REGISTER_FINISH_MESSAGE); + } + + public static void printDeleteFinishMessage() { + System.out.println(DELETE_FINISH_MESSAGE); + } + + public static void printStationList(List list) { + System.out.println(HEADER); + + list.stream() + .map(Station::getName) + .map(StationName::toString) + .map(Formatter::Info) + .forEach(System.out::println); + + System.out.println(); + } +} diff --git a/src/main/java/subway/view/utils/Formatter.java b/src/main/java/subway/view/util/Formatter.java similarity index 66% rename from src/main/java/subway/view/utils/Formatter.java rename to src/main/java/subway/view/util/Formatter.java index 5855c332c..5645a7300 100644 --- a/src/main/java/subway/view/utils/Formatter.java +++ b/src/main/java/subway/view/util/Formatter.java @@ -1,8 +1,8 @@ -package subway.view.utils; +package subway.view.util; public class Formatter { private static final String INFO_PREFIX = "[INFO]"; - private static final String ERROR_PREFIX = "[ERROR]"; + private static final String ERROR_PREFIX = "\n[ERROR]"; private static final String DELIMINATOR = " "; public static String Info(String message) { @@ -10,6 +10,6 @@ public static String Info(String message) { } public static String Error(String message) { - return String.join(DELIMINATOR, ERROR_PREFIX, message); + return String.join(DELIMINATOR, ERROR_PREFIX, message+"\n"); } } From 2684301e664bfe9356e000f332358cc3545e2ca2 Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 22:33:48 +0900 Subject: [PATCH 23/26] =?UTF-8?q?feat(subway):=20=EA=B5=AC=EA=B0=84=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=EB=B0=8F=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +- .../section/SectionManagementController.java | 88 +++++++++++++++++++ .../section/SectionManagementMenu.java | 56 ++++++++++++ ...Service.java => SectionDeleteService.java} | 4 +- .../java/subway/view/output/ScreenView.java | 5 ++ .../view/output/SectionManagementView.java | 46 ++++++++++ 6 files changed, 199 insertions(+), 4 deletions(-) create mode 100644 src/main/java/subway/controller/section/SectionManagementController.java create mode 100644 src/main/java/subway/controller/section/SectionManagementMenu.java rename src/main/java/subway/service/{LineDeleteStationService.java => SectionDeleteService.java} (91%) create mode 100644 src/main/java/subway/view/output/SectionManagementView.java diff --git a/docs/README.md b/docs/README.md index ae1b90963..d5f9bbbb4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -167,7 +167,7 @@ - 예외: 존재하지 않는 기능인 경우 - `[ERROR] 선택할 수 없는 기능입니다.` 출력 -- [ ] 구간 관리 화면을 출력한다 +- [x] 구간 관리 화면을 출력한다 - 구현: 역 관리 화면은 다음과 같이 출력 한다 ``` ## 구간 관리 화면 @@ -177,7 +177,7 @@ ``` - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. -- [ ] 노선 관리 화면 입력을 받는다. +- [x] 노선 관리 화면 입력을 받는다. - 구현: 사용자로 부터 기능을 선택 받는다. - 구현: 올바른 입력인 경우 아래와 같이 수행한다 diff --git a/src/main/java/subway/controller/section/SectionManagementController.java b/src/main/java/subway/controller/section/SectionManagementController.java new file mode 100644 index 000000000..2883ac907 --- /dev/null +++ b/src/main/java/subway/controller/section/SectionManagementController.java @@ -0,0 +1,88 @@ +package subway.controller.section; + +import subway.domain.line.LineName; +import subway.domain.station.StationName; +import subway.exception.InvalidFunctionException; +import subway.exception.SubwayApplicationException; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.service.SectionDeleteService; +import subway.service.SectionRegisterService; +import subway.service.StationGenerateService; +import subway.service.StationRegisterService; +import subway.view.inputView.InputView; +import subway.view.output.MainMenuView; +import subway.view.output.OutputView; +import subway.view.output.SectionManagementView; +import subway.view.output.StationManagementView; + +public class SectionManagementController implements Runnable { + + private StationRepository stationRepository; + private LineRepository lineRepository; + + public SectionManagementController(StationRepository stationRepository, LineRepository lineRepository) { + this.stationRepository = stationRepository; + this.lineRepository = lineRepository; + } + + @Override + public void run() { + try { + MainMenuView.printMenu(SectionManagementMenu.toMenuString()); + Runnable function = selectFunction(); + if (function == null) { + return; + } + function.run(); + } catch (SubwayApplicationException e) { + OutputView.print(e.getMessage()); + run(); + } + + } + + private Runnable selectFunction() { + MainMenuView.chooseFunction(); + String input = InputView.scan(); + + Runnable function; + try { + function = SectionManagementMenu.find(input); + } catch (InvalidFunctionException e) { + OutputView.print(e.getMessage()); + return selectFunction(); + } + + return function; + } + + public void registerSection() { + SectionManagementView.printLineInputMessage(); + String line = InputView.scan(); + + SectionManagementView.printStationNameInputMessage(); + String station = InputView.scan(); + + SectionManagementView.printPositionInputMessage(); + String position = InputView.scan(); + + new SectionRegisterService(stationRepository, lineRepository).add(line, station, position); + + SectionManagementView.printRegisterFinishMessage(); + } + + public void deleteSection() { + SectionManagementView.printDeleteLineInputMessage(); + String line = InputView.scan(); + LineName lineName = LineName.of(line); + + SectionManagementView.printDeleteStationInputMessage(); + String station = InputView.scan(); + StationName stationName = StationName.of(station); + + new SectionDeleteService(lineRepository).delete(lineName, stationName); + + SectionManagementView.printDeleteFinishMessage(); + } +} diff --git a/src/main/java/subway/controller/section/SectionManagementMenu.java b/src/main/java/subway/controller/section/SectionManagementMenu.java new file mode 100644 index 000000000..a5f7d5a12 --- /dev/null +++ b/src/main/java/subway/controller/section/SectionManagementMenu.java @@ -0,0 +1,56 @@ +package subway.controller.section; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import subway.controller.ControllerContainer; +import subway.exception.InvalidFunctionException; + +public enum SectionManagementMenu { + + LINE_REGISTER("1", "구간 등록", () -> { + ControllerContainer.getSectionManagementController().registerSection(); + }), + LINE_DELETE("2", "구간 삭제", () -> { + ControllerContainer.getSectionManagementController().deleteSection(); + }), + BACK("B", "돌아가기", null), + ; + + private static final String HEADER = "\n## 구간 관리 화면"; + private final static String DELIMITER = ". "; + + String order; + String menuName; + Runnable function; + + SectionManagementMenu(String order, String menuName, Runnable function) { + this.order = order; + this.menuName = menuName; + this.function = function; + } + + public static String toMenuString() { + List menuList = Arrays.stream(SectionManagementMenu.values()) + .map(menu -> String.join(DELIMITER, String.valueOf(menu.order), menu.menuName)) + .collect(Collectors.toList()); + + List output = new ArrayList<>(); + output.add(HEADER); + output.addAll(menuList); + + return String.join(System.lineSeparator(), output); + } + + public static Runnable find(String input) { + return Arrays.stream(SectionManagementMenu.values()) + .filter(menu -> Objects.equals(menu.order, input)) + .findAny() + .orElseThrow(() -> new InvalidFunctionException()) + .function; + } + +} diff --git a/src/main/java/subway/service/LineDeleteStationService.java b/src/main/java/subway/service/SectionDeleteService.java similarity index 91% rename from src/main/java/subway/service/LineDeleteStationService.java rename to src/main/java/subway/service/SectionDeleteService.java index 8631c6113..68780c214 100644 --- a/src/main/java/subway/service/LineDeleteStationService.java +++ b/src/main/java/subway/service/SectionDeleteService.java @@ -9,10 +9,10 @@ import subway.exception.station.StationNotFoundException; import subway.repository.line.LineRepository; -public class LineDeleteStationService { +public class SectionDeleteService { private final LineRepository lineRepository; - public LineDeleteStationService(LineRepository lineRepository) { + public SectionDeleteService(LineRepository lineRepository) { this.lineRepository = lineRepository; } diff --git a/src/main/java/subway/view/output/ScreenView.java b/src/main/java/subway/view/output/ScreenView.java index d507f94ba..864e7b1ff 100644 --- a/src/main/java/subway/view/output/ScreenView.java +++ b/src/main/java/subway/view/output/ScreenView.java @@ -4,6 +4,7 @@ public class ScreenView { private static final String CHOOSE_FUNCTION = "## 원하는 기능을 선택하세요"; private static final String REGISTER_FUNCTION = "## 등록할 %s %s 이름을 입력하세요"; + private static final String REGISTER_FUNCTION_SINGLE = "## 등록할 %s 이름을 입력하세요"; private static final String DELETE_FUNCTION = "## 삭제할 %s을 입력하세요"; public static void chooseFunction() { @@ -14,6 +15,10 @@ protected static String registerFunction(String function, String name) { return String.format(REGISTER_FUNCTION, function, name); } + protected static String registerFunction(String function) { + return String.format(REGISTER_FUNCTION, function); + } + protected static String deleteFunction(String function) { return String.format(DELETE_FUNCTION, function); } diff --git a/src/main/java/subway/view/output/SectionManagementView.java b/src/main/java/subway/view/output/SectionManagementView.java new file mode 100644 index 000000000..72ea6a9a2 --- /dev/null +++ b/src/main/java/subway/view/output/SectionManagementView.java @@ -0,0 +1,46 @@ +package subway.view.output; + +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.view.util.Formatter; + +import java.util.List; + +public class SectionManagementView extends ScreenView { + private static final String LINE_INPUT_MESSAGE = "## 노선을 입력하세요."; + private static final String STATION_NAME_INPUT_MESSAGE = "## 역이름을 입력하세요."; + private static final String POSITION_INPUT_MESSAGE = "## 순서를 입력하세요."; + private static final String DELETE_LINE_INPUT_MESSAGE = "## 삭제할 구간의 노선을 입력하세요."; + private static final String DELETE_STATION_INPUT_MESSAGE = "## 삭제할 구간의 역을 입력하세요."; + + private static final String REGISTER_FINISH_MESSAGE = Formatter.Info("구간이 등록되었습니다."); + private static final String DELETE_FINISH_MESSAGE = Formatter.Info("구간이 삭제되었습니다."); + + public static void printStationNameInputMessage() { + System.out.println(STATION_NAME_INPUT_MESSAGE); + } + + public static void printPositionInputMessage() { + System.out.println(POSITION_INPUT_MESSAGE); + } + + public static void printLineInputMessage() { + System.out.println(LINE_INPUT_MESSAGE); + } + + public static void printRegisterFinishMessage() { + System.out.println(REGISTER_FINISH_MESSAGE); + } + + public static void printDeleteFinishMessage() { + System.out.println(DELETE_FINISH_MESSAGE); + } + + public static void printDeleteLineInputMessage() { + System.out.println(DELETE_LINE_INPUT_MESSAGE); + } + + public static void printDeleteStationInputMessage() { + System.out.println(DELETE_STATION_INPUT_MESSAGE); + } +} From eb1a68c7d3247dcee84fff5b2b4d40ece898cbdb Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 22:35:06 +0900 Subject: [PATCH 24/26] =?UTF-8?q?feat(subway):=20=EB=85=B8=EC=84=A0=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=EB=B0=8F=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 +- .../controller/ControllerContainer.java | 42 +++++++ .../line/LineManagementController.java | 110 ++++++++++++++++++ .../controller/line/LineManagementMenu.java | 59 ++++++++++ .../java/subway/domain/line/LineName.java | 8 +- ...rvice.java => SectionRegisterService.java} | 6 +- .../view/output/LineManagementView.java | 68 +++++++++++ 7 files changed, 293 insertions(+), 8 deletions(-) create mode 100644 src/main/java/subway/controller/ControllerContainer.java create mode 100644 src/main/java/subway/controller/line/LineManagementController.java create mode 100644 src/main/java/subway/controller/line/LineManagementMenu.java rename src/main/java/subway/service/{StationAddToLineService.java => SectionRegisterService.java} (93%) create mode 100644 src/main/java/subway/view/output/LineManagementView.java diff --git a/docs/README.md b/docs/README.md index d5f9bbbb4..fe51f8fe7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -83,9 +83,9 @@ - "원하는 기능을 선택하세요." 재 출력 및 재 입력 - 공통사항 - - [ ] 입력시 에러가 발생한 경우, 기능 선택이 잘못된 경우를 제외하고는 자신의 상위 화면으로 이동한다. - - [ ] 기능 선택이 잘못된 경우는 기능 선택 메세지를 다시 출력하고 입력받는다. - - [ ] 기능수행 완료 후 메인 화면으로 돌아온다 + - [x] 입력시 에러가 발생한 경우, 기능 선택이 잘못된 경우를 제외하고는 자신의 상위 화면으로 이동한다. + - [x] 기능 선택이 잘못된 경우는 기능 선택 메세지를 다시 출력하고 입력받는다. + - [x] 기능수행 완료 후 메인 화면으로 돌아온다 - [x] 역 관리 화면을 출력한다. - 구현: 역 관리 화면은 다음과 같이 출력 한다 @@ -135,7 +135,7 @@ ``` - 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다. -- [ ] 노선 관리 화면 입력을 받는다. +- [x] 노선 관리 화면 입력을 받는다. - 구현: 사용자로 부터 기능을 선택 받는다. - 구현: 올바른 입력인 경우 아래와 같이 수행한다 diff --git a/src/main/java/subway/controller/ControllerContainer.java b/src/main/java/subway/controller/ControllerContainer.java new file mode 100644 index 000000000..0621adc7e --- /dev/null +++ b/src/main/java/subway/controller/ControllerContainer.java @@ -0,0 +1,42 @@ +package subway.controller; + +import subway.controller.line.LineManagementController; +import subway.controller.main.MainMenuController; +import subway.controller.section.SectionManagementController; +import subway.controller.station.StationManagementController; +import subway.repository.line.LineRepository; +import subway.repository.line.LineRepositoryImpl; +import subway.repository.station.StationRepository; +import subway.repository.station.StationRepositoryImpl; + +public class ControllerContainer { + + private static LineRepository lineRepository = new LineRepositoryImpl(); + private static StationRepository stationRegisterService = new StationRepositoryImpl(); + + private static MainMenuController mainMenuController = + new MainMenuController(stationRegisterService, lineRepository); + private static LineManagementController lineManagementController = + new LineManagementController(stationRegisterService, lineRepository); + private static StationManagementController stationManagementController = + new StationManagementController(stationRegisterService, lineRepository); + private static SectionManagementController sectionManagementController = + new SectionManagementController(stationRegisterService, lineRepository); + + public static MainMenuController getMainMenuController() { + return mainMenuController; + } + + public static LineManagementController getLineManagementController() { + return lineManagementController; + } + + public static StationManagementController getStationManagementController() { + return stationManagementController; + } + + public static SectionManagementController getSectionManagementController() { + return sectionManagementController; + } + +} diff --git a/src/main/java/subway/controller/line/LineManagementController.java b/src/main/java/subway/controller/line/LineManagementController.java new file mode 100644 index 000000000..a70333114 --- /dev/null +++ b/src/main/java/subway/controller/line/LineManagementController.java @@ -0,0 +1,110 @@ +package subway.controller.line; + +import subway.domain.line.Line; +import subway.domain.line.LineName; +import subway.domain.station.Station; +import subway.domain.station.StationName; +import subway.exception.InvalidFunctionException; +import subway.exception.SubwayApplicationException; +import subway.exception.line.LineNameFormatException; +import subway.exception.line.LineNameLengthException; +import subway.exception.line.LineNotFoundException; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.service.LineDeleteService; +import subway.service.LineGenerateService; +import subway.service.LineListService; +import subway.service.LineRegisterService; +import subway.view.inputView.InputView; +import subway.view.output.LineManagementView; +import subway.view.output.MainMenuView; +import subway.view.output.OutputView; + +import java.util.List; + +public class LineManagementController implements Runnable { + + private StationRepository stationRepository; + private LineRepository lineRepository; + + public LineManagementController(StationRepository stationRepository, LineRepository lineRepository) { + this.stationRepository = stationRepository; + this.lineRepository = lineRepository; + } + + @Override + public void run() { + try { + MainMenuView.printMenu(LineManagementMenu.toMenuString()); + Runnable function = selectFunction(); + if (function == null) { + return; + } + function.run(); + } catch (SubwayApplicationException e) { + run(); + } + } + + private Runnable selectFunction() { + LineManagementView.chooseFunction(); + String input = InputView.scan(); + + Runnable function; + try { + function = LineManagementMenu.find(input); + } catch (InvalidFunctionException e) { + OutputView.print(e.getMessage()); + return selectFunction(); + } + + return function; + } + + public void registerLine() { + Line line = generateLine(); + new LineRegisterService(lineRepository).register(line); + } + + private Line generateLine() { + LineManagementView.printRegisterMessage(); + String name = InputView.scan(); + + Station upline = getUpLineStation(); + Station downLine = getDownLineStation(); + + return new LineGenerateService(stationRepository).generate(name, upline, downLine); + } + + private Station getUpLineStation() { + LineManagementView.printUpLineNameInputMessage(); + + String upLineName = InputView.scan(); + StationName upLineStationName = StationName.of(upLineName); + + return Station.of(upLineStationName); + } + + private Station getDownLineStation() { + LineManagementView.printDownLineNameInputMessage(); + + String downLineName = InputView.scan(); + StationName downLineStationName = StationName.of(downLineName); + + return Station.of(downLineStationName); + } + + public void deleteLine() { + LineManagementView.printDeleteMessage(); + + String name = InputView.scan(); + LineName lineName = LineName.of(name); + + new LineDeleteService(lineRepository).delete(lineName); + } + + public void viewLine() { + List lines = new LineListService(lineRepository).get(); + LineManagementView.printLineList(lines); + } +} diff --git a/src/main/java/subway/controller/line/LineManagementMenu.java b/src/main/java/subway/controller/line/LineManagementMenu.java new file mode 100644 index 000000000..f793a4ee3 --- /dev/null +++ b/src/main/java/subway/controller/line/LineManagementMenu.java @@ -0,0 +1,59 @@ +package subway.controller.line; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import subway.controller.ControllerContainer; +import subway.exception.InvalidFunctionException; + +public enum LineManagementMenu { + + LINE_REGISTER("1", "노선 등록", () -> { + ControllerContainer.getLineManagementController().registerLine(); + }), + LINE_DELETE("2", "노선 삭제", () -> { + ControllerContainer.getLineManagementController().deleteLine(); + }), + LINE_SCAN("3", "노선 조회", () -> { + ControllerContainer.getLineManagementController().viewLine(); + }), + BACK("B", "돌아가기", null), + ; + + private static final String HEADER = "\n## 노선 관리 화면"; + private final static String DELIMITER = ". "; + + String order; + String menuName; + Runnable function; + + LineManagementMenu(String order, String menuName, Runnable function) { + this.order = order; + this.menuName = menuName; + this.function = function; + } + + public static String toMenuString() { + List menuList = Arrays.stream(LineManagementMenu.values()) + .map(menu -> String.join(DELIMITER, String.valueOf(menu.order), menu.menuName)) + .collect(Collectors.toList()); + + List output = new ArrayList<>(); + output.add(HEADER); + output.addAll(menuList); + + return String.join(System.lineSeparator(), output); + } + + public static Runnable find(String input) { + return Arrays.stream(LineManagementMenu.values()) + .filter(menu -> Objects.equals(menu.order, input)) + .findAny() + .orElseThrow(() -> new InvalidFunctionException()) + .function; + } + +} diff --git a/src/main/java/subway/domain/line/LineName.java b/src/main/java/subway/domain/line/LineName.java index 1a701d187..f4ee3c9a9 100644 --- a/src/main/java/subway/domain/line/LineName.java +++ b/src/main/java/subway/domain/line/LineName.java @@ -1,6 +1,7 @@ package subway.domain.line; import subway.domain.station.StationName; +import subway.exception.SubwayApplicationException; import subway.exception.line.LineNameFormatException; import subway.exception.line.LineNameLengthException; @@ -13,7 +14,12 @@ public class LineName { private String name; private LineName(String name) { - validateName(name); + try { + validateName(name); + } catch (LineNameFormatException | LineNameLengthException e) { + throw new SubwayApplicationException(e); + } + this.name = name; } diff --git a/src/main/java/subway/service/StationAddToLineService.java b/src/main/java/subway/service/SectionRegisterService.java similarity index 93% rename from src/main/java/subway/service/StationAddToLineService.java rename to src/main/java/subway/service/SectionRegisterService.java index 1bdbcb401..e746ce647 100644 --- a/src/main/java/subway/service/StationAddToLineService.java +++ b/src/main/java/subway/service/SectionRegisterService.java @@ -11,12 +11,12 @@ import subway.repository.station.StationRepository; import subway.specification.StationExistOnSpecificLineSpecification; -public class StationAddToLineService { +public class SectionRegisterService { private final StationRepository stationRepository; private final LineRepository lineRepository; - public StationAddToLineService(StationRepository stationRepository, - LineRepository lineRepository) { + public SectionRegisterService(StationRepository stationRepository, + LineRepository lineRepository) { this.stationRepository = stationRepository; this.lineRepository = lineRepository; } diff --git a/src/main/java/subway/view/output/LineManagementView.java b/src/main/java/subway/view/output/LineManagementView.java new file mode 100644 index 000000000..8868f0ff6 --- /dev/null +++ b/src/main/java/subway/view/output/LineManagementView.java @@ -0,0 +1,68 @@ +package subway.view.output; + +import subway.domain.line.Line; +import subway.domain.line.LineName; +import subway.view.util.Formatter; + +import java.util.List; + +public class LineManagementView extends ScreenView { + private static final String LINE = "노선"; + private static final String NAME = "이름"; + private static final String UPLINE_TERMINAL = "상행 종점역"; + private static final String DOWNLINE_TERMINAL = "상행 종점역"; + private static final String LINE_HEADER = "## 노선 목록"; + private static final String LINE_REGISTER_START_MESSAGE = "## 등록할 노선 이름을 입력하세요."; + private static final String LINE_REGISTER_FINISH_MESSAGE = "지하철 노선이 등록되었습니다."; + private static final String LINE_DELETE_MESSAGE = "## 삭제할 노선 이름을 입력하세요.."; + private static final String LINE_DELETE_FINISH_MESSAGE = "지하철 노선이 삭제되었습니다."; + private static final String LINE_MANAGEMENT_MENU = "## 노선 관리 화면\n1. 노선 등록\n2. 노선 삭제\n" + + "3. 노선 조회\nB. 돌아가기\n"; + + + public static void printMenu() { + System.out.println(LINE_MANAGEMENT_MENU); + System.out.println(); + } + + public static void printRegisterMessage() { + System.out.println(LINE_REGISTER_START_MESSAGE); + } + + public static void printLineNameInputMessage() { + System.out.println(registerFunction(LINE, NAME)); + } + + public static void printDeleteMessage() { + System.out.println(LINE_DELETE_MESSAGE); + + } + + public static void printDeleteFinishMessage() { + System.out.println(LINE_DELETE_FINISH_MESSAGE); + } + + public static void printUpLineNameInputMessage() { + System.out.println(registerFunction(LINE, UPLINE_TERMINAL)); + } + + public static void printDownLineNameInputMessage() { + System.out.println(registerFunction(LINE, DOWNLINE_TERMINAL)); + } + + public static void printLineRegisteredFinishMessage() { + System.out.println(Formatter.Info(LINE_REGISTER_FINISH_MESSAGE)); + } + + public static void printLineList(List list) { + System.out.println(LINE_HEADER); + + list.stream() + .map(Line::getName) + .map(LineName::toString) + .map(Formatter::Info) + .forEach(System.out::println); + + System.out.println(); + } +} From 2ff344952770756fab486a7f6be1a01e8231dcbc Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 23:27:58 +0900 Subject: [PATCH 25/26] =?UTF-8?q?fix(subway):=20=EC=9E=90=EC=9E=98?= =?UTF-8?q?=ED=95=9C=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EB=8D=94=EB=AF=B8=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/subway/Application.java | 24 ++++----- src/main/java/subway/DummyData.java | 51 +++++++++++++++++++ .../controller/ControllerContainer.java | 18 +++++-- .../java/subway/controller/main/MainMenu.java | 2 +- .../java/subway/service/RouteMapService.java | 2 +- .../view/output/LineManagementView.java | 17 +++---- .../java/subway/view/output/MainMenuView.java | 1 - .../java/subway/view/output/ScreenView.java | 10 ++-- .../view/output/SectionManagementView.java | 14 ++--- .../view/output/StationManagementView.java | 8 ++- 11 files changed, 100 insertions(+), 49 deletions(-) create mode 100644 src/main/java/subway/DummyData.java diff --git a/docs/README.md b/docs/README.md index fe51f8fe7..b3729d76e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ ## 구현 기능 목록 -- [ ] 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅한다. +- [x] 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅한다. ``` 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 507b6eacb..cc47ead98 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,30 +1,26 @@ package subway; +import subway.controller.ControllerContainer; +import subway.controller.main.MainMenuController; import subway.domain.line.Line; import subway.domain.station.Station; +import subway.domain.station.StationName; import subway.repository.line.LineRepository; import subway.repository.line.LineRepositoryImpl; import subway.repository.station.StationRepository; import subway.repository.station.StationRepositoryImpl; import subway.service.*; -public class Application { - public static void main(String[] args) { - LineRepository lineRepository = new LineRepositoryImpl(); - StationRepository stationRepository = new StationRepositoryImpl(); +import java.util.Arrays; - Station station1 = new StationGenerateService().generate("테스트역"); - Station station2 = new StationGenerateService().generate("테스트2역"); - Station station3 = new StationGenerateService().generate("테스역"); +public class Application { - new StationRegisterService(stationRepository).register(station1); - new StationRegisterService(stationRepository).register(station2); - new StationRegisterService(stationRepository).register(station3); + public static void main(String[] args) { + LineRepository lineRepository = ControllerContainer.getLineRepository(); + StationRepository stationRepository = ControllerContainer.getStationRepository(); - Line line = new LineGenerateService(stationRepository).generate("테스트선", station1, station2); - new LineRegisterService(lineRepository).register(line); + DummyData.init(); - new StationAddToLineService(stationRepository, lineRepository).add("테스트선", "테스역", "3"); - new LineListService(lineRepository).get(); + new MainMenuController(stationRepository, lineRepository).run(); } } diff --git a/src/main/java/subway/DummyData.java b/src/main/java/subway/DummyData.java new file mode 100644 index 000000000..7f3ce3f65 --- /dev/null +++ b/src/main/java/subway/DummyData.java @@ -0,0 +1,51 @@ +package subway; + +import subway.controller.ControllerContainer; +import subway.domain.line.Line; +import subway.domain.station.Station; +import subway.repository.line.LineRepository; +import subway.repository.station.StationRepository; +import subway.service.*; + +import java.util.Arrays; +import java.util.Objects; + +public class DummyData { + + private static StationRepository stationRepository = ControllerContainer.getStationRepository(); + private static LineRepository lineRepository = ControllerContainer.getLineRepository(); + + private static String[] stationNames = { + "교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역" + }; + + private static Station[] stations; + + private static Station from(String name) { + return Arrays.stream(stations) + .filter(station -> Objects.equals(station.getName().toString(), name)) + .findAny() + .orElse(null); + } + + public static void init() { + stations = Arrays.stream(stationNames) + .map(station -> new StationGenerateService().generate(station)) + .toArray(Station[]::new); + + Arrays.stream(stations).forEach(station -> new StationRegisterService(stationRepository).register(station)); + + Line line = new LineGenerateService(stationRepository).generate("2호선", from("교대역"), from("역삼역")); + new LineRegisterService(lineRepository).register(line); + new SectionRegisterService(stationRepository, lineRepository).add("2호선", "강남역", "1"); + + Line line3 = new LineGenerateService(stationRepository).generate("3호선", from("교대역"), from("매봉역")); + new LineRegisterService(lineRepository).register(line3); + new SectionRegisterService(stationRepository, lineRepository).add("3호선", "양재역", "1"); + new SectionRegisterService(stationRepository, lineRepository).add("3호선", "남부터미널역", "1"); + + Line shin = new LineGenerateService(stationRepository).generate("신분당선", from("강남역"), from("양재시민의숲역")); + new LineRegisterService(lineRepository).register(shin); + new SectionRegisterService(stationRepository, lineRepository).add("신분당선", "양재역", "1"); + } +} diff --git a/src/main/java/subway/controller/ControllerContainer.java b/src/main/java/subway/controller/ControllerContainer.java index 0621adc7e..b83ec142d 100644 --- a/src/main/java/subway/controller/ControllerContainer.java +++ b/src/main/java/subway/controller/ControllerContainer.java @@ -4,6 +4,7 @@ import subway.controller.main.MainMenuController; import subway.controller.section.SectionManagementController; import subway.controller.station.StationManagementController; +import subway.domain.station.Station; import subway.repository.line.LineRepository; import subway.repository.line.LineRepositoryImpl; import subway.repository.station.StationRepository; @@ -12,16 +13,16 @@ public class ControllerContainer { private static LineRepository lineRepository = new LineRepositoryImpl(); - private static StationRepository stationRegisterService = new StationRepositoryImpl(); + private static StationRepository stationRepository = new StationRepositoryImpl(); private static MainMenuController mainMenuController = - new MainMenuController(stationRegisterService, lineRepository); + new MainMenuController(stationRepository, lineRepository); private static LineManagementController lineManagementController = - new LineManagementController(stationRegisterService, lineRepository); + new LineManagementController(stationRepository, lineRepository); private static StationManagementController stationManagementController = - new StationManagementController(stationRegisterService, lineRepository); + new StationManagementController(stationRepository, lineRepository); private static SectionManagementController sectionManagementController = - new SectionManagementController(stationRegisterService, lineRepository); + new SectionManagementController(stationRepository, lineRepository); public static MainMenuController getMainMenuController() { return mainMenuController; @@ -39,4 +40,11 @@ public static SectionManagementController getSectionManagementController() { return sectionManagementController; } + public static LineRepository getLineRepository() { + return lineRepository; + } + + public static StationRepository getStationRepository() { + return stationRepository; + } } diff --git a/src/main/java/subway/controller/main/MainMenu.java b/src/main/java/subway/controller/main/MainMenu.java index f84910305..52cf84c48 100644 --- a/src/main/java/subway/controller/main/MainMenu.java +++ b/src/main/java/subway/controller/main/MainMenu.java @@ -27,7 +27,7 @@ enum MainMenu { }), EXIT("Q", "종료", null); - private final static String HEADER = "## 메인 화면"; + private final static String HEADER = "\n## 메인 화면"; private final static String DELIMITER = ". "; String order; diff --git a/src/main/java/subway/service/RouteMapService.java b/src/main/java/subway/service/RouteMapService.java index 6ddb3ecc9..756d69ace 100644 --- a/src/main/java/subway/service/RouteMapService.java +++ b/src/main/java/subway/service/RouteMapService.java @@ -34,6 +34,6 @@ private String toRouteMap() { return String.join(System.lineSeparator(), lineMap); }).collect(Collectors.toList()); - return String.join(System.lineSeparator(), routeMap); + return String.join(System.lineSeparator()+System.lineSeparator(), routeMap); } } diff --git a/src/main/java/subway/view/output/LineManagementView.java b/src/main/java/subway/view/output/LineManagementView.java index 8868f0ff6..d6842ecee 100644 --- a/src/main/java/subway/view/output/LineManagementView.java +++ b/src/main/java/subway/view/output/LineManagementView.java @@ -11,18 +11,17 @@ public class LineManagementView extends ScreenView { private static final String NAME = "이름"; private static final String UPLINE_TERMINAL = "상행 종점역"; private static final String DOWNLINE_TERMINAL = "상행 종점역"; - private static final String LINE_HEADER = "## 노선 목록"; - private static final String LINE_REGISTER_START_MESSAGE = "## 등록할 노선 이름을 입력하세요."; - private static final String LINE_REGISTER_FINISH_MESSAGE = "지하철 노선이 등록되었습니다."; - private static final String LINE_DELETE_MESSAGE = "## 삭제할 노선 이름을 입력하세요.."; - private static final String LINE_DELETE_FINISH_MESSAGE = "지하철 노선이 삭제되었습니다."; - private static final String LINE_MANAGEMENT_MENU = "## 노선 관리 화면\n1. 노선 등록\n2. 노선 삭제\n" + + private static final String LINE_HEADER = "\n## 노선 목록"; + private static final String LINE_REGISTER_START_MESSAGE = "\n## 등록할 노선 이름을 입력하세요."; + private static final String LINE_REGISTER_FINISH_MESSAGE = "\n지하철 노선이 등록되었습니다."; + private static final String LINE_DELETE_MESSAGE = "\n## 삭제할 노선 이름을 입력하세요.."; + private static final String LINE_DELETE_FINISH_MESSAGE = "\n지하철 노선이 삭제되었습니다."; + private static final String LINE_MANAGEMENT_MENU = "\n## 노선 관리 화면\n1. 노선 등록\n2. 노선 삭제\n" + "3. 노선 조회\nB. 돌아가기\n"; public static void printMenu() { - System.out.println(LINE_MANAGEMENT_MENU); - System.out.println(); + System.out.println(LINE_MANAGEMENT_MENU);; } public static void printRegisterMessage() { @@ -51,7 +50,7 @@ public static void printDownLineNameInputMessage() { } public static void printLineRegisteredFinishMessage() { - System.out.println(Formatter.Info(LINE_REGISTER_FINISH_MESSAGE)); + System.out.println("\n" + Formatter.Info(LINE_REGISTER_FINISH_MESSAGE)); } public static void printLineList(List list) { diff --git a/src/main/java/subway/view/output/MainMenuView.java b/src/main/java/subway/view/output/MainMenuView.java index 70557baba..74e8e139e 100644 --- a/src/main/java/subway/view/output/MainMenuView.java +++ b/src/main/java/subway/view/output/MainMenuView.java @@ -3,6 +3,5 @@ public class MainMenuView extends ScreenView { public static void printMenu(final String menu) { System.out.println(menu); - System.out.println(); } } diff --git a/src/main/java/subway/view/output/ScreenView.java b/src/main/java/subway/view/output/ScreenView.java index 864e7b1ff..9d54fa9e9 100644 --- a/src/main/java/subway/view/output/ScreenView.java +++ b/src/main/java/subway/view/output/ScreenView.java @@ -2,10 +2,10 @@ public class ScreenView { - private static final String CHOOSE_FUNCTION = "## 원하는 기능을 선택하세요"; - private static final String REGISTER_FUNCTION = "## 등록할 %s %s 이름을 입력하세요"; - private static final String REGISTER_FUNCTION_SINGLE = "## 등록할 %s 이름을 입력하세요"; - private static final String DELETE_FUNCTION = "## 삭제할 %s을 입력하세요"; + private static final String CHOOSE_FUNCTION = "\n## 원하는 기능을 선택하세요"; + private static final String REGISTER_FUNCTION = "\n## 등록할 %s %s 이름을 입력하세요"; + private static final String REGISTER_FUNCTION_SINGLE = "\n## 등록할 %s 이름을 입력하세요"; + private static final String DELETE_FUNCTION = "\n## 삭제할 %s을 입력하세요"; public static void chooseFunction() { System.out.println(CHOOSE_FUNCTION); @@ -16,7 +16,7 @@ protected static String registerFunction(String function, String name) { } protected static String registerFunction(String function) { - return String.format(REGISTER_FUNCTION, function); + return String.format(REGISTER_FUNCTION_SINGLE, function); } protected static String deleteFunction(String function) { diff --git a/src/main/java/subway/view/output/SectionManagementView.java b/src/main/java/subway/view/output/SectionManagementView.java index 72ea6a9a2..f46a776e1 100644 --- a/src/main/java/subway/view/output/SectionManagementView.java +++ b/src/main/java/subway/view/output/SectionManagementView.java @@ -7,11 +7,11 @@ import java.util.List; public class SectionManagementView extends ScreenView { - private static final String LINE_INPUT_MESSAGE = "## 노선을 입력하세요."; - private static final String STATION_NAME_INPUT_MESSAGE = "## 역이름을 입력하세요."; - private static final String POSITION_INPUT_MESSAGE = "## 순서를 입력하세요."; - private static final String DELETE_LINE_INPUT_MESSAGE = "## 삭제할 구간의 노선을 입력하세요."; - private static final String DELETE_STATION_INPUT_MESSAGE = "## 삭제할 구간의 역을 입력하세요."; + private static final String LINE_INPUT_MESSAGE = "\n## 노선을 입력하세요."; + private static final String STATION_NAME_INPUT_MESSAGE = "\n## 역이름을 입력하세요."; + private static final String POSITION_INPUT_MESSAGE = "\n## 순서를 입력하세요."; + private static final String DELETE_LINE_INPUT_MESSAGE = "\n## 삭제할 구간의 노선을 입력하세요."; + private static final String DELETE_STATION_INPUT_MESSAGE = "\n## 삭제할 구간의 역을 입력하세요."; private static final String REGISTER_FINISH_MESSAGE = Formatter.Info("구간이 등록되었습니다."); private static final String DELETE_FINISH_MESSAGE = Formatter.Info("구간이 삭제되었습니다."); @@ -29,11 +29,11 @@ public static void printLineInputMessage() { } public static void printRegisterFinishMessage() { - System.out.println(REGISTER_FINISH_MESSAGE); + System.out.println("\n" + REGISTER_FINISH_MESSAGE); } public static void printDeleteFinishMessage() { - System.out.println(DELETE_FINISH_MESSAGE); + System.out.println("\n" + DELETE_FINISH_MESSAGE); } public static void printDeleteLineInputMessage() { diff --git a/src/main/java/subway/view/output/StationManagementView.java b/src/main/java/subway/view/output/StationManagementView.java index 20bb7ef5b..ec916e1bb 100644 --- a/src/main/java/subway/view/output/StationManagementView.java +++ b/src/main/java/subway/view/output/StationManagementView.java @@ -13,7 +13,7 @@ public class StationManagementView extends ScreenView { private static final String DELETE_FINISH_MESSAGE = Formatter.Info("지하철 역이 삭제되었습니다."); public static void printDeleteMessage() { - System.out.println(deleteFunction(FUNCTION)); + System.out.println("\n"+deleteFunction(FUNCTION)); } public static void printRegisterMessage() { @@ -21,11 +21,11 @@ public static void printRegisterMessage() { } public static void printRegisterFinishMessage() { - System.out.println(REGISTER_FINISH_MESSAGE); + System.out.println("\n"+REGISTER_FINISH_MESSAGE); } public static void printDeleteFinishMessage() { - System.out.println(DELETE_FINISH_MESSAGE); + System.out.println("\n"+DELETE_FINISH_MESSAGE); } public static void printStationList(List list) { @@ -36,7 +36,5 @@ public static void printStationList(List list) { .map(StationName::toString) .map(Formatter::Info) .forEach(System.out::println); - - System.out.println(); } } From 7e1ab977f05dac1b1369bc1992be597bfe565817 Mon Sep 17 00:00:00 2001 From: Minsung Date: Tue, 15 Dec 2020 23:35:34 +0900 Subject: [PATCH 26/26] =?UTF-8?q?feat(subway):=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/exception/line/LineAlreadyExistException.java | 7 +++++++ .../subway/exception/line/LineNameFormatException.java | 7 +++++++ .../subway/exception/line/LineNameLengthException.java | 7 +++++++ .../java/subway/exception/line/LineNotFoundException.java | 7 +++++++ .../java/subway/exception/line/PositionRangeException.java | 7 +++++++ .../subway/exception/line/SectionSizeLowException.java | 7 +++++++ .../exception/station/SameUpLineAndDownLineException.java | 7 +++++++ .../exception/station/StationAlreadyExistException.java | 7 +++++++ .../exception/station/StationNameFormatException.java | 7 +++++++ .../exception/station/StationNameLengthException.java | 7 +++++++ .../subway/exception/station/StationNotFoundException.java | 7 +++++++ .../station/StationRegisteredOnLineException.java | 7 +++++++ 12 files changed, 84 insertions(+) diff --git a/src/main/java/subway/exception/line/LineAlreadyExistException.java b/src/main/java/subway/exception/line/LineAlreadyExistException.java index ca2f1ce7e..d52592769 100644 --- a/src/main/java/subway/exception/line/LineAlreadyExistException.java +++ b/src/main/java/subway/exception/line/LineAlreadyExistException.java @@ -1,4 +1,11 @@ package subway.exception.line; +import subway.view.util.Formatter; + public class LineAlreadyExistException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("노선이 이미 존재합니다."); + + public LineAlreadyExistException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/line/LineNameFormatException.java b/src/main/java/subway/exception/line/LineNameFormatException.java index fb9e009ca..963b7ba11 100644 --- a/src/main/java/subway/exception/line/LineNameFormatException.java +++ b/src/main/java/subway/exception/line/LineNameFormatException.java @@ -1,4 +1,11 @@ package subway.exception.line; +import subway.view.util.Formatter; + public class LineNameFormatException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("이름 포멧이 이상합니다."); + + public LineNameFormatException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/line/LineNameLengthException.java b/src/main/java/subway/exception/line/LineNameLengthException.java index 4e73306a4..2ccc00993 100644 --- a/src/main/java/subway/exception/line/LineNameLengthException.java +++ b/src/main/java/subway/exception/line/LineNameLengthException.java @@ -1,4 +1,11 @@ package subway.exception.line; +import subway.view.util.Formatter; + public class LineNameLengthException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("노선이 이름의 길이는 2자 이상입니다."); + + public LineNameLengthException() { + super(MESSAGE); + } } \ No newline at end of file diff --git a/src/main/java/subway/exception/line/LineNotFoundException.java b/src/main/java/subway/exception/line/LineNotFoundException.java index 7ec669aaf..7989d0dee 100644 --- a/src/main/java/subway/exception/line/LineNotFoundException.java +++ b/src/main/java/subway/exception/line/LineNotFoundException.java @@ -1,4 +1,11 @@ package subway.exception.line; +import subway.view.util.Formatter; + public class LineNotFoundException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("노선을 찾을 수 없습니다."); + + public LineNotFoundException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/line/PositionRangeException.java b/src/main/java/subway/exception/line/PositionRangeException.java index 4fc91a7fd..f43579e4b 100644 --- a/src/main/java/subway/exception/line/PositionRangeException.java +++ b/src/main/java/subway/exception/line/PositionRangeException.java @@ -1,4 +1,11 @@ package subway.exception.line; +import subway.view.util.Formatter; + public class PositionRangeException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("위치 입력 범위가 비정상입니다."); + + public PositionRangeException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/line/SectionSizeLowException.java b/src/main/java/subway/exception/line/SectionSizeLowException.java index 3a9f18d3c..8cf9e5c56 100644 --- a/src/main/java/subway/exception/line/SectionSizeLowException.java +++ b/src/main/java/subway/exception/line/SectionSizeLowException.java @@ -1,4 +1,11 @@ package subway.exception.line; +import subway.view.util.Formatter; + public class SectionSizeLowException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("구간의 크기는 2보다 작을 수 없습니다."); + + public SectionSizeLowException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/station/SameUpLineAndDownLineException.java b/src/main/java/subway/exception/station/SameUpLineAndDownLineException.java index e9dd6d16d..d26da5a92 100644 --- a/src/main/java/subway/exception/station/SameUpLineAndDownLineException.java +++ b/src/main/java/subway/exception/station/SameUpLineAndDownLineException.java @@ -1,4 +1,11 @@ package subway.exception.station; +import subway.view.util.Formatter; + public class SameUpLineAndDownLineException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("하행선과 상행선이 동일합니다."); + + public SameUpLineAndDownLineException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/station/StationAlreadyExistException.java b/src/main/java/subway/exception/station/StationAlreadyExistException.java index 1f67907f0..47a1e56e2 100644 --- a/src/main/java/subway/exception/station/StationAlreadyExistException.java +++ b/src/main/java/subway/exception/station/StationAlreadyExistException.java @@ -1,4 +1,11 @@ package subway.exception.station; +import subway.view.util.Formatter; + public class StationAlreadyExistException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("역이 이미 존재합니다."); + + public StationAlreadyExistException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/station/StationNameFormatException.java b/src/main/java/subway/exception/station/StationNameFormatException.java index ea00583bb..ca4623e80 100644 --- a/src/main/java/subway/exception/station/StationNameFormatException.java +++ b/src/main/java/subway/exception/station/StationNameFormatException.java @@ -1,4 +1,11 @@ package subway.exception.station; +import subway.view.util.Formatter; + public class StationNameFormatException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("역 이름 혁식이 맞지 않습니다."); + + public StationNameFormatException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/station/StationNameLengthException.java b/src/main/java/subway/exception/station/StationNameLengthException.java index 51f584e93..9bdc1c63a 100644 --- a/src/main/java/subway/exception/station/StationNameLengthException.java +++ b/src/main/java/subway/exception/station/StationNameLengthException.java @@ -1,4 +1,11 @@ package subway.exception.station; +import subway.view.util.Formatter; + public class StationNameLengthException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("역 이름 길이가 너무 짧습니다."); + + public StationNameLengthException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/station/StationNotFoundException.java b/src/main/java/subway/exception/station/StationNotFoundException.java index 64cb748dc..c9b2c02d7 100644 --- a/src/main/java/subway/exception/station/StationNotFoundException.java +++ b/src/main/java/subway/exception/station/StationNotFoundException.java @@ -1,4 +1,11 @@ package subway.exception.station; +import subway.view.util.Formatter; + public class StationNotFoundException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("역을 찾을 수 없습니다."); + + public StationNotFoundException() { + super(MESSAGE); + } } diff --git a/src/main/java/subway/exception/station/StationRegisteredOnLineException.java b/src/main/java/subway/exception/station/StationRegisteredOnLineException.java index 230b1ea07..595fd5e6a 100644 --- a/src/main/java/subway/exception/station/StationRegisteredOnLineException.java +++ b/src/main/java/subway/exception/station/StationRegisteredOnLineException.java @@ -1,4 +1,11 @@ package subway.exception.station; +import subway.view.util.Formatter; + public class StationRegisteredOnLineException extends RuntimeException { + private static final String MESSAGE = Formatter.Error("역이 노선에 존재합니다."); + + public StationRegisteredOnLineException() { + super(MESSAGE); + } }