의도는 ‘메시징’이다 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가보다는 모듈이 어떻게 커뮤니케이션하는가에 달려있다. -엘런 케이-
- 명확한 책임과 역할을 지닌 참가자들이 협력에 참여해야 한다는 것
- 책임-주도 설계 : 적절한 책임의 선택이 전체 설계의 방향을 결정한다.
- 협력에 참여하는 객체가 얼마나 자율적인지가 전체 애플리케이션의 품질을 결정한다.
- 어떤 책임이 자율적인지를 판단하는 기준은 문맥에 따라 다르다는 사실을 유의하라.
- 증언하라 vs 설명하라
→ 어떤 책임이 적절한가? → 설계중인 협력이 무엇인가에 따라 달라진다.
- 증언한다
- 협력을 위해 무엇을 해야 하는지는 결정하지만, 어떻게해야 하는지에 대해서는 언급하지 않음 → 증언할 방법은 자율적으로 선택할 수 있다.
- 객체지향 개념을 구현한 초기 언어들의 일부 문법 때문에 객체의 행동을 유발하는 행위를 가리켜 메시지-전송이라고 한다. [Riel 1996], 메시지- 전송 메커니즘은 객체가 다른 객체에 접근할 수 있는 유일한 방법
- 구성
- 메시지 이름(message name): 증언하라
- 인자(argument): 메시지 전송시 필요한 추가 정보 제공
- e.g. 증언하라(어제, 왕국)
- 메시지 전송: 수신자와 메시지의 조합이다.
- 송신자: 메시지 전송을 통해서만 다른 객체의 책임을 요청 가능
- 수신자: 오직 메시지 수신으로 자신의 책임 수행 가능
→ 객체가 수신할 수 있는 메시지 모양이 객체가 수행할 책임의 모양을 결정함
- 모자 장수: ‘증인석에 입장하라’, ‘증언하라’ 메시지를 처리하는 방법 자유롭게 선택 가능
- 왕은 모자 장수가 책임을 수행하는 방법 바꿔도 알 수 없음
→ 객체는 메시지를 처리하기 위한 방법을 자율적으로 선택할 수 있다.
- 외부의 객체는 메시지에 관해서만 볼 수 있고, 객체 내부는 볼 수 없기 때문에 자연스럽게 객체의 외/내부가 분리된다.
- 메서드: 모자 장수가 ‘증언하라’라는 메시지를 처리하기 위해 내부적으로 선택하는 방법
- 메시지는 무엇이 실행되기를 바라는지만 명시, 어떤 메서드를 선택할 건지는 수신자의 결정에 좌우
- 절차적인 언어와 구분되는 특징
- 다형성: 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미
‘증언하라’
- 모자장수, 요리사, 앨리스 → 각자의 방식대로 증언 → 결과는 동일하다.
- 서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는 것을 의미
- 송신자가 수신자의 종류를 모르더라도 메시지를 전송할 수 있다
- 다형성은 수신자의 종류를 캡슐화한다.
- 다형성을 통해 유연하고 확장 가능한 구조로 설계 가능
- 왕은 ‘증언하라’라는 메시지를 이해하면서 ‘증인’ 역할을 수행할 수 있는 모든 수신자와 협력 가능
- 협력이 유연해진다.
- 협력이 수행되는 방식을 확장할 수 있다.
- 송신자에게 영향 미치지 않고 수신자 교체 가능
- 협력이 수행되는 방식을 재사용할 수 있다.
- 메시지는 송신자와 수신자 사이의 결합도를 낮춤으로써 설계를 유연하고, 확장 가능하고, 재사용 가능하게 만든다.
- 메시지를 기반으로 한 두 객체 사이의 낮은 결합도가 바로 설계를 유연하고 확장 가능하며 재사용 가능하게 만드는 비결이다.
- 객체지향의 강력함은 클래스가 아니라 객체들이 주고받는 메시지로부터 나온다.
- 시스템을 정적인 클래스들의 집합이 아니라 메시지를 주고받는 동적인 객체들의 집합으로 바라보자.
- 데이터 구조를 먼저 생각할 때 발생하는 실수 (데이터 주도 설계)
- 협력이라는 문맥을 배재한 채 객체 내부의 데이터 구조를 먼저 생각하게 된다.
- 객체의 내부 구조는 감춰져야 한다. (외부의 객체가 객체 내부를 변경할 수 있게 하면 X)
- 메시지가 아니라 데이터를 중심으로 객체를 설계하는 방식은 객체 내부 구조를 객체 정의의 일부로 만들기 때문에 객체의 자율성을 저해한다.
- 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다.
- 이를 위해 메시지를 중심으로 협력을 설계 해야 한다.
- 객체가 책임 완수하기 위해 다른 객체의 도움이 필요하다고 판단되면 도움을 요청하기 위해 어떤 메시지가 필요한지 결정
- 메시지를 수신하기에 적합한 객체를 선택
- 메시지가 수신자의 책임을 결정한다. 이때 책임을 완수하기 위해 다른 객체에서 메시지를 전송할 수 있다.
- what/who 사이클
- 어떤 행위가 필요한지 먼저 결정한 후에 이 행위를 수행할 객체를 결정하는 것
- 어떤 행위 : 메시지
- 역할을 수행할 객체의 인터페이스를 발견하기 위해 메시지를 이용하는 책임-주도 설계의 핵심 아이디어를 명확하게 표현한다.
- 어떤 행위가 필요한지 먼저 결정한 후에 이 행위를 수행할 객체를 결정하는 것
- 책임-주도 설계 방법에서는 what/who 사이클에 따라 협력에 참여할 객체를 결정하기 전에 협력에 필요한 메시지를 먼저 결정한다.
- 메시지를 먼저 결정하고 객체가 메시지를 따르게 하는 설계 방식은 객체가 외부에 제공하는 인터페이스가 독특한 스타일을 따르게 한다.
- 이런 스타일을
묻지 말고 시켜라
,데메테르 법칙
이라고 한다.
- 이런 스타일을
- 메세지 중심 설계
- 메시지 수신자의 캡슐화를 증진시킴
- 어떤 객체가 메시지를 수신할 것인지, 그 내부는 어떻게 되어있는지 볼 수 없기 때문.
- 송신자가 수신자의 내부 상태를 미리 알 수 없기 때문에 송신자와 수신자가 느슨하게 결합됨
- 메시지 수신자의 캡슐화를 증진시킴
- 메시지를 수신하는 객체가 메시지의 의미를 이해하고 메시지를 전송한 객체가 의도한 대로 요청을 처리할 수 있는지가 중요하다
- 메세지를 믿으면 자율적인 책임은 저절로 따라올 것이다.
- 인터페이스: 어떤 두 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 방법이나 장치를 의미한다.
- 인터페이스의 3가지 특징
- 인터페이스의 사용법만 익히면 내부 구조나 동작 방식을 몰라도 대상을 조작, 의사를 전달 가능
- 자동차 핸들, 변속기, 엑셀, 브레이크
- 인터페이스 자체는 변경하지 않고 단순히 내부 구성이나 작동 방식만 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다.
- 엔진 교체를 했다고 운전자가 운전을 다시 배워야하는 것은 아니다.
- 대상이 변경되더라도 동일한 인터페이스를 제공하기만 하면 아무런 문제없이 상호작용 할 수 있다.
- 자동차를 운전하기 위한 인터페이스에 능숙하다면 어떤 자동차라도 운전 가능
- 인터페이스의 사용법만 익히면 내부 구조나 동작 방식을 몰라도 대상을 조작, 의사를 전달 가능
- 공용 인터페이스: 외부에 공개된 인터페이스
- 모든 인터페이스는 메시지 전송을 통해서만 접근할 수 있다.
- 메시지를 결정하고, 메시지를 수행할 객체를 나중에 결정하기 때문에 메시지가 수신자의 인터페이스를 결정할 수 밖에 없다.
- 좀 더 추상적인 인터페이스
- 최소 인터페이스
- 외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 말라
- 인터페이스와 구현간에 차이가 있다는 점을 인식
- 상태를 어떻게 표현할 것인가 - 객체의 구현
- 객체의 외부와 내부를 분리하라 → 객체의 공용 인터페이스와 구현을 명확하게 분리하라
구현(내부)
: 변경해도 무방한 안전지대공용 인터페이스
: 외부에 영향을 미치는 위험 지대- 적절한 구현을 선택하고 이를 인터페이스 뒤로 감추는 것은 객체의 자율성을 향상 시킬 수 있다.
- 상태와 행위의 캡슐화
- 객체는 상태와 행동을 하나의 단위로 묶는 자율적인 실체이다
- 객체는 스스로 자신의 상태를 관리하며 상태를 변경하고 외부에 응답할 수 있는 행동을 내부에 함께 보관한다
- → 이 관점에서 캡슐화를 데이터 캡슐화라고 한다.
- 데이터 캡슐화는 자율적인 객체를만들기 위한 전제 조건이기도 하다.
- 사적인 비밀의 캡슐화
- 외부 객체는 오직 공용 인터페이스에 정의된 메시지를 통해서만 객체에 접근할 수 있다.
- 객체는 공용 인터페이스를 경계로 최대한 자율성을 보장 받을 수 있음
- 자율적인 책임은 협력을 단순하게 만든다.
- 자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리한다.
- 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다.
- 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.
- 객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다.
책임이 자율적일수록 적절하게 추상화되며, 응집도가 높아지고, 결합도가 낮아지며, 캡슐화가 증진되고, 인터페이스와 구현이 명확히 분리되며, 설계의 유연성과 재사용성이 향상된다.