[루비로 배우는 객체지향 디자인] 4. 유연한 인터페이스 만들기(3)

4.3, 4 자신의 인터페이스를 드러내는 코드 작성하기

4.3.7 새로운 객체를 찾아내기 위해 메시지를 사용하기

앞에서 봤던 다이어그램을 개선해보자.

위 문제의 유스케이스는 여행객은, 여행길을 선택하기 위해, 정해진 날짜에 자전거를 빌리고, 여행길 목록을 보고 싶어함

첫번쨰 그림은

  • 많은 책임을 가진 Trip

두번째 그림은

  • 빌릴 수 있는 자전거를 찾아야하는 책임을 Trip에서 Bicycle로 옮겼지만

    • customer는 여행에 대해 너무 많이 알고, 책임을 가짐
    • 너무 많은 맥락 속에 갇힘

위 2가지 디자인 모두 재사용 어려움, 변경도 어려움, 단일 책임 원칙 위반

다시 정리해보자.

  • Customer는 suitable_trips 메서드를 전송하는 것은 타당
  • 문제는 송신자가 아닌 수신자에게 있음

Customer, Trip, Bicycle이 교차하는 지점에서 여행을 찾아 줄 객체가 필요. suitable_trips 메서드는 이 객체의 퍼블릭 인터페이스의 한 부분을 차지할거임

img

TripFinder는

  • 여행을 찾아내는 방법을 알고
  • suitable_trips 메시지에 답하기 위해 가능한 모든 방법을 시도하는 것이 이 클래스의 역할
  • 내부적으로 지저분하고 언제 변경될지 모르는 세부 구현사항을 숨기고 있을지라도
  • 이 클래스는 안정적인 퍼블릭 인터페이스를 제공
  • suitable_trips 메서드를 TripFinder로 옮겼기 때문에
  • 다른 객체들도 이 행동에 접근 가능

애플리케이션의 특징을 드러내는 것은 인터페이스 테스트보다 다른 어떤 코드 보다 인터페이스가 중요

4.4.1 명시적인 인터페이스 만드릭

퍼블릭 인터페이스의 메서드

  • 일반적인 의미, 엄밀하고 명시적으로 규정되야 함
  • 어떻게 보다는 어떤 것에 대해 말해야함
  • 예측할 수 있는 한도에서나마 바뀌지 않을 이름 짓기
  • 추가적인 인자를 해시로 받기

4.4.4 최소한의 맥락 속에 위치시키기

퍼블릭 인터페이스를 구성할 경우 다른 객체와 연계되어 있는 맥락을 최소화 하자

앞의 예제에서 봤듯이

  • Mechanic 클래스 안에 새로운 메서드를 정의할 수도 있고
  • Mechanic 클래스를 감싸는 새로운 클래스를 만들어서 Mechanic 대신 사용할 수도 있고
  • 우리가 만든 클래스 안에 Mechanic을 호출하는 부분을 감싸는 작은 메서드를 만들수도 있음

4.6 요약

객체 지향 App은 객체들이 서로 주고받는 메시지를 통해 정의됨 이 메세지들은 퍼블릭 인터페이스를 타고 흐름

메시지에 집중하면, 예전에는 미처 파악하지 못한 객체를 찾을 수 있음 메시지가 ‘수신자가 어떻게 행동해야 하는지’를 알려주기보다 수신자를 믿고 전송자가 원하는 것(무엇)을 말한다면, 객체는 자연스럽게 퍼블릭 인터페이스를 발전시키기 됨121221