Skip to content
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

[지하철 노선도 미션] 김지우 미션 제출합니다. #106

Open
wants to merge 52 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
0eeea80
docs(readme): add the list to implement
jiwoo-kimm Dec 11, 2020
46283bf
feat(manager): implement select function and validate function code i…
jiwoo-kimm Dec 11, 2020
78f99df
feat(main): implement run service on user input
jiwoo-kimm Dec 11, 2020
3047333
refactor: refactor package structure
jiwoo-kimm Dec 11, 2020
b42a641
feat(main): initialize map with given data
jiwoo-kimm Dec 11, 2020
ff4656a
docs(readme): update the list to implement station service
jiwoo-kimm Dec 11, 2020
e26b690
docs(readme): update the list to implement station service
jiwoo-kimm Dec 11, 2020
8bc2600
merge: merge conflict on readme
jiwoo-kimm Dec 11, 2020
4493cd3
refactor: rename function to service
jiwoo-kimm Dec 11, 2020
7e84642
refactor: move validation method into service
jiwoo-kimm Dec 11, 2020
7bce4ef
feat(station): implement select function and validation input
jiwoo-kimm Dec 11, 2020
56ae11b
feat(station): implement run function on user input
jiwoo-kimm Dec 11, 2020
0c7ac5c
feat(station): check duplicated name on add
jiwoo-kimm Dec 11, 2020
47b853a
feat(station): validate station name length on add
jiwoo-kimm Dec 11, 2020
377eeb7
feat(station): show all stations' name
jiwoo-kimm Dec 11, 2020
8266594
docs(readme): update the list to implement line
jiwoo-kimm Dec 11, 2020
c96a223
refactor: make service abstract
jiwoo-kimm Dec 11, 2020
2204c02
feat(line): implement select function and validate input
jiwoo-kimm Dec 11, 2020
6d6fcfd
feat(line): show all lines' name
jiwoo-kimm Dec 11, 2020
4a7719a
feat(line): check duplicated name on add
jiwoo-kimm Dec 11, 2020
d99343a
feat(line): validate line name length on add
jiwoo-kimm Dec 11, 2020
c2e0a91
feat(line): check up and down end stations exist on add
jiwoo-kimm Dec 11, 2020
6363f05
feat(line): check line exists on delete
jiwoo-kimm Dec 11, 2020
cc9fb30
docs(readme): update the list to implement link service
jiwoo-kimm Dec 11, 2020
e141dae
refactor: rename area into link
jiwoo-kimm Dec 11, 2020
80f5607
refactor: rename service interface and classes
jiwoo-kimm Dec 11, 2020
4047511
refactor: simplify constructors of line class
jiwoo-kimm Dec 11, 2020
38e7d39
feat(link): select function and validate input
jiwoo-kimm Dec 11, 2020
8030054
feat(link): run function on user input
jiwoo-kimm Dec 11, 2020
e1e3600
feat(link): check line exists on add
jiwoo-kimm Dec 11, 2020
28b53ad
feat(link): check station exists on add
jiwoo-kimm Dec 11, 2020
af78129
feat(link): validate order input if it's integer
jiwoo-kimm Dec 11, 2020
3a41cf0
feat(link): add new link on proper parameters
jiwoo-kimm Dec 11, 2020
571c6ce
feat(link): update up and down ends on add
jiwoo-kimm Dec 11, 2020
83bfe8b
feat(link): check line and station exist on delete
jiwoo-kimm Dec 11, 2020
f8b4ddf
feat(link): check remaining link count of the line on delete
jiwoo-kimm Dec 11, 2020
3274626
feat(station): check station deletable on delete
jiwoo-kimm Dec 11, 2020
459cea1
feat(print): print all lines and stations
jiwoo-kimm Dec 11, 2020
9e611b9
feat(line): add stations with line on add
jiwoo-kimm Dec 11, 2020
a04bb46
refactor: realign exception class
jiwoo-kimm Dec 11, 2020
8fb75e3
refactor: remove unused constructor
jiwoo-kimm Dec 11, 2020
5c3f574
style: realign
jiwoo-kimm Dec 11, 2020
e8524cf
refactor: rename constants
jiwoo-kimm Dec 11, 2020
623283d
refactor: rename constant
jiwoo-kimm Dec 11, 2020
e50914a
refactor: rename method
jiwoo-kimm Dec 11, 2020
4b99d66
refactor: rename methods in services
jiwoo-kimm Dec 11, 2020
8a2af76
style: remove empty line
jiwoo-kimm Dec 11, 2020
0873f9c
docs(readme): update the list to implement
jiwoo-kimm Dec 11, 2020
1e10619
refactor: add views and move UI logic from service to view
jiwoo-kimm Dec 15, 2020
0c9c82b
style: realign code
jiwoo-kimm Dec 15, 2020
af18a44
refactor: seperate inputView and outputView functions
jiwoo-kimm Dec 15, 2020
9ff0fa5
docs(readme): update the list to implement
jiwoo-kimm Dec 15, 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
100 changes: 82 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
# 지하철 노선도 미션

- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다.

<br>

## 🚀 기능 요구사항

### 초기 설정
### 초기 설정

- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅할 수 있다.

> 아래의 사전 등록 정보로 반드시 초기 설정을 하기
>

```
1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다.
2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다.
Expand All @@ -20,48 +23,56 @@
```

<img src="image/domain.png" width="500">

### 지하철 역 관련 기능

- 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다)
- 중복된 지하철 역 이름이 등록될 수 없다.
- 지하철 역 이름은 2글자 이상이어야 한다.
- 지하철 역의 목록을 조회할 수 있다.

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

- 지하철 노선을 등록하고 삭제할 수 있다.
- 중복된 지하철 노선 이름이 등록될 수 없다.
- 지하철 노선 이름은 2글자 이상이어야 한다.
- 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다.
- 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다.
- 지하철 노선의 목록을 조회할 수 있다.

### 지하철 구간 추가 기능

- 지하철 노선에 구간을 추가하는 기능은 노선에 역을 추가하는 기능이라고도 할 수 있다.
- 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다.
- 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다.
- 하나의 역은 여러개의 노선에 추가될 수 있다.
- 역과 역 사이에 새로운 역이 추가 될 수 있다.
- 노선에서 갈래길은 생길 수 없다.

<img src="image/section1.png" width="500">

### 지하철 구간 삭제 기능

- 노선에 등록된 역을 제거할 수 있다.
- 종점을 제거할 경우 다음 역이 종점이 된다.
- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다.

<img src="image/section2.png" width="500">

### 지하철 노선에 등록된 역 조회 기능

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

<br>

## ✍🏻 입출력 요구사항

- `프로그래밍 실행 결과 예시`를 참고하여 입출력을 구현한다.
- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다.
- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. (에러의 문구는 자유롭게 작성한다.)

### 💻 프로그래밍 실행 결과
### 💻 프로그래밍 실행 결과

#### 역 관리

```
## 메인 화면
1. 역 관리
Expand Down Expand Up @@ -233,6 +244,7 @@ B. 돌아가기
```

### 구간 관리

- 순서는 1부터 시작한다.

```
Expand Down Expand Up @@ -379,25 +391,28 @@ B. 돌아가기
<br>

## 🎱 프로그래밍 요구사항

- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다.
- 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다.
- 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다.
- 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다.
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
- 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.
- else 예약어를 쓰지 않는다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다.
- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 `[ERROR]` 로 시작해야 한다.

### 프로그래밍 요구사항 - Application

- Application 클래스를 활용해 구현해야 한다.
- Application의 패키지 구조는 변경하지 않는다.
- 주석을 참고하여 구현할 수 있으며 주석대로 구현하지 않아도 되고 삭제해도 무관하다.
- 주석을 참고하여 구현할 수 있으며 주석대로 구현하지 않아도 되고 삭제해도 무관하다.

```java
public class Application {
public static void main(String[] args) {
Expand All @@ -407,11 +422,12 @@ public class Application {
```

### 프로그래밍 요구사항 - Station, Line

- Station, Line 클래스를 활용하여 지하철역과 노선을 구현해야 한다.
- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다.
- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다.
- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다.

```java
public class Station {
private String name;
Expand All @@ -430,12 +446,13 @@ public class Station {
```

### 프로그래밍 요구사항 - StationRepository, LineRepository

- Station과 Line의 상태를 저장할 수 있는 StationRepository, LineRepository를 제공한다.
- 필요 시 StationRepository, LineRepository 이 외 추가로 Repository를 만들 수 있다.
- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가할 수 있다.
- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다.
- 필요에 따라 자유롭게 수정이 가능하다.

```java
public class StationRepository {
private static final List<Station> stations = new ArrayList<>();
Expand All @@ -457,14 +474,61 @@ public class StationRepository {
<br>

## 📈 진행 요구사항

- 미션은 [java-subway-map-precourse 저장소](https://github.com/woowacourse/java-subway-map-precourse) 를 fork/clone해 시작한다.
- 기능을 구현하기 전에 java-subway-map-precourse/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다.
- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.
- [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다.
- [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를
남긴다.
- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다.
- [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다.
<br>
- [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다.
<br>

## 📝 License

This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed.

<br>

## ☑ 구현할 기능 목록

- [x] 메인
- [x] 선택지에 없는 입력일 시 에러메세지를 출력한다.
- [x] 사용자 입력에 따라 하위 기능을 실행한다.
- [x] 사용자 입력이 Q인 경우 프로그램을 완전 종료한다.
- [x] 사전등록정보에 따라 지하철 노선도를 초기화한다.
- [x] 역 관리
- [x] 선택지에 없는 입력일 시 에러메세지를 출력한다.
- [x] 사용자 입력에 따라 하위 기능을 실행한다.
- [x] 역 조회 시 모든 역의 이름을 중복 없이 출력한다.
- [x] 역 등록 시 이름 중복을 확인한다.
- [x] 역 등록 시 이름이 2글자 이상인지 확인한다.
- [x] 역 삭제 시 존재하는 역인지 확인한다.
- [x] 역 삭제 시 노선에 등록된 역인지 확인한다.
- [x] 노선 관리
- [x] 하위 기능을 선택한다. (역 관리와 동일)
- [x] 노선 조회 시 모든 노선의 이름을 중복 없이 출력한다.
- [x] 노선 등록 시 이름 중복을 확인한다.
- [x] 노선 등록 시 이름이 2글자 이상인지 확인한다.
- [x] 노선 등록 시 상행 종점역이 존재하는 역인지 확인한다.
- [x] 노선 등록 시 하행 종점역이 존재하는 역인지 확인한다.
- [x] 노선 등록 시 상하행 종점역을 역 리스트에 추가한다.
- [x] 노선 삭제 시 존재하는 노선인지 확인한다.
- [x] 구간 관리
- [x] 선택지에 없는 입력일 시 에러메세지를 출력한다.
- [x] 사용자 입력에 따라 하위 기능을 실행한다.
- [x] 구간 등록 시 존재하는 노선인지 확인한다.
- [x] 구간 등록 시 존재하는 역인지 확인한다.
- [x] 구간 등록 시 순서 입력이 숫자가 아니면 에러메세지를 출력한다.
- [x] 구간 등록 시 순서 입력이 범위 내 숫자가 아니면 에러메세지를 출력한다.
- [x] 구간 등록 시 상하행 종점역을 갱신한다.
- [x] 구간 삭제 시 존재하는 노선인지 확인한다.
- [x] 구간 삭제 시 존재하는 역인지 확인한다.
- [x] 구간 삭제 시 노선에 남은 역이 2개 초과인지 확인한다.
- [x] 구간 삭제 시 상하행 종점역을 갱신한다.
- [x] 지하철 노선도
- [x] 모든 노선과 역을 순서대로 출력한다.
- [x] 리팩토링
- [x] 비즈니스 로직과 UI 로직을 분리한다.
- [x] InputView를 통해 사용자 입력을 받는다.
- [x] OutputView를 통해 안내 문구와 결과를 출력한다.
6 changes: 5 additions & 1 deletion src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package subway;

import subway.service.MainService;

import java.util.Scanner;

public class Application {

public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
MainService mainService = new MainService(scanner);
mainService.run();
}
}
9 changes: 9 additions & 0 deletions src/main/java/subway/constant/Constant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package subway.constant;

public class Constant {

public static final int MIN_NAME_LENGTH = 2;
public static final int MIN_ORDER = 0;
public static final int MIN_STATIONS_IN_LINE = 3;
public static final String DIVIDER = "---";
}
40 changes: 40 additions & 0 deletions src/main/java/subway/constant/Function.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package subway.constant;

import subway.exception.InvalidInputException;

import java.util.ArrayList;
import java.util.List;

public enum Function {

ADD("1"),
DELETE("2"),
SHOW("3"),
QUIT("B");

private static List<String> functionCodes = new ArrayList<>();
private String code;

Function(String code) {
this.code = code;
}

public String getCode() {
return code;
}

public static void validate(String input) throws InvalidInputException {
if (!isAvailable(input))
throw new InvalidInputException(InvalidInputException.ExceptionCode.INVALID_FUNCTION_CODE);
}

private static boolean isAvailable(String input) {
initFunctionCodes();
return functionCodes.contains(input);
}

private static void initFunctionCodes() {
for (Function function : Function.values())
functionCodes.add(function.code);
}
}
36 changes: 36 additions & 0 deletions src/main/java/subway/constant/Information.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package subway.constant;

public class Information {

public static final String INFO_HEADER = "[INFO] ";

public static final String CHOOSE_FUNCTION = "\n## 원하는 기능을 선택하세요.";
public static final String MAIN_INFO = "\n## 메인 화면\n1. 역 관리\n2. 노선 관리\n3. 구간 관리\n4. 지하철 노선도 출력\nQ. 종료\n" + CHOOSE_FUNCTION;

public static final String STATION_INFO = "\n## 역 관리 화면\n1. 역 등록\n2. 역 삭제\n3. 역 조회\nB. 돌아가기\n" + CHOOSE_FUNCTION;
public static final String ADD_STATION_INFO = "\n## 등록할 역 이름을 입력하세요.";
public static final String ADD_STATION_SUCCESS = INFO_HEADER + "지하철 역이 등록되었습니다.";
public static final String DELETE_STATION_INFO = "\n## 삭제할 역 이름을 입력하세요.";
public static final String DELETE_STATION_SUCCESS = INFO_HEADER + "지하철 역이 삭제되었습니다.";
public static final String SHOW_STATION_INFO = "\n## 역 목록";

public static final String LINE_INFO = "\n## 노선 관리 화면\n1. 노선 등록\n2. 노선 삭제\n3. 노선 조회\nB. 돌아가기\n" + CHOOSE_FUNCTION;
public static final String ADD_LINE_INFO = "\n## 등록할 노선 이름을 입력하세요.";
public static final String ADD_LINE_INFO_UP_END = "\n## 등록할 노선의 상행 종점역 이름을 입력하세요.";
public static final String ADD_LINE_INFO_DOWN_END = "\n## 등록할 노선의 하행 종점역 이름을 입력하세요.";
public static final String ADD_LINE_SUCCESS = INFO_HEADER + "지하철 노선이 등록되었습니다.";
public static final String DELETE_LINE_INFO = "\n## 삭제할 노선 이름을 입력하세요.";
public static final String DELETE_LINE_SUCCESS = INFO_HEADER + "지하철 노선이 삭제되었습니다.";
public static final String SHOW_LINE_INFO = "\n## 노선 목록";

public static final String LINK_INFO = "\n## 구간 관리 화면\n1. 구간 등록\n2. 구간 삭제\nB. 돌아가기\n" + CHOOSE_FUNCTION;
public static final String ADD_LINK_INFO_LINE = "\n## 노선 이름을 입력하세요.";
public static final String ADD_LINK_INFO_STATION = "\n## 역 이름을 입력하세요.";
public static final String ADD_LINK_INFO_ORDER = "\n## 순서를 입력하세요.";
public static final String ADD_LINK_SUCCESS = INFO_HEADER + "구간이 등록되었습니다.";
public static final String DELETE_LINK_INFO_LINE = "\n## 삭제할 구간의 노선 이름을 입력하세요.";
public static final String DELETE_LINK_INFO_STATION = "\n## 삭제할 구간의 역 이름을 입력하세요.";
public static final String DELETE_LINK_SUCCESS = INFO_HEADER + "구간이 삭제되었습니다.";

public static final String PRINT_INFO = "\n## 지하철 노선도";
}
47 changes: 47 additions & 0 deletions src/main/java/subway/constant/InitialData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package subway.constant;

import subway.domain.Line;
import subway.domain.Station;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class InitialData {

public static final List<Station> stations = new ArrayList<>(Arrays.asList(
new Station("교대역"),
new Station("강남역"),
new Station("역삼역"),
new Station("남부터미널역"),
new Station("양재역"),
new Station("양재시민의숲역"),
new Station("매봉역")
));


private static final List<Station> lineTwoStations = new ArrayList<>(Arrays.asList(
new Station("교대역"),
new Station("강남역"),
new Station("역삼역")
));

private static final List<Station> lineThreeStations = new ArrayList<>(Arrays.asList(
new Station("교대역"),
new Station("남부터미널역"),
new Station("양재역"),
new Station("매봉역")
));

private static final List<Station> lineSinbundangStations = new ArrayList<>(Arrays.asList(
new Station("강남역"),
new Station("양재역"),
new Station("양재시민의숲역")
));

public static final List<Line> lines = new ArrayList<>(Arrays.asList(
new Line("2호선", lineTwoStations),
new Line("3호선", lineThreeStations),
new Line("신분당선", lineSinbundangStations)
));
}
Loading