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 all 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.

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

import menu.controller.RecommendationController;
import menu.view.InputView;
import menu.view.OutputView;

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

recommendationController.run();
}
}
70 changes: 70 additions & 0 deletions src/main/java/menu/controller/RecommendationController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package menu.controller;

import java.util.ArrayList;
import java.util.List;
import menu.domain.Categories;
import menu.domain.Coach;
import menu.domain.Coachs;
import menu.domain.InedibleMenu;
import menu.domain.RecommendMenu;
import menu.domain.Recommendation;
import menu.service.RecommendationService;
import menu.view.InputView;
import menu.view.OutputView;

public class RecommendationController {
private final InputView inputView;
private final OutputView outputView;
private RecommendationService recommendationService;
private Recommendation recommendation;

public RecommendationController(InputView inputView,
OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

public void run() {
outputView.printStart();
Coachs coachs = createCoachs();
for (Coach coach : coachs.getCoachs()) {
createInedible(coach);
}
Categories categories = new Categories();
recommendation = new Recommendation(coachs, categories);
recommendationService = new RecommendationService(recommendation);
recommendationService.recommendationMenu();
outputView.printResult(recommendation.getCategories().getCategories(),
recommendation.getCoachs().getCoachs());
}

private void createCoach(String coach, List<Coach> coaches) {
InedibleMenu inedibleMenu = new InedibleMenu();
RecommendMenu recommendMenu = new RecommendMenu();
coaches.add(new Coach(coach, inedibleMenu, recommendMenu));
}

private Coachs createCoachs() {
try {
List<Coach> coaches = new ArrayList<>();
List<String> inputCoachs = inputView.readCoachs();
for (String coach : inputCoachs) {
createCoach(coach, coaches);
}
Coachs coachs = new Coachs(coaches);
return coachs;
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return createCoachs();
}
}

private void createInedible(Coach coach) {
try {
coach.getInedibleMenu().setEdibleMenu(inputView.readInedibles(coach.getName()));
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
createInedible(coach);
}
}
}
37 changes: 37 additions & 0 deletions src/main/java/menu/domain/Categories.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package menu.domain;

import java.util.ArrayList;
import java.util.List;
import menu.util.Exception;

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

public Categories() {
}

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

public boolean isComplete() {
if (categories.size() == 5) {
return true;
}
return false;
}

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

private void validateCategory(String category) {
long count = categories.stream()
.filter(c -> c.equals(category))
.count();
if (count >= 2) {
throw new IllegalArgumentException(Exception.ERROR + Exception.OVER_CATEGORY_AMOUNT);
}
}
}
38 changes: 38 additions & 0 deletions src/main/java/menu/domain/Coach.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package menu.domain;

import menu.util.Exception;

public class Coach {
private final String name;
private InedibleMenu inedibleMenu;
private RecommendMenu recommendMenu;

public Coach(String name, InedibleMenu inedibleMenu, RecommendMenu recommendMenu) {
validateNameLength(name);
this.name = name;
this.inedibleMenu = inedibleMenu;
this.recommendMenu = recommendMenu;
}

public void addRecommendMenu(String menu) {
recommendMenu.addRecommendMenu(menu);
}

public String getName() {
return name;
}

public RecommendMenu getRecommendMenu() {
return recommendMenu;
}

public InedibleMenu getInedibleMenu() {
return inedibleMenu;
}

private void validateNameLength(String name) {
if (name.length() < 2 || name.length() > 4) {
throw new IllegalArgumentException(Exception.ERROR + Exception.COACH_NAME_LENGTH);
}
}
}
57 changes: 57 additions & 0 deletions src/main/java/menu/domain/Coachs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package menu.domain;

import java.util.ArrayList;
import java.util.List;
import menu.util.Exception;

public class Coachs {
private List<Coach> coachs;

public Coachs(List<Coach> coachs) {
validateCoachAmount(coachs);
this.coachs = coachs;
}

public void recommendMenuOneCycle(String category) {
for (Coach coach : coachs) {
recommendMenu(coach, category);
}
}

public List<String> getCoachNames() {
List<String> coachNames = new ArrayList<>();
for (Coach coach : coachs) {
coachNames.add(coach.getName());
}
return coachNames;
}

public List<Coach> getCoachs() {
return coachs;
}

private void recommendMenu(Coach coach, String category) {
try {
String menu = Menu.recommendationMenu(category);
validateMenuIsInedible(coach, menu);
coach.addRecommendMenu(menu);
} catch (IllegalArgumentException e) {
recommendMenu(coach, category);
}
}

private void validateMenuIsInedible(Coach coach, String menu) {
if (coach.getInedibleMenu().isEdibleMenu(menu)) {
throw new IllegalArgumentException(Exception.ERROR);
}
}

private void validateCoachAmount(List<Coach> coachs) {
if (coachs.size() < 2) {
throw new IllegalArgumentException(Exception.ERROR + Exception.COACH_AMOUNT_UNDER_RANGE);
}
if (coachs.size() > 5) {
throw new IllegalArgumentException(Exception.ERROR + Exception.COACH_AMOUNT_OVER_RANGE);
}
}
}
41 changes: 41 additions & 0 deletions src/main/java/menu/domain/InedibleMenu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package menu.domain;

import java.util.ArrayList;
import java.util.List;
import menu.util.Exception;

public class InedibleMenu {
private List<String> menus = new ArrayList<>();

public InedibleMenu() {
}

public boolean isEdibleMenu(String menu) {
if (menus.contains(menu)) {
return true;
}
return false;
}

public void setEdibleMenu(List<String> menus) {
if (!(menus.size() == 1 && menus.get(0).equals(""))) {
validateMenuAmount(menus);
validateInedibleMenu(menus);
}
this.menus = menus;
}

private void validateMenuAmount(List<String> menus) {
if (menus.size() > 2) {
throw new IllegalArgumentException(Exception.ERROR + Exception.INEDIBLE_MENU_AMOUNT_OVER_RANGE);
}
}

private void validateInedibleMenu(List<String> menus) {
for (String menu : menus) {
if (!Menu.isInMenu(menu)) {
throw new IllegalArgumentException(Exception.ERROR + Exception.NOT_EXIST_MENU);
}
}
}
}
48 changes: 48 additions & 0 deletions src/main/java/menu/domain/Menu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package menu.domain;

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

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

private int category;
private List<String> menus;

Menu(int category, List<String> menus) {
this.category = category;
this.menus = menus;
}

public static String recommendationMenu(String category) {
return Randoms.shuffle(Menu.valueOf(category).menus).get(0);
}

public static boolean isInMenu(String inputMenu) {
List<String> allMenu = new ArrayList<>();
for (Menu value : Menu.values()) {
for (String menu : value.menus) {
allMenu.add(menu);
}
}
if (allMenu.contains(inputMenu)) {
return true;
}
return false;
}

public static String randomCategory() {
int number = Randoms.pickNumberInRange(1, 5);
for (Menu value : Menu.values()) {
if (value.category == number) {
return value.name();
}
}
return null;
}
}
27 changes: 27 additions & 0 deletions src/main/java/menu/domain/RecommendMenu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package menu.domain;

import java.util.ArrayList;
import java.util.List;
import menu.util.Exception;

public class RecommendMenu {
private List<String> menus = new ArrayList<>();

public RecommendMenu() {
}

public void addRecommendMenu(String menu) {
validateRecommendMenu(menu);
menus.add(menu);
}

public List<String> getMenus() {
return menus;
}

private void validateRecommendMenu(String menu) {
if (menus.contains(menu)) {
throw new IllegalArgumentException(Exception.ERROR + Exception.DUPLICATE_RECOMMEND_MENU);
}
}
}
Loading