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

Code Review #1916

Open
wants to merge 78 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
513b727
Update README.md
slay1379 Oct 15, 2024
bacfd04
[feat]: 문자열 입력 기능 구현
slay1379 Oct 15, 2024
a8871e1
Merge branch 'main' of https://github.com/slay1379/java-calculator-7
slay1379 Oct 15, 2024
3a66279
[feat]: 계산기 엔티티 생성
slay1379 Oct 15, 2024
2955897
[feat]: Calculator 엔티티에 구분자 추가 기능 구현
slay1379 Oct 15, 2024
9eae8f1
[feat]: 계산기 엔티티에 숫자 추가 메소드 구현
slay1379 Oct 15, 2024
65e1541
[feat]: 계산기 엔티티 구분자 반환 메소드 구현
slay1379 Oct 15, 2024
7ac7534
[feat]: 계산기 엔티티 숫자 리스트 반환 메소드 구현
slay1379 Oct 15, 2024
d72d8c6
[feat]: 구분자 커스텀 구분하는 메소드 구현
slay1379 Oct 15, 2024
91a82e0
[feat]: 계산기 모든 숫자 더하는 메소드 구현
slay1379 Oct 15, 2024
d0efb04
[feat]: 결과 출력 기능 구현
slay1379 Oct 15, 2024
4d795d9
[feat]: 컨트롤러 기능 구현
slay1379 Oct 15, 2024
dfa499f
[refactor]: 생성자 없어서 오류 나는 부분 리팩토링
slay1379 Oct 15, 2024
27607b6
[rafactor]: 예외처리 로직 코드 시스템 종료하도록 리팩토링
slay1379 Oct 16, 2024
2bcf2ea
[refactor]: 커스텀 구분자 예외처리 조건 추가
slay1379 Oct 16, 2024
21afeba
[refactor]: 구분자 조건문 수정
slay1379 Oct 16, 2024
e3b97f4
[refactor]: 문자열이 숫자인지 구분하는 메소드 구현
slay1379 Oct 16, 2024
1af8196
[docs]: 구현해야 할 기능 목록 추가
slay1379 Oct 16, 2024
d541208
[refactor]: 잘못된 입력 검사 로직 메소드로 구현
slay1379 Oct 16, 2024
8fa22cd
[refactor]: 구분자 추출 로직 메소드로 구현
slay1379 Oct 16, 2024
560de3f
[refactor]: 구분자인지 구분하는 로직 메소드로 구현
slay1379 Oct 16, 2024
90a1a4a
[feat]: 커스텀 구분자 메소드 테스트 기능 구현
slay1379 Oct 16, 2024
a3e310d
[refactor]: 잘못된 입력 메소드 조건 분리 리팩토링
slay1379 Oct 16, 2024
fa305ed
[feat]: 구분자 추출하는 테스트 메소드 구현
slay1379 Oct 16, 2024
711a0e0
[feat]: divideSeparator 메소드 음수 구분 로직 구현
slay1379 Oct 16, 2024
30d730e
[refator]: 음수 처리 로직 삭제
slay1379 Oct 16, 2024
dcd707c
[refactor]: 커스텀 구분자 추출하는 메소드 수정
slay1379 Oct 16, 2024
29cbbbe
[refactor]: 생성자 주입 코드 리팩토링
slay1379 Oct 16, 2024
8fd2115
[refactor]: 문자열 구분자를 기준으로 구분하는 로직 수정
slay1379 Oct 17, 2024
418b3a4
[docs]: 생각해봐야 할 것 추가
slay1379 Oct 17, 2024
d1164b8
[refactor]: 문자열 구분자를 기준으로 구분하는 로직 수정
slay1379 Oct 17, 2024
d28dadf
[refactor]: 문자열 구분자를 기준으로 구분하는 로직 수정
slay1379 Oct 17, 2024
13c4863
[refactor]: 커스텀구분자 정규식으로 코드 리팩토링
slay1379 Oct 20, 2024
e31a7e0
[refactor]: 구분자 구분하는 로직 수정
slay1379 Oct 20, 2024
1336d82
[feat]: test 코드 작성
slay1379 Oct 20, 2024
36ed8c2
전체 푸쉬
slay1379 Dec 10, 2024
bdab76b
refactor(): 추천메뉴를 못먹는메뉴에 추가하던 로직 수정
slay1379 Dec 10, 2024
4cf7998
feat(inedible): 못 먹는 메뉴가 실제 메뉴인지 검증하는 기능 추가
slay1379 Dec 11, 2024
dab2848
feat(Coach): 코치 객체 생성
slay1379 Dec 12, 2024
a8d33b1
feat(Exception): 오류 메세지 관리하는 클래스 생성
slay1379 Dec 12, 2024
f5c568c
feat(Coach): 코치 이름 길이 검증하는 기능 추가
slay1379 Dec 12, 2024
f748023
feat(InputView): 코치 이름 입력받는 기능 추가
slay1379 Dec 12, 2024
4443095
feat(InputView): 못먹는 메뉴 입력받는 기능 추가
slay1379 Dec 12, 2024
6839f41
feat(Exception): 코치 수 오류 메세지 추가
slay1379 Dec 12, 2024
98fb823
feat(Coachs): 코치 수 검증하는 기능 추가
slay1379 Dec 12, 2024
68d6133
feat(InedibleMenu): 못먹는 메뉴 객체 생성 및 개수 검증기능 추가
slay1379 Dec 12, 2024
670f786
feat(Exception): 추천 메뉴 중복 에러메세지 추가
slay1379 Dec 12, 2024
a43a353
feat(RecommendMenu): 추천메뉴 중복 검증하는 기능 추가
slay1379 Dec 12, 2024
4499059
feat(RecommendMenu): 추천메뉴 추가하는 기능 추가
slay1379 Dec 12, 2024
7cf8f46
refactor(Coach): 자료구조 수정
slay1379 Dec 12, 2024
932c7e5
feat(Menu): 랜덤으로 카테고리 선정하는 기능 추가
slay1379 Dec 12, 2024
d15aa50
feat(Menu): 랜덤으로 메뉴 추천하는 기능 추가
slay1379 Dec 12, 2024
6e53252
feat(Menu): 입력한 메뉴가 실제 메뉴에 있는지 확인하는 기능 추가
slay1379 Dec 12, 2024
6a58b65
feat(Exception): 존재하지 않는 메뉴 오류메세지 추가
slay1379 Dec 12, 2024
6f8a72d
feat(InedibleMenu): 입력 받은 못 먹는 메뉴가 실제 메뉴인지 검증하는 기능 추가
slay1379 Dec 12, 2024
f70356f
feat(InedibleMenu): 입력 받은 못 먹는 메뉴가 실제 메뉴인지 검증하는 기능 추가
slay1379 Dec 12, 2024
ef51dec
fix(RecommendMenu): 메소드 오타 수정
slay1379 Dec 12, 2024
a956788
feat(Categories): 카테고리 객체 생성 및 카테고리 추가 기능 추가
slay1379 Dec 12, 2024
9f47ef8
feat(Exception): 카테고리 추천 횟수 넘어갔을 때 오류메세지 추가
slay1379 Dec 12, 2024
27f289f
feat(Categories): 카테고리 추천 2회 이상인지 검증하는 기능 추가
slay1379 Dec 12, 2024
f4e3318
feat(InedibleMenu): 못 먹는 메뉴가 0개일때 경우 추가
slay1379 Dec 12, 2024
a3bcb0b
feat(Recommendation): 카테고리 추가 기능 추가
slay1379 Dec 12, 2024
f2b59f6
feat(Coach): 추천메뉴 추가 기능 추가
slay1379 Dec 12, 2024
c54eaed
feat(Coachs): 코치마다 추천메뉴 한 사이클 추가 기능 추가
slay1379 Dec 12, 2024
9599abd
refactor(Menu): 랜덤으로 카테고리 선정 기능 따로 분리
slay1379 Dec 12, 2024
72acbca
refactor(Coachs): 랜덤으로 카테고리 선정 기능 따로 분리
slay1379 Dec 12, 2024
59d8a96
refactor(Coachs): 랜덤으로 카테고리 선정 기능 따로 분리
slay1379 Dec 12, 2024
f8d3c75
feat(Recommendation): 카테고리 추가, 추천메뉴 추가 기능 추가
slay1379 Dec 12, 2024
eabf2b4
feat(Categories): 현재까지 추천된 카테고리의 수가 5개인지의 여부를 반환하는 기능 추가
slay1379 Dec 12, 2024
6d86583
feat(Recommendation): 추천이 끝났는지 여부를 반환하는 기능 추가
slay1379 Dec 12, 2024
2f73cc5
feat(RecommendationService): 한 사이클 추천 기능, 카테고리 랜덤 선정, 모든 추천사이클 순환 기능 추가
slay1379 Dec 12, 2024
068fda3
feat(OutputView): 시작 메세지 출력 기능 추가
slay1379 Dec 12, 2024
c85bccb
feat(OutputView): 메뉴 추천 결과 출력 기능 추가
slay1379 Dec 12, 2024
5506941
feat(Categories): 카테고리 반환 기능 추가
slay1379 Dec 12, 2024
647fc1e
feat(Categories): 카테고리 반환 기능 추가
slay1379 Dec 12, 2024
c365732
feat(): 코치 반환 기능 추가
slay1379 Dec 12, 2024
9b8a075
feat(): 반환기능들 추가
slay1379 Dec 12, 2024
d76546f
refactor(): 예외처리 수정
slay1379 Dec 12, 2024
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
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
# java-calculator-precourse
# java-calculator-precourse

구현 할 기능 목록
1. 문자열을 입력받는 기능
2. 문자열을 구분자를 기준으로 분리하는 기능
3. 커스텀 구분자를 지정하는 기능
4. 잘못된 값을 입력할 경우 예외처리하는 기능
5. 숫자를 더하는 기능
6. 결과를 출력하는 기능


초기 구현 후 리팩토링 할 목록
1. 문자열을 구분자를 기준으로 분리하는 기능 -> 기능들을 더 메소드 단위로 나누기


예외처리
1. 잘못된 입력
Comment on lines +1 to +17

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

README.md에 어떤 기능을 구현할 지 미리 정리해봅시다!

4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,12 @@ repositories {

dependencies {
implementation 'com.github.woowacourse-projects:mission-utils:1.2.0'
testImplementation 'org.mockito:mockito-core:4.11.0'
testImplementation 'org.mockito:mockito-inline:4.11.0'

}


test {
useJUnitPlatform()
}
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
}
rootProject.name = 'java-calculator'
rootProject.name = 'java-menu'
7 changes: 0 additions & 7 deletions src/main/java/calculator/Application.java

This file was deleted.

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

import menu.controller.RecommendController;
import menu.service.RecommendService;
import menu.view.InputView;
import menu.view.OutputView;

public class Application {
public static void main(String[] args) {
RecommendService recommendService = new RecommendService();
InputView inputView = new InputView();
OutputView outputView = new OutputView();

RecommendController recommendController = new RecommendController(recommendService, inputView, outputView);
recommendController.run();
}
}
43 changes: 43 additions & 0 deletions src/main/java/menu/controller/RecommendController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package menu.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import menu.domain.Recommend;
import menu.service.RecommendService;
import menu.view.InputView;
import menu.view.OutputView;

public class RecommendController {
private RecommendService recommendService;
private InputView inputView;
private OutputView outputView;
private Recommend recommend;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

final로 선언하지 않은 이유가 있나요?


public RecommendController(RecommendService recommendService,
InputView inputView,
OutputView outputView) {
this.recommendService = recommendService;
this.inputView = inputView;
this.outputView = outputView;
}

public void run() {
outputView.printStart();
List<String> coachs = inputView.readCoach();
Map<String, List<String>> inedibles = new HashMap<>();
Map<String, List<String>> recommendMenus = new HashMap<>();
for (String coach : coachs) {
List<String> inedible = inputView.readInedible(coach);
List<String> recommendMenu = new ArrayList<>();
inedibles.put(coach, inedible);
recommendMenus.put(coach, recommendMenu);
}
recommend = new Recommend(coachs, inedibles, recommendMenus);
while (recommend.recommendAmount() < 5) {
recommendService.recommendMenu(recommend);
}
outputView.printResult(recommend);
}
}
47 changes: 47 additions & 0 deletions src/main/java/menu/domain/Category.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package menu.domain;

import camp.nextstep.edu.missionutils.Randoms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import menu.util.Exception;

public enum Category {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

도메인의 특성을 생각했을 때 저는 이 enum클래스 명을 menu라고 설정하는게 좀 더 적절하다고 생각해요. 어떻게 생각하시나요?

일식(1, List.of("규동", "우동", "미소시루", "스시", "가츠동", "오니기리", "하이라이스", "라멘", "오코노미야끼")),
한식(2, List.of("김밥", "김치찌개", "쌈밥", "된장찌개", "비빔밥", "칼국수", "불고기", "떡볶이", "제육볶음")),
중식(3, List.of("깐풍기", "볶음면", "동파육", "짜장면", "짬뽕", "마파두부", "탕수육", "토마토 달걀볶음", "고추잡채")),
아시안(4, List.of("팟타이", "카오 팟", "나시고렝", "파인애플 볶음밥", "쌀국수", "똠얌꿍", "반미", "월남쌈", "분짜")),
양식(5, List.of("라자냐", "그라탱", "뇨끼", "끼슈", "프렌치 토스트", "바게트", "스파게티", "피자", "파니니"));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum의 이름을 한국어로 한다면 단점으론 무엇이 있을까요? (바꾸라는 의미는 아님)


private int categoryNumber;
private List<String> menus;

Category(int categoryNumber, List<String> menus) {
this.categoryNumber = categoryNumber;
this.menus = menus;
}

public static String recommendMenu(String category) {
List<String> menu = Category.valueOf(category).menus;
return Randoms.shuffle(menu).get(0);
}

public static String randomCategory() {
int randomNumber = Randoms.pickNumberInRange(1, 5);
return Arrays.stream(Category.values())
.filter(value -> value.categoryNumber == randomNumber)
.map(Category::name)
.findFirst()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findFirst와 findAny의 차이점은 무엇일까요?

.orElseThrow(() -> new IllegalArgumentException(Exception.ERROR + Exception.RANDOM_NUMBER));
}

public static List<String> getAllMenu() {
List<String> allMenu = new ArrayList<>();
for (Category value : values()) {
for (String menu : value.menus) {
allMenu.add(menu);
}
}
return allMenu;
}
}
50 changes: 50 additions & 0 deletions src/main/java/menu/domain/Recommend.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package menu.domain;

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

public class Recommend {
private List<String> categories = new ArrayList<>();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 위치에서 arrayList를 만드는 것과, 생성자에서 arrayList를 만드는 건 어떤 차이가 있을까요?

private List<String> coach;
private Map<String, List<String>> inedible;
private Map<String, List<String>> recommendMenu;

public Recommend(List<String> coach, Map<String, List<String>> inedible, Map<String, List<String>> recommendMenu) {
this.coach = coach;
this.inedible = inedible;
this.recommendMenu = recommendMenu;
}

public boolean isCategoryAmountOverThree(String category) {
long count = categories.stream().filter(c -> c.equals(category)).count();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
long count = categories.stream().filter(c -> c.equals(category)).count();
long count = categories.stream()
.filter(c -> c.equals(category))
.count();

if (count >= 2) {
return true;
}
return false;
}

public void addCategory(String category) {
categories.add(category);
}

public int recommendAmount() {
return categories.size();
}

public List<String> getCoach() {
return coach;
}

public Map<String, List<String>> getRecommendMenu() {
return inedible;
}

public List<String> getCategories() {
return categories;
}

public List<String> getRecommendMenu(String coach) {
return recommendMenu.get(coach);
}
}
24 changes: 24 additions & 0 deletions src/main/java/menu/service/RecommendService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package menu.service;

import menu.domain.Category;
import menu.domain.Recommend;

public class RecommendService {
public void recommendMenu(Recommend recommend) {
String category = Category.randomCategory();
if (recommend.isCategoryAmountOverThree(category)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

category amount에 대한 조건이 변경되면 메서드명도 바껴야 하겠네요. 다른 메서드명을 선택해보는건 어떨까요?

return;
}
recommend.addCategory(category);
for (String coach : recommend.getCoach()) {
String menu = null;
while (true) {
menu = Category.recommendMenu(category);
if (!recommend.getRecommendMenu().get(coach).contains(menu)) {
break;
}
}
recommend.getRecommendMenu(coach).add(menu);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

depth가 너무 깊네요. 요구사항을 확인해주세요.

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

public class Exception {
public static final String ERROR = "[ERROR]";
public static final String COACH_NAME_LENGTH = "코치의 이름은 최소 2글자, 최대 4글자여야 합니다.";
public static final String COACH_AMOUNT = "코치는 최소 2명, 최대 5명까지 식사를 함께 할 수 있습니다.";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기에 이름의 길이, 코치 명수 제한에 대한 값이 들어 있으면 비즈니스 로직이 변경될 때 여러 클래스에 변경사항을 적용해야 하겠네요. 이 곳까지 그런 책임을 주는건 부적절해보입니다. 다른 방법을 찾아봅시다!

public static final String RANDOM_NUMBER = "랜덤 숫자가 범위를 벗어났습니다.";
public static final String INVALID_INEDIBLE = "유효하지 않는 메뉴입니다.";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

왜 유효하지 않은지 알려주면 더 좋은 에러 메세지가 될 것 같아요.

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

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

public class Parser {
public static List<String> parseInputToList(String[] splitInput) {
List<String> list = new ArrayList<>();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

변수명에 자료형을 넣지말라 라는 피드백이 프리코스동안 있지 않았나요? (단순 궁금)

for (String input : splitInput) {
list.add(input);
}
return list;
}
}
7 changes: 7 additions & 0 deletions src/main/java/menu/util/Spliter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package menu.util;

public class Spliter {
public static String[] splitInput(String input) {
return input.split(",");
}
}
34 changes: 34 additions & 0 deletions src/main/java/menu/util/Validator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package menu.util;

import java.util.List;
import menu.domain.Category;

public class Validator {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validator 클래스의 내용이 Coach나 Menu 클래스 내부에 있으면 어떨까요?
검증해야 할 내용이 많아지면 validator 클래스가 길어지거나, 많이 작성해야 할 것 같아요.
객체지향을 최대한 활용해봅시다.

public static void validateCoach(String[] coachs) {
validateNameLength(coachs);
validateCoachAmount(coachs);
}

public static void validateNameLength(String[] coachs) {
for (String coach : coachs) {
if (coach.length() < 2 || coach.length() > 4) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정수값인 2와 4는 상수로 뺄 수 있을 것 같아요 👀

throw new IllegalArgumentException(Exception.ERROR + Exception.COACH_NAME_LENGTH);
}
}
}

public static void validateCoachAmount(String[] coachs) {
if (coachs.length < 2 || coachs.length > 5) {
throw new IllegalArgumentException(Exception.ERROR + Exception.COACH_AMOUNT);
}
}

public static void validateInedible(String[] inedible) {
List<String> allMenu = Category.getAllMenu();
for (String inedibleMenu : inedible) {
if (!allMenu.contains(inedibleMenu)) {
throw new IllegalArgumentException(Exception.ERROR + Exception.INVALID_INEDIBLE);
}
}
}
}
40 changes: 40 additions & 0 deletions src/main/java/menu/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package menu.view;

import camp.nextstep.edu.missionutils.Console;
import java.util.List;
import menu.util.Parser;
import menu.util.Spliter;
import menu.util.Validator;

public class InputView {
private static final String INPUT_COACH_MSG = "코치의 이름을 입력해 주세요. (, 로 구분)";
private static final String INPUT_INEDIBLE = "\n%s(이)가 못 먹는 메뉴를 입력해 주세요.\n";

public List<String> readCoach() {
while (true) {
try {
System.out.println(INPUT_COACH_MSG);
String input = Console.readLine();
String[] splitInput = Spliter.splitInput(input);
Validator.validateCoach(splitInput);
return Parser.parseInputToList(splitInput);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
while (true) {
try {
System.out.println(INPUT_COACH_MSG);
String input = Console.readLine();
String[] splitInput = Spliter.splitInput(input);
Validator.validateCoach(splitInput);
return Parser.parseInputToList(splitInput);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
try {
System.out.println(INPUT_COACH_MSG);
String input = Console.readLine();
String[] splitInput = Spliter.splitInput(input);
Validator.validateCoach(splitInput);
return Parser.parseInputToList(splitInput);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return readCoach();
}

while(true)를 사용하지 않고도 재입력 로직을 구현할 수 있습니다.

저는 보통 관련 로직을 컨트롤러에 작성하는 편이에요. view에 있는 입력 로직은 가능하면 1회만 가능하도록 구현하고, 컨트롤러에서 재입력 로직을 구현하려고 합니다. 왜냐하면 저는 재입력이라는 행위 자체도 비즈니스 로직이라고 생각하기 때문이에요.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가로 , 기호 옆에 공백이 입력되는 경우, 공백도 같이 이름에 입력이 되네요. trim을 해주는건 어떨까요?

}

public List<String> readInedible(String name) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

먹지 못하는 메뉴가 없으면 빈 값을 입력하게 되는데, 지금은 빈 값을 입력할 수 없네요.

while (true) {
try {
System.out.printf(INPUT_INEDIBLE, name);
String input = Console.readLine();
String[] splitInput = Spliter.splitInput(input);
Validator.validateInedible(splitInput);
return Parser.parseInputToList(splitInput);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}
}
37 changes: 37 additions & 0 deletions src/main/java/menu/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package menu.view;

import java.util.List;
import menu.domain.Recommend;

public class OutputView {
private static final String START_MSG = "점심 메뉴 추천을 시작합니다.\n";
private static final String RECOMMEND_RESULT = "메뉴 추천 결과입니다.\n";
private static final String YOIL = "[ 구분 | 월요일 | 화요일 | 수요일 | 목요일 | 금요일 ]";
private static final String CATEGORY_RESULT = "[ 카테고리 | %s | %s | %s | %s | %s ]\n";
private static final String COACH_RESULT = "[ %s | %s | %s | %s | %s | %s ]\n";
private static final String COMPLETE_RECOMMENDATION = "\n추천을 완료했습니다.";

public void printStart() {
System.out.println(START_MSG);
}

public void printResult(Recommend recommend) {
System.out.println(RECOMMEND_RESULT);
System.out.println(YOIL);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YOIL 말고 다른건 없을까요 ㅋㅋㅋ

printCategory(recommend);
for (String coach : recommend.getCoach()) {
printMenu(recommend, coach);
}
System.out.println(COMPLETE_RECOMMENDATION);
}

private void printCategory(Recommend recommend) {
System.out.printf(CATEGORY_RESULT, recommend.getCategories().get(0), recommend.getCategories().get(1),
recommend.getCategories().get(2), recommend.getCategories().get(3), recommend.getCategories().get(4));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0, 1, 2, 3.... 같이 직접 정수 값을 넣기보다, 각 정수값이 어떤걸 의미하는지 알려주면 더 좋을 것 같습니다.

}

private void printMenu(Recommend recommend, String coach) {
List<String> menus = recommend.getRecommendMenu(coach);
System.out.printf(COACH_RESULT, coach, menus.get(0), menus.get(1), menus.get(2), menus.get(3), menus.get(4));
}
}
Loading