훌륭한 객체지향 설계
- 조화를 이루며 적극적으로 상호작용하는 협력적인 객체를 창조하는 것
- 따로 떼어놓고 봤을 때 이상해도 상관없다.
→ 개별적인 객체의 행동이나 상태가 아니라 객체들 간의 협력에 집중하자.
협력
- 스스로 해결하기 어려운 문제에 부딪히게 되면 문제를 해결하는데 도움을 받을 수 있는 누군가에게 도움을 요청한다.
- 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의
책임
- 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나 , 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다.
- 객체에 의해 정의되는 응집도 있는 행위의 집합
- 객체의 책임
- 객체가 무엇을 알고 있는가와 무엇을 할 수 있는가로 구성
- 책임은 객체의 공용 인터페이스를 구성한다.
- 책임은 객체의 외부에 제공해줄 수 있는 정보와 외부에 제공해 줄 수 있는 서비스의 목록
메시지 전송
- 객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것
역할
- 어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시
- 역할이 재사용 가능하고 유연한 객체지향 설계를 낳는다!
- 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있다.
- 역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정
단순성, 유연성, 재사용성
을 뒷받침하는 핵심 개념
객체의 모양을 결정하는 협력
- 객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위해서다.
- 클래스를 어떻게 구현할 것인가가 아니라 객체가 협력 안에서
어떤 책임과 역할을 수행할 것인지
결정하는 것이 중요
- 올바른 객체를 설계하는 과정
객체지향 설계 기법
- 책임-주도 설계(RDD)
- 협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방식
- 과정
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악
- 시스템 책임을 더 작은 책임으로 분할
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당
- 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할 찾기
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력
- 디자인 패턴
- 반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿 모음
- 패턴
- 특정한 상황에서 설계를 돕기 위해
모방
하고 수정
할 수 있는 과거의 설계 경험
- 테스트-주도 개발(TDD)
- 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성해나가는 방식
- 핵심은 테스트가 아니라 구체적인 코드를 작성해나가면서 역할, 책임, 협력을 식별하고 식별된 역할, 책임, 협력이 적합한지를 피드백 받는 것
- 테스트를 작성하는 것이 아니라 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것