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

[지하철 노선도 미션] 윤가영 미션 제출합니다. #98

Open
wants to merge 23 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d3d9f12
docs: 기능 구현 목록 작성
GaYoung87 Dec 13, 2020
f177aa9
feat: 메인메뉴 inputView와 outputView
GaYoung87 Dec 13, 2020
dfcfe24
feat: Station메뉴 inputView와 outputView
GaYoung87 Dec 13, 2020
b89d675
refactor: 메인메뉴 error message후 한 줄 띄어 다시 보이기
GaYoung87 Dec 13, 2020
4a0a312
feat: 노선메뉴 inputView와 outputView
GaYoung87 Dec 13, 2020
99918f5
feat: 구간 메뉴 inputView와 outputView
GaYoung87 Dec 13, 2020
c18f540
feat: 메뉴 이동 기능 간단 구현
GaYoung87 Dec 13, 2020
3841440
feat: station 이름 글자수 예외처리
GaYoung87 Dec 13, 2020
4e92c8a
feat: station 이름 '역'으로 끝나는지 예외처리
GaYoung87 Dec 13, 2020
0a1f63e
feat: station이름 예외처리 후 값 받기
GaYoung87 Dec 13, 2020
2e9bb00
feat: 객체동일성이 아닌 논리적 동일성 개념제공을 위한 코드
GaYoung87 Dec 13, 2020
da9ec68
feat: station이름 저장 및 station requestdto, responsedto 생성
GaYoung87 Dec 13, 2020
b445f1f
feat: station 삭제기능(lineList만들기 이전)
GaYoung87 Dec 13, 2020
a0f9bc1
feat: line이름 글자수 예외 처리
GaYoung87 Dec 14, 2020
9bd905f
feat: line 이름 '선'또는 '호선'으로 끝나는지 예외처리
GaYoung87 Dec 14, 2020
a52be4f
feat: line이름 예외처리후 값 가져오기+논리적동일성 제공
GaYoung87 Dec 14, 2020
eb92e44
feat: line입력 후 상행/하행 종점역 입력
GaYoung87 Dec 14, 2020
bf8d0c0
feat: line 이름 저장하기
GaYoung87 Dec 14, 2020
f81c45d
feat: line이 존재하는지 노선이름으로 확인
GaYoung87 Dec 14, 2020
8e9adf4
feat: station삭제(line에 포함되어있는지 확인)
GaYoung87 Dec 14, 2020
59a5ebb
style: 패키지명 변경
GaYoung87 Dec 14, 2020
ce9c2df
feat: 구간에 station 추가
GaYoung87 Dec 14, 2020
307bea7
feat: 기본제공 데이터 저장
GaYoung87 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
87 changes: 69 additions & 18 deletions README.md → docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
- 2호선: 교대역 - 강남역 - 역삼역
- 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역
- 신분당선: 강남역 - 양재역 - 양재시민의숲역
```
```

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

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

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

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

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

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

### 지하철 노선에 등록된 역 조회 기능
- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다.
Expand Down Expand Up @@ -410,7 +410,7 @@ public class Application {
- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다.
- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다.
- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다.

```java
public class Station {
private String name;
Expand All @@ -434,7 +434,7 @@ public class Station {
- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가할 수 있다.
- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다.
- 필요에 따라 자유롭게 수정이 가능하다.

```java
public class StationRepository {
private static final List<Station> stations = new ArrayList<>();
Expand All @@ -455,15 +455,66 @@ 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를 남긴다.
- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다.
- [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다.
<br>

## 📝 License
## 📝 기능 구현

#### 1. 메인화면

- 메뉴에 있는 번호가 아니면 `[ERROR] 선택할 수 없는 기능입니다.`
- 메인 메뉴, 지하철 역 메뉴, 지하철 노선 메뉴, 지하철 구간 메뉴 생성

#### 2. 역 관리

- **역 등록**
- 지하철 역 등록하기 `[INFO] 지하철 역이 등록되었습니다.`
- 이름은 2글자 이상이여야함 `[ERROR] 역이름은 2글자 이상 입력해야합니다.`
- `역`으로 끝나게 이름 작성해야함 `[ERROR] 역이름은 OO역으로 끝나야 합니다.`
- 중복되지 않도록 작성해야함 `[ERROR] 이미 등록된 역 이름입니다. 중복되지 않는 역이름을 입력해주세요.`
- **역 삭제**
- 지하철 역 삭제하기 `[INFO] 지하철 역이 삭제되었습니다.`
- 역 리스트에 존재해야함 `[ERROR] 존재하지 않는 역입니다.`
- 마지막에 `역`으로 끝나야함 `[ERROR] OO역으로 입력해야 삭제가 가능합니다.`
- 노선에 등록되어있지 않아야함 `[ERROR] 노선에 등록되어있는 역은 삭제가 불가능합니다.`
- **역 조회**
- 역 이름만 가지고 있는 배열 생성(조회하면 배열의 원소를 하나씩 보여주기)

#### 3. 노선 관리

- **노선 등록**
- 노선 등록하기 `[INFO] 지하철 노선이 등록되었습니다.`
- 노선 이름
- 이름은 2글자 이상이여야함 `[ERROR] 노선 이름은 2글자 이상 입력해야합니다.`
- `선`으로 끝나게 이름 작성해야함 `[ERROR] 노선이름은 OO선 또는 O호선으로 끝나야 합니다.`
- 중복되지 않도록 작성해야함 `[ERROR] 이미 존재하는 노선입니다. 중복되지 않는 노선 이름을 입력해주세요.`
- 상행 종점역 이름 / 하행 종점역 이름
- 존재하는 역 중에서 작성해야함 `[ERROR] 존재하는 역 중에서 입력해주세요.`
- **노선 삭제**
- 지하철 노선 삭제하기 `[INFO] 지하철 노선이 삭제되었습니다.`
- 노선 리스트에 존재해야함 `[ERROR] 존재하지 않는 노선입니다.`
- 마지막에 `호선` 또는 `선`으로 끝나야함 `[ERROR] OO선 또는 O호선으로 입력해야합니다..`
- 노선에 등록되어있어야함 `[ERROR] 노선에 등록되어있지 않는 역입니다. 다시 입력해주세요.`
- **노선 조회**
- 노선 이름만 가지고 있는 배열 생성(조회하면 배열의 원소를 하나씩 보여주기)

#### 4. 구간 관리

- **구간 등록**
- 구간 등록하기 `[INFO] 구간이 등록되었습니다.`
- 노선 이름
- 존재하는 노선 중에서 작성해야함 `[ERROR] 존재하는 노선 중에서 입력해주세요.`
- 역 이름
- 존재하는 역 중에서 작성해야함 `[ERROR] 존재하는 역 중에서 입력해주세요.`
- 순서
- 종점 역 사이에 있어야함 `[ERROR] 종점역 사이에 존재해야합니다.`
- **구간 삭제**
- 지하철 노선 삭제하기 `[INFO] 지하철 노선이 삭제되었습니다.`
- 노선 리스트에 존재해야함 `[ERROR] 존재하지 않는 노선입니다.`
- 마지막에 `호선` 또는 `선`으로 끝나야함 `[ERROR] OO선 또는 O호선으로 입력해야합니다..`
- 노선에 등록되어있어야함 `[ERROR] 노선에 등록되어있지 않는 역입니다. 다시 입력해주세요.`

#### 5. 지하철 노선도 출력

- 가지고 있어야하는 배열
- 역만 가지고 있는 배열
- 노선만 가지고 있는 배열
- 노선도 -> [ [2호선, ---, 교대역, 강남역, 역삼역], [3호선, ---, ,,,], [신분당선, ---, ,,,] ]

This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed.
13 changes: 13 additions & 0 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
package subway;

import subway.domain.line.Line;
import subway.domain.station.Station;

import java.util.Scanner;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
System.out.println("start");
System.out.println("startStation");
Station startStation = Station.getStation(scanner.nextLine());
System.out.println("endStation");
Station endStation = Station.getStation(scanner.nextLine());
System.out.println(Line.getLine("2호", startStation, endStation));
// System.out.println(MainMenuInputView.getMainMenuCommand(scanner));
// List<Station> stationList = StationRepository.save(Station.getStation(scanner.nextLine()));
// System.out.println(StationResponseDto.StationEntityToList(stationList));
// System.out.println(StationService.save(new StationRequestDto(scanner.nextLine())));
}
}
31 changes: 31 additions & 0 deletions src/main/java/subway/DummyData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package subway;

import subway.domain.line.Line;
import subway.domain.line.LineRepository;
import subway.domain.station.Station;
import subway.domain.station.StationRepository;

import java.util.Arrays;

public class DummyData {

public static void saveDummyData() {
Station station1 = Station.getStation("교대역");
Station station2 = Station.getStation("강남역");
Station station3 = Station.getStation("역삼역");
Station station4 = Station.getStation("남부터미널역");
Station station5 = Station.getStation("양재역");
Station station6 = Station.getStation("양재시민의숲역");
Station station7 = Station.getStation("매봉역");

StationRepository.saveDummyData(
Arrays.asList(station1, station2, station3, station4, station5, station6, station7)
);

Line line1 = Line.getLine("2호선", station1, station2);
Line line2 = Line.getLine("3호선", station1, station4);
Line line3 = Line.getLine("신분당선", station2, station5);

LineRepository.saveDummyData(Arrays.asList(line1, line2, line3));
}
}
15 changes: 0 additions & 15 deletions src/main/java/subway/domain/Line.java

This file was deleted.

22 changes: 0 additions & 22 deletions src/main/java/subway/domain/LineRepository.java

This file was deleted.

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

This file was deleted.

22 changes: 0 additions & 22 deletions src/main/java/subway/domain/StationRepository.java

This file was deleted.

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

import subway.domain.station.Station;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

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

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

public String getName() {
return name;
}

public static Line getLine(String lineName, Station startStation, Station endStation) {
if (LineCheck.checkLineNameLength(lineName) && LineCheck.checkLineNameEndPoint(lineName)) {
}
return new Line(lineName, Arrays.asList(startStation, endStation));
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Line line = (Line) o;
return Objects.equals(name, line.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}

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

public void insertSection(int index, Station station) {
stationList.add(index, station);
}
}
23 changes: 23 additions & 0 deletions src/main/java/subway/domain/line/LineCheck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package subway.domain.line;

public class LineCheck {

private static final int MIN_LINE_NAME_LENGTH = 2;

private static final String LINE_LENGTH_ERROR_MESSAGE = "[ERROR] 노선 이름은 2글자 이상 입력해야합니다.";
public static final String LINE_END_POINT_ERROR_MESSAGE = "[ERROR] 노선이름은 OO선 또는 O호선으로 끝나야 합니다.";

public static boolean checkLineNameLength(String lineName) {
if (lineName.length() < MIN_LINE_NAME_LENGTH) {
throw new IllegalArgumentException(LINE_LENGTH_ERROR_MESSAGE);
}
return true;
}

public static boolean checkLineNameEndPoint(String lineName) {
if (!lineName.endsWith("선") || !lineName.endsWith("호선")) {
throw new IllegalArgumentException(LINE_END_POINT_ERROR_MESSAGE);
}
return true;
}
}
58 changes: 58 additions & 0 deletions src/main/java/subway/domain/line/LineRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package subway.domain.line;

import subway.domain.station.Station;
import subway.domain.station.StationRepository;

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 final String LINE_DUPLICATE_ERROR_MESSAGE = "[ERROR] 이미 등록된 노선 이름입니다. 중복되지 않는 역이름을 입력해주세요.";
public static final String LINE_CANNOT_FIND_ERROR_MESSAGE = "[ERROR] 존재하지 않는 노선입니다.";

public static List<Line> lines() {
return Collections.unmodifiableList(lines);
}

public static List<Line> save(Line lineName) {
if (lines.contains(lineName)) {
throw new IllegalArgumentException(LINE_DUPLICATE_ERROR_MESSAGE);
}
lines.add(lineName);
return lines;
}

// 구간 입력할 때 존재하는 노선인지 확인
public static Line findLineName(String lineName) {
return lines.stream().filter(line -> line.getName().equals(lineName))
.findAny().orElseThrow(() -> new IllegalArgumentException(LINE_CANNOT_FIND_ERROR_MESSAGE));
}

// station이 line에 포함되어있는지 확인
public static boolean contains(Station station) {
return lines.stream().anyMatch(line -> line.contains(station));
}

// 노선 삭제
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}

// 구간에 station추가
public static void insertSection(String lineName, int index, Station station) {
Line line = findLineName(lineName);
line.insertSection(index, station);
}

public static void saveDummyData(List<Line> lines) {
lines.forEach(LineRepository::save);
}

// 구간에 station제거
// public static
}
Loading