객체지향에서 가장 중요한 것은 객체들이 주고받는 메시지다. 그리고 이 메시지들이 객체의 퍼블릭 인터페이스를 구성하는데, 제대로된 퍼블릭 인터페이스를 위해서는 책임 주도 설계를 따르는 것만으로는 부족하다. 그렇기에 더 유연하고 재사용가능한 인터페이스를 만드는데 도움이 되는 설계 원칙과 기법을 알아본다.

1. 협력과 메시지

협력은 어떤 객체가 다른 객체에게 무언가를 요청할 때 시작된다. 그리고 이런 요청, 응답에 대한 전통적인 메타포는 클라이언트-서버 모델이다. 또한 여기에 참여하는 객체는 클라이언트임과 동시에 서버가 될 수 있다.

앞선 예시에서 Screening → Movie → DiscountPolicy의 요청 구조를 가진 것처럼 말이다.

메시지와 메시지 전송

메시지는 객체의 협력에 사용되는 유일한 의사소통 수단이다. 메시지는 오페레이션명 + 인자로 구성되며 메시지 전송은 여기에 메시지 수신자를 더한 것이다.

Java : condition.isSatisfied(screening) == 수신자.오퍼레이션명(인자)

메시지와 메서드

메시지를 수신했을 때 실제 어떤 코드가 실행되는가. 이는 메시지 수신자의 실제 타입이 무엇인가에 달려있다. 이렇게 실제 실행되는 함수 또는 프로시저를 메서드라고 부른다.

메시지와 메서드의 구분은 객체들의 느슨한 결합을 가능하게 한다. 송신자와 수신자는 서로를 알 필요 없다. 송신자는 메시지를 보내는 것이고 수신자는 메시지를 받아 자신의 메서드를 실행하면 된다.

퍼블릭 인터페이스와 오퍼레이션

객체가 의사소통을 위해 외부에 공개하는 메시지의 집합을 퍼블릭 인터페이스라고하고 이 인터페이스에 포함된 메시지를 오퍼레이션이라고 부른다. 오퍼레이션은 수행 가능한 어떤 행동에 대한 추상화다. 보통 구현부를 제외하고 메시지에 관한 시그니처를 가리키는 경우가 대부분이다. 이 메시지를 수신했을 때 실제 실행되는 코드는 메서드라고 한다.

2. 인터페이스와 설계 품질

좋은 인터페이스에 대해 다시 말해보면 최소한의 인터페이스와 추상적인 인터페이스라는 조건을 만족해야 한다. 이렇게 최소주의를 따르면서도 추상적인 인터페이스를 설계하는 가장 좋은 방법은 책임 ㅜㅈ도 설계를 따르는 것이다. 메시지를 먼저 선택해 협력과 무관한 오퍼레이션이 인터페이스에 스며드는 것을 방지할 수 있다.

책임 주도 설계가 훌륭한 인터페이스에 대한 지침을 제공하긴 하지만 좋은 인터페이스가 가지는 공통된 특징을 알아두는 것도 좋다. 안목을 넓히고 올바른 설계에 대한 지름길을 제공하기 때문에 다음 내용에 대해 알아볼 것이다.