💡 Highlight
- 메시지로 구성된 공용 인터페이스는 객체의 외부와 내부를 명확하게 분리한다. 객체지향의 힘은 대부분 객체의 외부와 내부를 구분하는 것에서 나온다.
- 훌륭한 객체란 구현을 모른 채 인터페이스만 알면 쉽게 상호작용할 수 있는 객체를 의미한다.
자율적인 책임
- 적절한 책임이 자율적인 객체를 낳고, 자율적인 객체들이 모여 유연하고 단순한 협력을 낳는다. 따라서 협력에 참여하는 객체가 얼마나 자율적인지가 전체 애플리케이션의 품질을 결정한다.
- 추상적이고 포괄적인 책임은 협력을 좀 더 다양한 환경에서 재사용할 수 있도록 유연성이라는 축복을 내려준다. 그러나 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다.
- 자율적인 책임의 특징은 객체가 '어떻게(how)' 해야 하는가가 아니라 '무엇(what)'을 해야 하는가를 설명한다는 것이다.
메시지와 메서드
- 다형성 : 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것
- 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘
- 다형성은 동일한 역할을 수행할 수 있는 객체들 사이의 대체 가능성을 의미한다.
- 객체들의 대체 가능성을 이용해 설계를 유연하고 재사용 가능하게 만든다.
메시지를 따라라
- 데이터-주도 설계 : 메시지가 아니라 데이터를 중심으로 객체를 설계하는 방식
- 객체의 내부 구조를 객체 정의의 일부로 만들기 때문에 객체의 자율성을 저해한다.
- What/Who 사이클 : 어떤 행위가 필요한지를 먼저 결정한 후에 이 행위를 수행할 객체를 결정하는 것. 책임-주도 설계의 핵심.
객체 인터페이스
- 메시지로 구성된 공용 인터페이스는 객체의 외부와 내부를 명확하게 분리한다. 객체지향의 힘은 대부분 객체의 외부와 내부를 구분하는 것에서 나온다.
인터페이스와 구현의 분리
- 맷 와이스펠드는 객체지향적인 사고 방식을 이해하기 위해서는 다음의 세 가지 원칙이 중요하다고 주장한다.
- 좀 더 추상적인 인터페이스
- 최소 인터페이스 : 외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 말라는 것. 따라서 객체의 내부를 수정하더라도 외부에 미치는 영향을 최소화할 수 있다.
- 인터페이스와 구현 간에 차이가 있다는 점을 인식
- 구현 : 객체를 구성하지만 공용 인터페이스에 포함되지 않는 모든 것
- 객체의 외부와 내부를 분리하라는 것은 결국 객체의 공용 인터페이스와 구현을 명확하게 분리하라는 말과 동일하다.
- 훌륭한 객체란 구현을 모른 채 인터페이스만 알면 쉽게 상호작용할 수 있는 객체를 의미한다.
- 객체의 모든 것이 외부에 공개돼 있다면 아무리 작은 부분을 수정하더라도 변경에 의한 파급효과가 객체 공동체의 구석구석까지 파고들 것이다.
- 캡슐화 : 객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것
- 상태와 행위의 캡슐화
- 사적인 비밀의 캡슐화
책임의 자율성이 협력의 품질을 결정한다
- 자율적인 책임은 협력을 단순하게 만든다. : 책임이 적절하게 추상화된다.
- 자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리한다. : 요청하는 객체가 몰라도 되는 사적인 부분이 객체 내부로 캡슐화되기 때문에 인터페이스와 구현이 분리된다.
- 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다. : 책임이 자율적일수록 변경에 의해 수정돼야 하는 범위가 좁아지고 명확해진다. 변경의 파급효과가 객체 내부로 캡슐화되기 때문에 두 객체 간의 결합도가 낮아진다.
- 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다. : 설계가 유연해지고 재사용성이 높아진다.
- 객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다. : 객체의 응집도를 높은 상태로 유지하기가 쉬워진다.