Skip to content
Open
39 changes: 36 additions & 3 deletions README.md → docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,39 @@

<br>

## 👾 기능 목록 `new`

- 프로그램 시작
- 초기 정보 등록
- 목록 UI
- 목록 내 번호인지 검증
- 지하철 역 관련 기능
- 역 이름이 2자 이상인지 검증
- 중복된 역 이름이 없는지 검증
- 역 등록
- 역 삭제
- `static` 역 목록 조회
- 지하철 노선 관련 기능
- 노선 이름이 2자 이상인지 검증
- 중복된 노선 이름이 없는지 검증
- 노선 등록
- 상행, 하행 종점역 존재 여부 검증
- 노선 삭제
- `static` 노선 목록 조회
- 지하철 구간 관련 기능
- 구간 등록
- 노선 존재 여부 검증
- 역 존재 여부 검증
- 노선내 역 존재 여부 검증
- 상행, 하행 종점일 경우 가능
- 상하행 여부 확인 및 변경
- 구간 삭제
- 노선 존재 여부 검증
- 역 존재 여부 검증
- 노선 내 역 2개 초과인지 검증
- 상하행 여부 확인 및 변경
- 노선도 조회

## 🚀 기능 요구사항

### 초기 설정
Expand All @@ -19,7 +52,7 @@
- 신분당선: 강남역 - 양재역 - 양재시민의숲역
```

<img src="image/domain.png" width="500">
<img src="dev/woowacourse/java-subway-map-precourse/image/domain.png" width="500">

### 지하철 역 관련 기능
- 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다)
Expand All @@ -41,14 +74,14 @@
- 역과 역 사이에 새로운 역이 추가 될 수 있다.
- 노선에서 갈래길은 생길 수 없다.

<img src="image/section1.png" width="500">
<img src="dev/woowacourse/java-subway-map-precourse/image/section1.png" width="500">

### 지하철 구간 삭제 기능
- 노선에 등록된 역을 제거할 수 있다.
- 종점을 제거할 경우 다음 역이 종점이 된다.
- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다.

<img src="image/section2.png" width="500">
<img src="dev/woowacourse/java-subway-map-precourse/image/section2.png" width="500">

### 지하철 노선에 등록된 역 조회 기능
- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다.
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package subway;

import java.util.Scanner;
import subway.controller.MenuController;
import subway.domain.service.LineService;
import subway.domain.service.StationService;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
StationService.init();
LineService.init();
MenuController.runProgram(scanner);
}
}
61 changes: 61 additions & 0 deletions src/main/java/subway/controller/LineController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package subway.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import subway.domain.Station;
import subway.domain.service.LineService;
import subway.domain.service.StationService;
import subway.view.DetailView;
import utils.Category;
import utils.ScriptUtils;

public class LineController {
public static final int ADD = 1;
public static final int DELETE = 2;
public static final int GET_LIST = 3;

public static DetailView lineView = new DetailView(Category.LINE);

private LineController() {}

public static void manageLine(Scanner scanner, int selection) {
String name = lineView.ask(scanner, selection);
if (name == null) {
return;
}
if (selection == DELETE) {
LineService.deleteLine(name);
return;
}
addLine(scanner, name);
}

private static void addLine(Scanner scanner, String name) {
try {
if (LineService.duplicateName(name)) {
throw new IllegalArgumentException(ScriptUtils.ERROR_DUPLICATE(Category.LINE));
}
addTerminals(scanner, name);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}

private static void addTerminals(Scanner scanner, String name) {
List<Station> terminals = new ArrayList<>();
for (int i = 0; i < ScriptUtils.ASK_ADD_LINE.length; i++) {
String terminalName = lineView.additionalAsk(scanner, ScriptUtils.ASK_ADD_LINE[i]);
try {
if (!StationService.duplicateName(terminalName)) {
throw new IllegalArgumentException(ScriptUtils.ERROR_NO(Category.STATION));
}
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return;
}
terminals.add(StationService.readStation(terminalName));
}
LineService.createLine(name, terminals);
}
}
51 changes: 51 additions & 0 deletions src/main/java/subway/controller/MenuController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package subway.controller;

import java.util.Scanner;
import subway.domain.service.LineService;
import subway.view.MenuView;
import utils.Category;

public class MenuController {
private MenuController() {}

public static void runProgram(Scanner scanner) {
MenuView mainView = new MenuView();
int stopOption = MenuView.RETRY;
while (stopOption < MenuView.EXIT) {
mainView.printMenu();
int selection = mainView.selectMenu(scanner);
if (selection <= MenuView.EXIT) {
stopOption = selection;
continue;
}
showSelectedView(selection, scanner);
}
}

private static void showSelectedView(int categoryNumber, Scanner scanner) {
Category category = Category.values()[categoryNumber];
MenuView selectedView = new MenuView(category);
selectedView.printMenu();
int selection = selectedView.selectMenu(scanner);
if (selection <= MenuView.EXIT) {
return;
}
executeSelection(category, selection, scanner);
}

public static void executeSelection(Category category, int selection, Scanner scanner) {
if (category == Category.STATION) {
StationController.manageStation(scanner, selection);
}
if (category == Category.LINE) {
if (selection == LineController.GET_LIST) {
LineService.readLineList();
return;
}
LineController.manageLine(scanner, selection);
}
if(category == Category.SECTION) {
SectionController.manageSection(scanner, selection);
}
}
}
84 changes: 84 additions & 0 deletions src/main/java/subway/controller/SectionController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package subway.controller;

import java.util.Scanner;
import subway.domain.Line;
import subway.domain.Station;
import subway.domain.service.LineService;
import subway.domain.service.SectionService;
import subway.domain.service.StationService;
import subway.view.DetailView;
import utils.Category;
import utils.ScriptUtils;

public class SectionController {
private static DetailView sectionView = new DetailView(Category.SECTION);
private static int askCount = 2;
private static int ADD = 1;

private SectionController() { }

public static void manageSection(Scanner scanner, int selection) {
if (selection == ADD) {
addSection(scanner, selection);
return;
}

deleteSection(scanner, selection);
}

private static void deleteSection(Scanner scanner, int selection) {
Line line = askLine(scanner, selection);
Station station = askStation(scanner, selection);
if (line != null && station != null) {
SectionService.deleteSection(line, station);
}
}

private static void addSection(Scanner scanner, int selection) {
Line line = askLine(scanner, selection);
Station station = askStation(scanner, selection);
int idx = askIdx(scanner, selection, line);

if (line != null && station != null && idx >= 0) {
SectionService.createSection(line, station, idx);
}
}

private static int askIdx(Scanner scanner, int selection, Line line) {
int idx = sectionView.askSectionNumber(scanner, ScriptUtils.ASK_ANSWER_FOR_SECTION[selection-1][2]);
if (idx < 0) {
return idx;
}
try {
if (idx > line.getLength()) {
throw new IllegalArgumentException(ScriptUtils.ERROR_OUT_OF_BOUNDARY);
}
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return -1;
}
return idx;
}

private static Station askStation(Scanner scanner, int selection) {
try {
String stationName = sectionView.askSection(scanner, ScriptUtils.ASK_ANSWER_FOR_SECTION[selection-1][1]);
SectionService.checkDuplicate(1, stationName);
return StationService.readStation(stationName);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return null;
}
}

private static Line askLine(Scanner scanner, int selection) {
try {
String lineName = sectionView.askSection(scanner, ScriptUtils.ASK_ANSWER_FOR_SECTION[selection-1][0]);
SectionService.checkDuplicate(0, lineName);
return LineService.readLine(lineName);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return null;
}
}
}
33 changes: 33 additions & 0 deletions src/main/java/subway/controller/StationController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package subway.controller;

import java.util.Scanner;
import subway.domain.service.StationService;
import subway.view.DetailView;
import utils.Category;

public class StationController {
public static final int ADD = 1;
public static final int DELETE = 2;
public static final int GET_LIST = 3;

public static DetailView stationView = new DetailView(Category.STATION);

private StationController() {}

public static void manageStation(Scanner scanner, int selection) {
if (selection == GET_LIST) {
StationService.readStationList();
return;
}

String name = stationView.ask(scanner, selection);
if (name == null) {
return;
}
if (selection == ADD) {
StationService.createStation(name);
return;
}
StationService.deleteStation(name);
}
}
20 changes: 18 additions & 2 deletions src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
package subway.domain;

import java.util.List;

public class Line {
private String name;
private List<Station> stations;

public Line(String name) {
public Line(String name, List<Station> terminals) {
this.name = name;
this.stations = terminals;
}

public String getName() {
return name;
}

// 추가 기능 구현
public int getLength() { return stations.size(); }

public boolean validateStation(Station station) {
return stations.contains(station);
}

public void addStation(Station station, int idx) {
stations.add(idx-1, station);
}

public void deleteStation(Station station) {
stations.remove(station);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package subway.domain;
package subway.domain.repository;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import subway.domain.Line;

public class LineRepository {
private static final List<Line> lines = new ArrayList<>();
Expand All @@ -19,4 +21,13 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}

public static boolean findNoLine(String name) {
return lines.stream().noneMatch(line -> Objects.equals(line.getName(), name));
}

public static Line findLine(String name) {
return lines.stream().filter(line ->
Objects.equals(line.getName(), name)).collect(Collectors.toList()).get(0);
}
}
Loading