[객체지향의 사실과 오해] Ch7. 함께 모으기

객체 지향 설계 속 세 가지 상호 연관된 관점

1. 개념 관점

✔️ 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현하는 설계이다.

  • 소프트웨어는 결국 도메인 속 문제를 해결하기 위해 개발
  • 사용자가 도메인을 바라보는 관점을 반영한다.

→ 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심


2. 명세 관점

  • 개발자가 주목하는 객체들의 책임에 초점
  • 객체들이 협력을 위해 어떤 일을 할 수 있는가에 초점

중요한 것은 인터페이스와 구현을 분리하는 것이다.


3. 구현 관점

  • 구현 관점의 초점은 객체들이 책임을 수행하는 데 필요한 코드를 작성하는 것이다

개발자는 객체의 책임을 ‘어떻게’ 수행할 시킬 것인가에 초점을 맞추며 인터페이스를 구현하는 데 필요한 속성과 메서드를 클래스에 추가


💡개념 → 명세 → 구현 관점의 순서대로 소프트웨어를 개발한다는 것이 아니라, 동일한 클래스를 세 가지 관섬에서 바라보는 것을 의미

  • 개념 관점 : 클래스가 은유하는 개념
  • 명세 관점 : 공용 인터페이스
  • 구현 관점 : 클래스의 속성과 메서드


커피 전문점 예제

작은 커피전문점 예제를 통해 개념에서 구현 관점까지의 과정을 살펴보자.

1. 도메인 파악

  • 손님: 커피전문점의 존재이유이다. 손님은 메뉴판을 보고 바리스타에게 커피를 주문하는 객체이다.
  • 메뉴판: 손님은 메뉴판이 있어야 주문을 할 수 있다. 메뉴판에는 항목들이 존재한다. 예제에서는 아메리카노, 카푸치노, 카라멜 마끼아또, 에스프레소 4 가지 커피 메뉴 항목이 존재한다.
  • 메뉴 항목: 메뉴판에 구성된 항목 역시 객체이다.
  • 바리스타: 손님이 요청한 커피를 제조한다.
  • 커피: 해당 메뉴 항목의 주문을 받은 바리스타가 실제로 제조한 커피객체이다.

image

2. 협력 메시지 추출

메시지를 먼저 식별해야 한다. 메시지를 먼저 식별하고 이를 적절한 객체에 할당해야 한다.

  • ‘커피를 주문하라’ 는 것이 첫번째로 발생한 메시지이다.
  • 커피를 주문하는것은 손님의 책임이므로 첫번째 메시지는 손님 객체가 수신해야 한다.

  • 메시지를 수신받은 손님은 메뉴판 객체에 ‘메뉴를 찾아라’는 메시지를 전달한다.
  • 메뉴 항목을 찾으면 바리스타 객체에게 ‘커피를 제조하라’는 메시지를 전달해야 한다.

  • 바리스타는 커피 객체에게 ‘생성하라’는 메시지를 전달한다.

이런 과정을 협력 다이어그램으로 나타내면 아래와 같이 나타낼 수 있다.

image


3. 구현하기

public class MenuItem {

	private String menuName;
	private long price;

..............

public class MenuBoard {

	private List<MenuItem> menuItems;
	
	public MenuBoard() {
		super();
		
		menuItems = new ArrayList<>();
		
		menuItems.add(new MenuItem("Americano", 1000));
		menuItems.add(new MenuItem("Cappuccino", 1100));
		menuItems.add(new MenuItem("CaramelMacchiato)", 1200));
		menuItems.add(new MenuItem("Espresso", 1300));
	}

	public Optional<MenuItem> findMenu(String menuItemName) {
		
		return menuItems.stream()
			.filter(menuItem -> menuItem.getMenuName().equals(menuItemName))
			.findAny();
	}
}