객체가 무엇을 아는지(객체의 책임), 누구를 알고 있는지(객체의 의존성) 뿐만 아니라 서로 어떻게 소통하는지 알아야 함
객체 사이의 ㅍ소통은 인터페이스를 통해 이뤄짐 애플리케이션이 자라나고 변형될 수 있도록 해주는 유연한 인터페이스에 대해 알아보자
첫번쨰 애플리케이션 객체는 재사용하기 어려움
위 문제의 핵심은 클래스가 무엇을 하는지 가 아닌 무엇을 드러내는지 임
두 번쨰 어플리케이션 객체는 어떤 메시지를 주고받을지에 대한 합의가 있음
여러가지 의미를 가짐
위 예제에서는 클래스 안에 있는 인터페이스 지칭
클래스는 메서드를 구현
하나의 클래스로부터 독립되어 있고 여러 클래스 사이를 돌아다니는 인터페이스
메시지의 묶음
메세지들 자체가 인터페이스를 정의
마치 인터페이스가 가상의 클래스를 정의하는 것과 같음
레스토랑의 부엌을 예로 들자.
식당에는 손님이 사용할 수 있는 public interface, 즉 메뉴판 부엌안에서는 많은 일이 오가지만 private 하기에 손님에게 보이지 않음
퍼블릭과 프라이빗의 구분은 일을 가장 효율적으로 처리하기 위함
클래스는 마치 이런 부엌과 같음
어떤 메서드는
클래스의 퍼블릭 인터페이스는 클래스의 구체적인 책임을 표현한 문장과 상응(책임을 명시한 계약서)
디자인의 목표는 당장의 요구사항을 처리하기에 충분하면서 나중에 수정할 여지 남기는 것
여행회사가 여행객에게 자전거 여행길 추천, 자전거는 회사꺼가 부족할 시 지역 점포들과 공유
애플리케이션의 명사, 정보, 행동 을 기반으로 클래스를 떠올려보면
이를 도메인 객체 라고 부름
도메인 객체에만 집착하면 행동들을 객체 속에 넣어버림 도메인 객체들이 주고 받는 메시지 에 주목해야함 이 메세지들은 새로운 겍체를 찾도록 도움
UML은 그 중 하나임
wayne은 Trip에게 suitable_trips
메세지를 전송하여 결과만 돌려받음
위 이미지에서 질문을 던져보자.
여행에 적당한 자전거가 준비되어 있는지 파악하는 것이 Trip의 책임일까?
위와 같이 다이어그램을 사용하면 “이 클래스가 필요한건 알겠는데 이 클래스는 무엇을 해야하지? ” 가 아닌 ”메시지를 전송해야 하는데 누구에게 전송하지? 라고 질문할 수 있음, 즉 메시지 기반 디자인 가능
여튼 위와 같은 질문에 대해
여행에 어울리는 자전거를 파악하는 것은 Trip이 아닌 Bicycle일듯
정리하자면 wayne은
개선해보자
(2)
이번에는 Trip에서 추가적인 책임을 걷어냈지만
객체 사이의 (메시지)소통은 인터페이스를 통해 이뤄짐
인터페이스란 메시지의 묶음
예를 들어보자. 식당에는 손님이 사용할 수 있는 public interface인 메뉴판이 있음 부엌에서는 많은 일이 오가지만 private 하기에 손님에게 보이지 않음 손님은 메뉴판으로 원하는 것을 주문 만 하면됨. public interface의 메서드에 메뉴만 인자로 전달하면 원하는 것을 제공하기 위해 음식을 만듬
퍼블릭 인터페이스
프라이빗 인터페이스
설계할 때 주의할점
도메인 객체들이 주고 받는 메시지 에 주목해야함
UML을 통해
메시지 전송을 그려서 전략 작성하면 도움됨