8000 [지하철 노선도 미션] 박병욱 미션 제출합니다. by jujubebat · Pull Request #101 · woowacourse/java-subway-map-precourse · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

[지하철 노선도 미션] 박병욱 미션 제출합니다. #101

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 25 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e503375
docs: 기능 구현 목록 작성
jujubebat Dec 14, 2020
a9411b1
docs: 기능 구현 목록 수정
jujubebat Dec 15, 2020
de464ac
feat: 메뉴 UI와 메뉴 동작 기능 구현
jujubebat Dec 15, 2020
b97c74d
refactor: 접근 수준 지시자 수정
jujubebat Dec 15, 2020
385a875
feat: 지하철 역 등록 기능 구현
jujubebat Dec 15, 2020
29e3750
feat: 지하철 역 목록 조회 기능 구현
jujubebat Dec 15, 2020
07921b4
feat: 지하철 역 삭제 기능 구현
jujubebat Dec 15, 2020
020d42f
refactor: 메서드명을 범용적으로 수정
jujubebat Dec 15, 2020
038ba45
feat: 지하철 노선 등록 기능 구현
jujubebat Dec 15, 2020
df04f27
feat: 지하철 노선 목록 조회 기능 구현
jujubebat Dec 15, 2020
4d729af
feat: 지하철 노선 삭제 기능 구현
jujubebat Dec 15, 2020
1b76dfa
refactor: 메서드명과 오류 메세지 상수 수정
jujubebat Dec 15, 2020
76a9f54
fix: 잘못된 초기 데이터 저장 로직 수정
jujubebat Dec 15, 2020
30f761f
feat: 모든 지하철 노선을 조회하는 기능 구현
jujubebat Dec 15, 2020
7c35c1c
docs: 기능 구현 목록 수정
jujubebat Dec 15, 2020
ac5ede7
feat: 지하철 노선 구간 추가 기능 구현
jujubebat Dec 15, 2020
0bb328e
feat: 지하철 노선 구간 삭제 기능 구현
jujubebat Dec 15, 2020
432abdf
docs: 기능 구현 목록 수정
jujubebat Dec 15, 2020
eed7ac1
refactor: 전체적으로 메서드, 변수명 가독성 좋게 수정
jujubebat Dec 15, 2020
e651119
refactor: 메뉴 조작시 화면 전환 방법 수정
jujubebat Dec 15, 2020
d550a73
refactor: 노선, 역 이름 입력시 특수문자일 경우 예외처리 하도록 수정
jujubebat Dec 15, 2020
171b311
docs: 프로젝트 소개 문구 추가
jujubebat Dec 15, 2020
39b50c0
style: 구현 순서 convention 수정
jujubebat Dec 15, 2020
35df2ce
refactor: 중복 되는 메서드 제거
jujubebat Dec 15, 2020
f9e1986
refactor: 의미가 명확하게 드러나도록 클래스명 수정
jujubebat Dec 17, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
469 changes: 0 additions & 469 deletions README.md

This file was deleted.

118 changes: 118 additions & 0 deletions docs/README.md
AE96
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
## **📃 프로젝트 소개**

- 지하철 노선도 관리 프로그램 입니다.
- 콘솔창에 보여지는 메뉴 UI를 통해서 지하철 노선도를 관리할 수 있습니다.
- "역 관리" 메뉴에서는 지하철 역을 등록하고, 삭제하고, 조회할 수 있습니다.
- "노선 관리" 메뉴에서는 지하철 노선을 등록하고, 삭제하고, 조회할 수 있습니다.
- "구간 관리" 메뉴에서는 지하철 노선을 등록하고, 삭제할 수 있습니다.
- "지하철 노선도 출력" 기능을 통해 모든 지하철 노선들을 조회할 수 있습니다.



## **🛠️ 프로그램 기능 목록**

#### 초기 설정

```
1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다.
2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다.
3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점)
- 2호선: 교대역 - 강남역 - 역삼역
- 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역
- 신분당선: 강남역 - 양재역 - 양재시민의숲역
```



#### 메뉴 관련 기능

- **메뉴 UI가 출력되고 동작한다.**

- ```
## 메인 화면 ## 역 관리 화면
1. 역 관리 1. 역 등록
2. 노선 관리 2. 역 삭제
3. 구간 관리 3. 역 조회
4. 지하철 노선도 출력 B. 돌아가기
Q. 종료
```

- 위와 같은 UI의 메뉴를 화면에 출력한다. (왼쪽 메인 화면, 오른쪽 역 관리 화면)

- 메뉴에서 선택할 수 있는 목록 종류로는 하위 메뉴(sub menu)와 항목(item)이 있다. 각 목록 맨 앞에는 id가 출력된다.

- 사용자로부터 화면에 보이는 id 중 하나를 입력받으면 그에 따라서 동작해야한다.

- 하위 메뉴 id를 입력 받았을 경우 하위 메뉴 화면을 출력한다.
- 항목 id를 입력 받았을 경우 해당 항목의 기능을 실행한다.
- 기능 실행이 끝나면 실행 결과를 화면에 출력하고, 메인 화면으로 돌아간다.
- ex0) `## 메인화면`에서 `2`를 입력 받으면 `노선 관리` 메뉴 화면을 출력한다.
- ex1) `## 메인화면`에서 `4`를 입력 받으면 `지하철 노선도 출력 기능`을 실행한다.
- ex2) `## 메인화면`에서 `Q`를 입력 받으면 `프로그램 종료 기능`이 실행된다.
- ex3) `## 역 관리 화면`에서 `3`을 입력 받으면 `역 조회 기능`이 실행된다.
- ex4) `## 역 관리 화면`에서 `B`를 입력 받으면 `이전 화면으로 돌아가는 기능`이 실행된다.

- **[예외]** 현재 화면에 없는 id를 입력했을 경우



#### 지하철 역 관련 기능

- **지하철 역을 등록한다.**
- **[예외]** 중복된 지하철 역 이름이 등록될 수 없다.
- **[예외]** 지하철 역 이름은 2글자 이상이어야 한다.
- **[예외]** 지하철 역 이름에 특수 문자가 포함되는 경우
- **지하철 역을 삭제한다.**
- **[예외]** 노선에 등록된 역은 삭제할 수 없다.
- **[예외]** 아예 등록되지 않은 역이 입력으로 들어오는 경우
- **지하철 역 목록을 조회한다.**



#### 지하철 노선 관련 기능

- **지하철 노선을 등록한다.**
- 노선 등록 시 상행 5D32 점역과 하행 종점역을 입력받는다.
- **[예외]** 중복된 지하철 노선 이름이 등록될 수 없다.
- **[예외]** 지하철 노선 이름은 2글자 이상이어야 한다.
- **[예외]** 지하철 노선 이름에 특수 문자가 포함되는 경우
- **[예외]** 입력받은 상행/하행 종점역이 등록되지 않은 역일 경우
- **지하철 노선을 삭제 한다.**
- **[예외]** 등록되지 않은 노선 이름이 입력으로 들어올 경우
- **지하철 노선 목록을 조회한다.**



#### 지하철 구간 관련 기능

- **지하철 노선에 구간을 추가한다.**
- 하나의 역은 여러개의 노선에 추가될 수 있다.
- 노선, 추가할 역, 구간 위치를 입력 받는다.
- **[예외]** 등록되지 않은 노선이 입력으로 들어올 경우
- **[예외]** 등록되지 않은 역이 입력으로 들어올 경우
- **[예외]** 구간 위치가 잘못된 값일 경우(음수거나 노선의 범위보다 큰 값일 경우)
- **[예외]** 노선에서 갈래길은 생길 수 없다. (하나의 노선에 같은 역이 중복되는 경우)
- **[예외]** 지하철 노선 이름에 특수 문자가 포함되는 경우

- **지하철 노선의 구간을 제거한다.**
- 종점을 제거할 경우 다음 역이 종점이 된다.
- **[예외]** 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다.
- **[예외]** 등록되지 않은 노선이 입력으로 들어올 경우
- **[예외]** 등록되지 않은 역이 입력으로 들어올 경우



#### 지하철 노선도 관련 기능

- **모든 지하철 노선을 조회한다.**

- 각 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다.



------

### 📝메모

- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다.
- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. (에러의 문구는 자유롭게 작성한다.)
12 changes: 9 additions & 3 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package subway;

import java.util.Scanner;
import subway.controller.SubwayManageController;
import subway.domain.util.DataFactory;

public class Application {

public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
DataFactory dataFactory = new DataFactory();
dataFactory.makeSubwayData();

SubwayManageController subwayManageController = new SubwayManageController();
subwayManageController.run();
}

}
82 changes: 82 additions & 0 deletions src/main/java/subway/controller/SubwayManageController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package subway.controller;

import java.util.LinkedHashMap;
import subway.domain.selector.Manipulable;
import subway.domain.selector.Selector;
import subway.domain.selector.menu.Menu;
import subway.domain.selector.menu.MenuRepository;
import subway.domain.selector.utilitem.BackWardItem;
import subway.domain.selector.utilitem.ExitItem;
import subway.view.InputView;
import subway.view.OutputView;

public class SubwayManageController {

private static final InputView inputView = new InputView();
private static final OutputView outputView = new OutputView();
private static final String MAIN_MENU_ID = "0";
private String previousMenuId = MAIN_MENU_ID;
private String currentMenuId = MAIN_MENU_ID;
private boolean isRun;

public void run() {
isRun = true;
LinkedHashMap<String, Menu> menus = MenuRepository.menus();

while (isRun) {
Menu menu = menus.get(currentMenuId);
outputView.printScreen(menu);

Selector selector = inputView.getSelector(menu);
if (isExitItem(selector)
|| isBackWardItem(selector)
|| isSubMenu(selector)) {
continue;
}
executeItem(selector, menu);
setMenuIdInformation(MAIN_MENU_ID, MAIN_MENU_ID);
}
}

private boolean isExitItem(Selector selector) {
if (selector instanceof ExitItem) {
isRun = false;
return true;
}
return false;
}

private boolean isBackWardItem(Selector selector) {
if (selector instanceof BackWardItem) {
this.currentMenuId = this.previousMenuId;
return true;
}
return false;
}

private boolean isSubMenu(Selector selector) {
if (selector instanceof Manipulable) {
setMenuIdInformation(MAIN_MENU_ID, MAIN_MENU_ID);
return false;
}
setMenuIdInformation(currentMenuId, selector.getId());
return true;
}

private void setMenuIdInformation(String previousMenuId, String currentMenuId) {
this.previousMenuId = previousMenuId;
this.currentMenuId = currentMenuId;
}

private void executeItem(Selector selector, Menu menu) {
try {
Manipulable item = (Manipulable) selector;
item.execute();
} catch (Exception e) {
System.out.println(e.getMessage());
outputView.printScreen(menu);
executeItem(selector, menu);
}
}

}
15 changes: 0 additions & 15 deletions src/main/java/subway/domain/Line.java

This file was deleted.

45 changes: 45 additions & 0 deletions src/main/java/subway/domain/line/Line.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package subway.domain.line;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import subway.domain.station.Station;

public class Line {

private final List<Station> stations = new ArrayList<>();
private String name;

public Line(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void addAllStation(List<Station> stationsList) {
stations.addAll(stationsList);
}

public void addStationByIndex(Station station, int index) {
stations.add(index, station);
}

public void deleteStationByName(String name) {
stations.removeIf(station -> station.getName().equals(name));
}

public boolean isContainsStation(Station station) {
for (Station each : stations) {
if (each.getName().equals(station.getName())) {
return true;
}
}
return false;
}

public List<Station> stations() {
return Collections.unmodifiableList(stations);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package subway.domain;
package subway.domain.line;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class LineRepository {

private static final List<Line> lines = new ArrayList<>();

public static List<Line> lines() {
Expand All @@ -16,6 +17,15 @@ public static void addLine(Line line) {
lines.add(line);
}

public static Line getLineByName(String name) {
for (Line line : lines) {
if (line.getName().equals(name)) {
return line;
}
}
return null;
}

public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/subway/domain/selector/Manipulable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package subway.domain.selector;

public interface Manipulable {

default void execute(){};

}
28 changes: 28 additions & 0 deletions src/main/java/subway/domain/selector/Selector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package subway.domain.selector;

import subway.view.InputView;
import subway.view.MessageView;
import subway.view.OutputView;

public abstract class Selector {

protected String id;
protected String name;
protected InputView inputView = new InputView();
protected OutputView outputView = new OutputView();
protected MessageView messageView = new MessageView();

public String getId() {
return id;
}

public String getName() {
return name;
}

@Override
public String toString() {
return name;
}

}
Loading
0