#18 oop : order process

This commit is contained in:
haerong22
2022-08-30 03:09:19 +09:00
parent f0570d855a
commit d349f6b340
10 changed files with 249 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
package org.example.order;
import java.util.Objects;
public class Cook {
private final String name;
private final int price;
public Cook(String name, int price) {
this.name = name;
this.price = price;
}
public Cook(MenuItem menuItem) {
this.name = menuItem.getName();
this.price = menuItem.getPrice();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Cook)) return false;
Cook cook = (Cook) o;
return price == cook.price && Objects.equals(name, cook.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price);
}
}

View File

@@ -0,0 +1,7 @@
package org.example.order;
public class Cooking {
public Cook makeCook(MenuItem menuItem) {
return new Cook(menuItem);
}
}

View File

@@ -0,0 +1,10 @@
package org.example.order;
public class Customer {
public void order(String name, Menu menu, Cooking cooking) {
MenuItem menuItem = menu.choose(name);
Cook cook = cooking.makeCook(menuItem);
}
}

View File

@@ -0,0 +1,18 @@
package org.example.order;
import java.util.List;
public class Menu {
private final List<MenuItem> menuItems;
public Menu(List<MenuItem> menuItems) {
this.menuItems = menuItems;
}
public MenuItem choose(String name) {
return this.menuItems.stream()
.filter(menuItem -> menuItem.matches(name))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("잘못된 메뉴 이름입니다."));
}
}

View File

@@ -0,0 +1,39 @@
package org.example.order;
import java.util.Objects;
public class MenuItem {
private final String name;
private final int price;
public MenuItem(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
public boolean matches(String name) {
return this.name.equals(name);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MenuItem)) return false;
MenuItem menuItem = (MenuItem) o;
return price == menuItem.price && Objects.equals(name, menuItem.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price);
}
}

View File

@@ -0,0 +1,16 @@
package org.example.order;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThatCode;
public class CookTest {
@DisplayName("요리를 생성한다.")
@Test
void createTest() {
assertThatCode(() -> new Cook("만두", 5000))
.doesNotThrowAnyException();
}
}

View File

@@ -0,0 +1,22 @@
package org.example.order;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
public class CookingTest {
@DisplayName("메뉴에 해당하는 음식을 만든다.")
@Test
void makeCookTest() {
Cooking cooking = new Cooking();
MenuItem menuItem = new MenuItem("돈까스", 5000);
Cook cook = cooking.makeCook(menuItem);
assertThat(cook).isEqualTo(new Cook("돈까스", 5000));
}
}

View File

@@ -0,0 +1,47 @@
package org.example.order;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThatCode;
/**
* 음식점에서 음식을 주문하는 과정 구현
*
* 1. 도메인을 구성하는 객체
* - 손님, 메뉴판, 메뉴, 요리사, 요리, ..
* 2. 객체 간의 관계
* - 손님 <--> 메뉴판
* - 손님 <--> 요리사
* - 요리 <--> 요리사
* 3. 동적인 객체를 정적인 타입으로 추상화하여 도메인 모델링
* - 손님 --> 손님
* - 돈까스/냉면/만두.. --> 요리
* - 메뉴판 --> 메뉴판
* - 메뉴 --> 메뉴
* 4. 협력 설계
* 5. 객체들을 포괄하는 타입에 적절한 책임 할당
* 6. 구현
*/
public class CustomerTest {
@DisplayName("메뉴 이름에 해당하는 요리를 주문한다.")
@Test
void orderTest() {
Customer customer = new Customer();
Menu menu = new Menu(
List.of(
new MenuItem("돈까스", 5000),
new MenuItem("냉면", 7000)
)
);
Cooking cooking = new Cooking();
assertThatCode(() -> customer.order("돈까스", menu, cooking))
.doesNotThrowAnyException();
}
}

View File

@@ -0,0 +1,16 @@
package org.example.order;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThatCode;
public class MenuItemTest {
@DisplayName("메뉴항목를 생성한다.")
@Test
void createTest() {
assertThatCode(() -> new MenuItem("만두", 5000))
.doesNotThrowAnyException();
}
}

View File

@@ -0,0 +1,42 @@
package org.example.order;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
public class MenuTest {
@DisplayName("메뉴판에서 메뉴이름에 해당하는 메뉴를 반환한다.")
@Test
void chooseTest() {
Menu menu = new Menu(
List.of(
new MenuItem("돈까스", 5000),
new MenuItem("냉면", 7000)
)
);
MenuItem menuItem = menu.choose("돈까스");
assertThat(menuItem).isEqualTo(new MenuItem("돈까스", 5000));
}
@DisplayName("메뉴판에 없는 메뉴를 선택할 시 예외를 반환한다.")
@Test
void chooseTest2() {
Menu menu = new Menu(
List.of(
new MenuItem("돈까스", 5000),
new MenuItem("냉면", 7000)
)
);
assertThatCode(() -> menu.choose("통닭"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("잘못된 메뉴 이름입니다.");
}
}