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

[ 지하철 노선도 미션 ] 박민영 미션 제출합니다. #116

Open
wants to merge 49 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
fdff313
docs : 기능 구현 목록 작성
Gomding Dec 13, 2020
4163bb0
feat : 역을 조회하는 기능 추가
Gomding Dec 14, 2020
2cbd92d
feat : 역을 등록할 때 중복검사하는 기능 추가
Gomding Dec 14, 2020
b15f848
feat : 역을 등록할 때 역이름이 2자리 이상인지 검사하는 기능 추가
Gomding Dec 14, 2020
a1cbfc5
update(readme) : 구간 추가 기능에 예외사항 추가
Gomding Dec 14, 2020
e341696
feat : 노선을 등록할 때 상행선 하행선 등록을 위해 노선안에 지하철 역 리스트를 추가
Gomding Dec 14, 2020
ce114a4
feat : 노선을 추가할 때 중복된 이름이 있는지 검사하는 기능 추가
Gomding Dec 14, 2020
b3368f6
feat : 노선을 추가할 때 2글자 이상인지 검사하는 기능 추가
Gomding Dec 14, 2020
9d63ef7
update(readme) : 역, 노선관련 예외사항 추가
Gomding Dec 14, 2020
1331c57
feat : 역이나 노선을 조회할 때 존재하는 역이나 노선이 없다면 메시지로 알려주는 기능 추가
Gomding Dec 14, 2020
a24525f
feat : 지하철 노선에 구간을 추가하는 기능 구현
Gomding Dec 14, 2020
8f418c5
update(README) : 구간 추가 예외기능 수정
Gomding Dec 14, 2020
eb32b8f
feat : 지하철 노선에 구간을 추가할 때 예외사항 추가
Gomding Dec 14, 2020
706e473
update(README) : 구간 삭제 기능 예외사항 추가
Gomding Dec 14, 2020
6240409
feat : 지하철 노선에 등록된 역을 제거하는 기능 추가(구간 삭제 기능)
Gomding Dec 14, 2020
5773f5a
feat : 지하철 노선에 등록된 역을 제거할 때 포함된 역이 2개 이하인지 검사하는 기능 추가
Gomding Dec 14, 2020
7f3f012
update : 예외사항을 검사하는 클래스 이름 변경 Error -> Validator
Gomding Dec 14, 2020
fb5fed0
feat : 지하철 노선 프로그램을 시작하고 진행하는 SubwayMap 클래스 생성
Gomding Dec 14, 2020
05b63d2
update : 지하철 노선도 프로그램을 진행하는 클래스의 이름과 패키지 변경
Gomding Dec 14, 2020
f92a9cb
update : StationRepository 구조 수정, Line에 역 리스트를 수정
Gomding Dec 14, 2020
838bcab
feat : 메인메뉴 화면 출력 추가
Gomding Dec 14, 2020
ef38c29
feat : 역 관리 화면 메뉴 출력 기능 구현
Gomding Dec 14, 2020
124f7a4
feat : 사용자의 입력을 받아 지하철 역을 입력하는 기능 추가
Gomding Dec 15, 2020
80d1c0f
feat : 사용자의 입력을 받아 지하철 역을 삭제하는 기능 추가
Gomding Dec 15, 2020
9cf1d2c
feat : 사용자의 입력을 받아 지하철 역을 조회하는 기능 추가
Gomding Dec 15, 2020
b391c5e
feat : 노선을 관리하는 화면인 LineMenu 클래스 추가
Gomding Dec 15, 2020
b3162c1
feat : 노선을 관리하는 메뉴 출력하는 기능 추가
Gomding Dec 15, 2020
91eee26
update(README) : 노선 관련 예외 추가
Gomding Dec 15, 2020
bb5984e
feat : 노선을 추가하고 삭제하는 기능 추가
Gomding Dec 15, 2020
a3997c5
feat : 노선 목록을 조회하는 기능 추가
Gomding Dec 15, 2020
85866f2
feat : 구간 관리 화면을 담당하는 SectionMenu 클래스 생성
Gomding Dec 15, 2020
7c57f8d
feat : 구간 관리 메뉴를 출력하는 기능 구현
Gomding Dec 15, 2020
ebbfe3a
feat : 사용자의 입력을 받아 구간을 추가하는 기능을 구현
Gomding Dec 15, 2020
3a77c7c
feat : 사용자의 입력을 받아 구간을 삭제하는 기능 구현
Gomding Dec 15, 2020
3f06c53
feat : 전체 지하철 노선도를 출력하는 화면 구현
Gomding Dec 15, 2020
3cd6593
feat : 프로그램 시작 시 초기 설정을 세팅하는 기능 추가
Gomding Dec 15, 2020
63ac76f
fix : 함수명 변경 후 발생했던 예외 수정
Gomding Dec 15, 2020
f62b6d7
feat : 지하철 역 삭제시 노선에 등록 되있는 역이라면 삭제 불가능하도록 구현
Gomding Dec 15, 2020
0866fd5
test : Line, Station 테스트코드 추가
Gomding Dec 15, 2020
4de3f1b
test : LineRepositoryTest, StationRepositoryTest 테스트코드 추가
Gomding Dec 15, 2020
8be6dcb
feat : StationService 추가
Gomding Dec 15, 2020
c3a6ad1
feat : 역관련 기능에 에러 메시지 추가
Gomding Dec 15, 2020
0b47481
feat : 역 삭제 유효성 검사 추가
Gomding Dec 15, 2020
d61d189
feat : LineService 추가
Gomding Dec 15, 2020
faece9f
refactor : MainMenu 메서드 분리
Gomding Dec 15, 2020
4252c49
refactor : SubwayMapMenu 메소드 분리
Gomding Dec 15, 2020
c259f52
feat : SectionService 추가
Gomding Dec 15, 2020
bc96c51
refactor : 구간삭제 메소드 분리
Gomding Dec 15, 2020
9fca54e
fix : 구간삭제 유효성검사 메서드 오류 수정
Gomding 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
522 changes: 54 additions & 468 deletions README.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package subway;

import subway.menu.MainMenu;

import java.util.Scanner;

public class Application {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
new MainMenu(scanner).start();
}
}
52 changes: 52 additions & 0 deletions src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package subway.domain;

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

public class Line {
private String name;

Expand All @@ -12,4 +17,51 @@ public String getName() {
}

// 추가 기능 구현

private List<Station> stationList = new LinkedList<>();

public Line(String name, String upLineLastStop, String downLineLastStop) {
this.name = name;
addStation(upLineLastStop);
addStation(downLineLastStop);
}

public int size() {
return stationList.size();
}

public void addStation(String stationName) {
Station station = StationRepository.findStationByName(stationName);
stationList.add(station);
station.increaseCount();
}

public void addStation(String index, String stationName) {
Station station = StationRepository.findStationByName(stationName);
stationList.add(Integer.parseInt(index)-1, station);
station.increaseCount();
}

//TODO 삭제 여부를 알아보는 메서드와 삭제를 진행하는 메서드로 나눠야함
// 구간 삭제
public boolean removeStation(String stationName) {
return stationList.removeIf(station -> station.getName().equals(stationName));
}

public void beforeRemove() {
for (Station station : stationList()) {
station.decreaseCount();
}
}

public void deleteLine() {
beforeRemove();
LineRepository.deleteLineByName(this.name);
}

public List<Station> stationList() {
return Collections.unmodifiableList(stationList);
}


}
9 changes: 9 additions & 0 deletions src/main/java/subway/domain/LineRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,13 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}

public static Line findLineByName(String lineName) {
for (Line line : lines) {
if (line.getName().equals(lineName)) {
return line;
}
}
return null;
}
}
28 changes: 28 additions & 0 deletions src/main/java/subway/domain/Station.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,32 @@ public String getName() {
}

// 추가 기능 구현

private int count = 0;

public void increaseCount() {
this.count++;
}

public void decreaseCount() {
this.count--;
}

public int getCount() {
return this.count;
}

public boolean isRemovable() {
if (this.count == 0) {
return true;
}
return false;
}

public boolean delete() {
if (isRemovable()) {
return StationRepository.deleteStation(this.name);
}
return false;
}
}
15 changes: 11 additions & 4 deletions src/main/java/subway/domain/StationRepository.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package subway.domain;

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

public class StationRepository {
private static final List<Station> stations = new ArrayList<>();
Expand All @@ -19,4 +16,14 @@ public static void addStation(Station station) {
public static boolean deleteStation(String name) {
return stations.removeIf(station -> Objects.equals(station.getName(), name));
}

public static Station findStationByName(String name) {
for (Station station : stations()) {
if (station.getName().equals(name)) {
return station;
}
}
return null;
}

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

import subway.domain.Line;
import subway.service.LineService;
import subway.util.LineValidator;
import subway.util.StationValidator;

import java.util.List;
import java.util.Scanner;

public class LineMenu {
private static final String MENU_TITLE = "## 노선 관리 화면";
private static final String MENU1 = "1. 노선 등록";
private static final String MENU2 = "2. 노선 삭제";
private static final String MENU3 = "3. 노선 조회";
private static final String BACK = "B. 돌아가기";
private static final String CHOICE_MESSAGE = "## 원하는 기능을 선택하세요.";

private Scanner scanner;

public LineMenu(Scanner scanner) {
this.scanner = scanner;
}

public void startLineMenu() {
selectLineMenu();
}

public void selectLineMenu() {
while (true) {
printLineMenu();
String input = scanner.nextLine();
lineMenu(input);
if (input.equals("B")) {
break;
}
System.out.println();
}
}

private void lineMenu(String input) {
if (input.equals("1")) {
addLineMenu();
}
if (input.equals("2")) {
deleteLineMenu();
}
if (input.equals("3")) {
printLineList();
}
}

private void addLineMenu() {
System.out.println("\n## 등록할 노선 이름을 입력하세요.");
String lineName = scanner.nextLine();
addLineName(lineName);
}

private void addLineName(String lineName) {
if (LineValidator.checkValidLineName(lineName)) {
addUpLineLastStop(lineName);
}
}

private void addUpLineLastStop(String lineName) {
System.out.println("\n## 등록할 상행 종점역 이름을 입력하세요.");
String upLineLastStop = scanner.nextLine();
if (StationValidator.haveStationName(upLineLastStop)) {
addDownLineLastStop(lineName, upLineLastStop);
}
}

private void addDownLineLastStop(String lineName, String upLineLastStop) {
System.out.println("\n## 등록할 하행 종점역 이름을 입력하세요.");
String downLineLastStop = scanner.nextLine();
if (LineValidator.checkValidDownLastStop(upLineLastStop, downLineLastStop)) {
LineService.addLine(lineName, upLineLastStop, downLineLastStop);
System.out.println("\n[ INFO ] 지하철 노선이 등록되었습니다.");
}
}

private void deleteLineMenu(){
System.out.println("## 삭제할 노선 이름을 입력하세요.");
String lineName = scanner.nextLine();
if (LineValidator.haveLineName(lineName)) {
LineService.deleteLine(lineName);
System.out.println("[ INFO ] 지하철 노선이 삭제되었습니다.");
}
}

private void printLineList() {
System.out.println("## 노선 목록");
List<Line> lines = LineService.getLineList();
if (lines.size() == 0) {
System.out.println("존재하는 노선이 없습니다.");
return;
}
for (Line line : lines) {
System.out.println("[ INFO ] " + line.getName());
}
}

//TODO 출력 기능을 다른곳에 모으기
public void printLineMenu() {
StringBuilder sb = new StringBuilder();
sb.append(MENU_TITLE).append("\n")
.append(MENU1).append("\n")
.append(MENU2).append("\n")
.append(MENU3).append("\n")
.append(BACK).append("\n\n")
.append(CHOICE_MESSAGE);
System.out.println(sb);
}
}
67 changes: 67 additions & 0 deletions src/main/java/subway/menu/MainMenu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package subway.menu;

import subway.util.DefaultSetting;

import java.util.Scanner;

public class MainMenu {

private static final String MAIN_TITLE = "## 메인 화면";
private static final String MENU1 = "1. 역 관리";
private static final String MENU2 = "2. 노선 관리";
private static final String MENU3 = "3. 구간 관리";
private static final String MENU4 = "4. 지하철 노선도 출력";
private static final String QUIT = "Q. 종료";
private static final String CHOICE_MESSAGE = "## 원하는 기능을 선택하세요.";

private Scanner scanner;

public MainMenu(Scanner scanner) {
this.scanner = scanner;
}

//TODO 메뉴번호 이외의 입력을 받았을 때 예외사항 출력 구현해야함
public void start() {
new DefaultSetting().defaultSetting();
selectMainMenu();
}

private void selectMainMenu() {
while (true) {
printMainMenu();
String input = scanner.nextLine();
System.out.println();
mainMenu(input);
if (input.equals("Q")) {
break;
}
}
}

private void mainMenu(String input) {
if (input.equals("1")) {
new StationMenu(scanner).startStationMenu();
}
if (input.equals("2")) {
new LineMenu(scanner).startLineMenu();
}
if (input.equals("3")) {
new SectionMenu(scanner).startSectionMenu();
}
if (input.equals("4")) {
new SubwayMapMenu().printSubwayMap();
}
}

private void printMainMenu() {
StringBuilder sb = new StringBuilder();
sb.append(MAIN_TITLE).append("\n")
.append(MENU1).append("\n")
.append(MENU2).append("\n")
.append(MENU3).append("\n")
.append(MENU4).append("\n")
.append(QUIT).append("\n\n")
.append(CHOICE_MESSAGE);
System.out.println(sb);
}
}
Loading