생각해보기
객체지향 사실과 오해 정리 -4- 본문
타인과의 의사소통과 협력이 어떻게 행동할지 결정하는 것처럼 객체에 세계에서도 협력이라는 것이 객체의 행동 방식을 결정한다. 중요한 것은 개별 객체가 아니라 객체들 사이에 이루어지는 협력이다. 훌륭한 객체지향 설계는 객체들 간의 요청과 응답하는 '협력'에 초점을 맞춘 것이다. 협력이 자리 잡으면 객체의 행동을 정할 수 있고 객체의 상태가 결정될 수 있다. 객체지향 설계에서 우리는 조화를 이루며 적극적으로 상호작용하는 협력적인 객체를 창조하려고 노력해야 한다.
객체의 모양을 빚는 것은 객체가 참여하는 협력이다. 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태를 결정한다.
협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작된다. 요청을 받는 사람은 요청한 사람에게 요청을 적절하게 응답한다. 결과적으로 협력은 다수의 요청과 응답으로 구성되며 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다. 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.
객체지향의 세계에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다. 즉 어떤 대상에 대한 요청은 그 대상이 요청을 처리할 책임이 있다는 것을 말한다.
협력에 참여하는 객체들은 목표를 달성하는 데 필요한 책임을 수행한다. 객체의 책임은 크게 '하는 것'과 '아는 것'의 두 가지 범주가 있다.
- 하는 것
- 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
- 아는 것
- 개인적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
책임은 객체지향 설계의 품질을 결정하는 중요한 요소이다. 객체지향 설계의 핵심은 적절한 객체에게 적절한 책임을 할당하는 것에 있다. 책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것의 측면)와 외부에 제공해 줄 수 있는 서비스(하는 것의 측면)의 목록이다.
협력은 객체 간의 책임들로 이루어져 있고 객체의 책임들이 비슷할 때 우리는 그 책임 들어 묶어 역할로 추상화할 수 있다. 단, 역할로 묶인 객체들은 동일한 메시지(요청과 응답)를 이해할 수 있어야 한다. 역할로 객체를 묶으면 객체가 같은 역할을 가진 객체로 대체를 할 수 있는 유연성을 가진다. 역할의 가장 큰 가치는 객체의 책임을 추상화했기 때문에 협력을 단순화할 수 있다.
객체는 다양한 역할을 가질 수 있다. 따라서 역할에 주어진 책임 이외에 다른 책임을 수행할 수도 있다. 올바른 객체를 설계하기 위해서는 견고하고 깔끔한 협력을 설계해야 한다. 협력을 설계한다는 것은 설계에 차여하는 객체들이 주고받을 요청과 응답의 흐름을 결정한 다는 것이다.
역할, 책임, 협력의 관점을 통해 우리는 좋은 객체지향 설계를 할 수 있다. 이것을 도와주는 세 가지 기법이 있다.
- 책임-주도 설계
- 디자인 패턴
- 테스트 주도 개발
책임-주도 설계
- 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다
- 시스템 책임을 더 작은 책임으로 분할한다
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다
- 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다
디자인 패턴
디자인 패턴은 공통으로 사용할 수 있는 역할, 책임, 협력의 탬플릿이다. 디자인 패턴은 반복적으로 발생하는 문제와 그 문제에 대한 효과적인 해법을 제공한다.
테스트 주도 개발
테스트 주도 개발은 테스트를 작성하는 것이 목적이 아니며, 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드 형태를 작성하는 것이다.
'객체지향' 카테고리의 다른 글
객체지향 사실과 오해 정리 -6- (0) | 2021.11.09 |
---|---|
객체지향 사실과 오해 정리 -5- (0) | 2021.11.09 |
객체지향 사실과 오해 정리 -3- (0) | 2021.11.04 |
객체지향 사실과 오해 정리 -2- (0) | 2021.11.01 |
객체지향 사실과 오해 정리 -1- (1) | 2021.10.29 |