From b426627c5496259fc48a22079d54aeff268854fe Mon Sep 17 00:00:00 2001 From: kwongwangjae Date: Sat, 25 May 2024 10:47:47 +0900 Subject: [PATCH] =?UTF-8?q?feat(station)=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EC=97=AD=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 지하철 역 등록 및 삭제 - 노선에 등록된 역은 삭제 불가 - 중복된 지하철 역 이름이 등록 불가 - 지하철 역 이름은 2글자 이상 - 지하철 역의 목록을 조회 가능 Closes #4, #5, #6, #7, #8 --- src/main/java/subway/Application.java | 5 +- .../subway/controller/MainController.java | 58 +++++++++++++++++++ .../subway/controller/StationController.java | 53 +++++++++++++++++ src/main/java/subway/domain/Section.java | 4 ++ .../java/subway/domain/SectionRepository.java | 5 ++ .../java/subway/domain/StationRepository.java | 9 +++ .../java/subway/service/StationService.java | 41 +++++++++++++ src/main/java/subway/view/StationView.java | 47 +++++++++++++++ .../view/error/StationErrorMessage.java | 18 ++++++ 9 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 src/main/java/subway/controller/MainController.java create mode 100644 src/main/java/subway/controller/StationController.java create mode 100644 src/main/java/subway/service/StationService.java create mode 100644 src/main/java/subway/view/StationView.java create mode 100644 src/main/java/subway/view/error/StationErrorMessage.java diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..8b6707fea 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -2,9 +2,12 @@ import java.util.Scanner; +import subway.controller.MainController; + public class Application { public static void main(String[] args) { final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + MainController mainController = new MainController(scanner); + mainController.run(); } } diff --git a/src/main/java/subway/controller/MainController.java b/src/main/java/subway/controller/MainController.java new file mode 100644 index 000000000..49b0d5f4e --- /dev/null +++ b/src/main/java/subway/controller/MainController.java @@ -0,0 +1,58 @@ +package subway.controller; + +import java.util.Scanner; + +import subway.service.SubwayService; +import subway.view.LineView; +import subway.view.MainView; +import subway.view.SectionView; +import subway.view.StationView; + +public class MainController { + private final StationController stationController; + private final LineController lineController; + private final SectionController sectionController; + private final MainView mainView; + private final Scanner scanner; + private final SubwayService subwayService; + + public MainController(Scanner scanner) { + this.scanner = scanner; + this.stationController = new StationController(scanner); + this.lineController = new LineController(scanner); + this.sectionController = new SectionController(scanner); + this.subwayService = new SubwayService(); + this.mainView = new MainView(); + } + + public void run() { + subwayService.settingData(); + selectSubway(); + } + + public void selectSubway() { + boolean quit = true; + while (quit){ + mainView.printMainView(); + mainView.printSelectView(); + String command = scanner.nextLine().trim(); + if (command.equals("1")) { + stationController.manageStation(); + } + if (command.equals("2")) { + lineController.manageLine(); + } + if (command.equals("3")) { + sectionController.manageSection(); + } + if (command.equals("4")) { + sectionController.printLine(); + } + if (command.equals("Q")) { + quit = false; + } + } + } + + +} diff --git a/src/main/java/subway/controller/StationController.java b/src/main/java/subway/controller/StationController.java new file mode 100644 index 000000000..9a5309e82 --- /dev/null +++ b/src/main/java/subway/controller/StationController.java @@ -0,0 +1,53 @@ +package subway.controller; + +import java.util.List; +import java.util.Scanner; + +import subway.service.StationService; +import subway.view.MainView; +import subway.view.StationView; + +public class StationController { + private final StationView stationView; + private final MainView mainView; + private final StationService stationService; + private final Scanner scanner; + + public StationController(Scanner scanner) { + this.scanner = scanner; + this.stationView = new StationView(); + this.mainView = new MainView(); + this.stationService = new StationService(); + } + + public void manageStation() { + boolean back = true; + while (back) { + stationView.printStationView(); + mainView.printSelectView(); + String command = scanner.nextLine().trim(); + if (command.equals("1")) { + stationView.printAddStation(); + String stationName = scanner.nextLine().trim(); + stationService.addStation(stationName); + stationView.printSuccessAddStation(); + } + if (command.equals("2")) { + stationView.printDeleteStation(); + String stationName = scanner.nextLine().trim(); + stationService.deleteStation(stationName); + stationView.printSuccessDeleteStation(); + } + if (command.equals("3")) { + stationView.printSelectStation(); + List stations = stationService.getStations(); + stationView.printStationList(stations); + } + if (command.equals("B")) { + back = false; + } + } + } + + +} diff --git a/src/main/java/subway/domain/Section.java b/src/main/java/subway/domain/Section.java index 4111760d9..3a09295ab 100644 --- a/src/main/java/subway/domain/Section.java +++ b/src/main/java/subway/domain/Section.java @@ -15,4 +15,8 @@ public Section(Line line) { public void addStation(Station station) { stations.add(station); } + + public List getStations() { + return stations; + } } diff --git a/src/main/java/subway/domain/SectionRepository.java b/src/main/java/subway/domain/SectionRepository.java index c0eec259c..8cf14cc6e 100644 --- a/src/main/java/subway/domain/SectionRepository.java +++ b/src/main/java/subway/domain/SectionRepository.java @@ -8,4 +8,9 @@ public class SectionRepository { public static void addSection(Section section) {sections.add(section);} + public static boolean isStationInSection(String stationName) { + return sections.stream() + .flatMap(section -> section.getStations().stream()) + .anyMatch(station -> station.getName().equals(stationName)); + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index b7245c0f3..2f7d56772 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Objects; +import subway.view.error.StationErrorMessage; + public class StationRepository { private static final List stations = new ArrayList<>(); @@ -19,4 +21,11 @@ public static void addStation(Station station) { public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } + + public Station findStationByName(String name) { + return stations.stream() + .filter(station -> Objects.equals(station.getName(), name)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(StationErrorMessage.NOT_EXISTS.getMessage())); + } } diff --git a/src/main/java/subway/service/StationService.java b/src/main/java/subway/service/StationService.java new file mode 100644 index 000000000..77273ae86 --- /dev/null +++ b/src/main/java/subway/service/StationService.java @@ -0,0 +1,41 @@ +package subway.service; + +import java.util.List; +import java.util.stream.Collectors; + +import subway.domain.SectionRepository; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.view.error.StationErrorMessage; + +public class StationService { + public void addStation(String stationName) { + if (stationName.length() < 2) { + throw new IllegalArgumentException(StationErrorMessage.WRONG_NAME.getMessage()); + } + + if (StationRepository.stations().stream() + .anyMatch(station -> station.getName().equals(stationName))) { + throw new IllegalArgumentException(StationErrorMessage.ALREADY_EXISTS.getMessage()); + } + + Station newStation = new Station(stationName); + StationRepository.addStation(newStation); + } + + public void deleteStation(String stationName) { + if (SectionRepository.isStationInSection(stationName)) { + throw new IllegalArgumentException(StationErrorMessage.UN_REMOVABLE.getMessage()); + } + + if (!StationRepository.deleteStation(stationName)) { + throw new IllegalArgumentException(StationErrorMessage.NOT_EXISTS.getMessage()); + } + } + + public List getStations() { + return StationRepository.stations().stream() + .map(Station::getName) + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/java/subway/view/StationView.java b/src/main/java/subway/view/StationView.java new file mode 100644 index 000000000..9fac40ec4 --- /dev/null +++ b/src/main/java/subway/view/StationView.java @@ -0,0 +1,47 @@ +package subway.view; + +import java.util.List; + +public class StationView { + private static final String STATION = "## 역 관리 화면"; + private static final String ADD_STATION = "1. 역 등록"; + private static final String REMOVE_STATION = "2. 역 삭제"; + private static final String VIEW_STATIONS = "3. 역 조회"; + private static final String BACK = "B. 돌아가기"; + private static final String ADD_STATION_NAME = "## 등록할 역 이름을 입력하세요."; + private static final String DELETE_STATION_NAME = "## 삭제할 역 이름을 입력하세요."; + private static final String SUCCESS_ADD_STATION = "[INFO] 지하철 역이 등록되었습니다."; + private static final String SUCCESS_DELETE_STATION = "[INFO] 지하철 역이 삭제되었습니다."; + private static final String SELECT_STATION = "## 역 목록"; + + + + public void printStationView() { + System.out.println(STATION + "\n" + + ADD_STATION + "\n" + + REMOVE_STATION + "\n" + + VIEW_STATIONS + "\n" + + BACK); + } + + public void printAddStation() { + System.out.println(ADD_STATION_NAME); + } + + public void printSuccessAddStation() { + System.out.println(SUCCESS_ADD_STATION); + } + + public void printDeleteStation() { + System.out.println(DELETE_STATION_NAME); + } + + public void printSuccessDeleteStation() {System.out.println(SUCCESS_DELETE_STATION);} + + public void printSelectStation() {System.out.println(SELECT_STATION);} + + public void printStationList(List stations) { + stations.forEach(station -> System.out.println("[INFO] " + station)); + } + +} diff --git a/src/main/java/subway/view/error/StationErrorMessage.java b/src/main/java/subway/view/error/StationErrorMessage.java new file mode 100644 index 000000000..0dd3d8337 --- /dev/null +++ b/src/main/java/subway/view/error/StationErrorMessage.java @@ -0,0 +1,18 @@ +package subway.view.error; + +public enum StationErrorMessage { + ALREADY_EXISTS("[ERROR] 중복된 이름입니다."), + NOT_EXISTS("[ERROR] 존재하지 않는 역입니다."), + UN_REMOVABLE("[ERROR] 노선이 등록되어 있는 역입니다."), + WRONG_NAME("[ERROR] 지하철 역 이름은 2글자 이상이어야 합니다."); + + private String message; + + StationErrorMessage(String message) { + this.message = message; + } + + public String getMessage(){ + return message; + } +}