3장 역할, 책임, 협력
정리
객체지향 패러다임 관점에서 핵심은 역할, 책임, 협력이다.
협력: 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호 작용.
책임: 객체가 협력에 참여하기 위해 수행하는 로직.
역할: 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 것.
협력이란 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것이다. 한 객체는 어떤 것이 필요할 때 다른 객체에게 전적으로 위임하거나 서로 협력한다. 즉, 두 객체가 상호작용을 통해 더 큰 책임을 수행하는 것이다. 객체 사이의 협력을 설계할 때는 객체를 서로 분리된 인스턴스가 아닌 협력하는 파트너로 인식해야 한다.[Wirfs-Brock03]
메시지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다.
메시지 전송 → 메시지 수신한 객체가 메서드를 실행하여 요청에 응답(메시지를 처리할 방법을 스스로 선택→객체가 자율적인 존재라는 것을 의미)
객체가 필요하다면 그 이유는 어떤 협력에 참여하고 있기 때문이다.
그리고 객체가 협력에 참여할 수 있는 이유는 협력에 필요한 적절한 행동을 보유하고 있기 때문이다.
협력이라는 문맥을 고려하지 않고 객체의 행동을 결정하는 것은 아무런 의미가 없다.
협력이 존재하기 때문에 객체가 존재하는 것이다.
협력은 객체를 설계하는 데 필요한 일종의 문맥을 제공한다.
객체의 책임은 크게 ‘하는 것’과 ‘아는 것’으로 나눌 수 있다.[Larman04]
하는 것
- 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
아는 것
- 사적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
INFORMATION EXPERT(정보 전문가)패턴
책임을 수행하는 데 필요한 정보를 가장 잘 알고 있는 전문가에게 그 책임을 할당하는 것이다.
책임 주도 설계
RDD(Responsibility-Driven Design)[Wirfs-Brock03]
책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법.
책임을 할당할 때 고려해야 하는 두 가지 요소
- 메시지가 객체를 결정한다.
- 행동이 상태를 결정한다.
메시지가 객체를 결정한다.
메시지가 객체를 선택하게 해야 하는 두 가지 이유
- 객체가 최소한의 인터페이스를 가질 수 있게 된다.[Weisfeld08]
- 객체는 충분히 추상적인 인터페이스를 가질 수 있게 된다.[Weisfeld08]
행동이 상태를 결정한다.
상태를 먼저 결정하고, 상태에 필요한 행동을 결정하면 캡슐화를 저해한다.
협력이 객체의 행동을 결정하고 행동이 상태를 결정한다.
그리고 그 행동이 바로 객체의 책임이 된다.
역할과 협력
객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 한다.
책임과 역할을 중심으로 협력을 바라보는 것이 변경과 확장이 용이한 유연한 설계로 나아가는 첫걸음이다.
역할의 구현
일반적으로 추상 클래스와 인터페이스를 사용
협력의 관점에서
- 추상 클래스는 책임의 일부를 구현해 놓은 것
- 인터페이스는 일체의 구현 없이 책임의 집합만을 나열해 놓은 것
역할이 다양한 종류의 객체를 수용할 수 있는 일종의 슬롯이자 구체적인 객체들의 타입을 캡슐화하는 추상화이다.
객체 대 역할
협력에 적합한 책임을 수행하는 대상이 한 종류라면 객체
여러 종류의 객체들이 참여할 수 있다면 역할
설계 초반에는 적절한 책임과 협력의 큰 그림을 탐색하는 것이 가장 중요한 목표여야 하고 역할과 객체를 명확하게 구분하는 것은 그렇게 중요하지 않다. 따라서 애매하다면 객체로 시작하여 반복적으로 책임과 협력을 정제해가면서 필요한 순간에 객체로부터 역할을 분리해내는 것이 가장 좋다.
협력을 구체적인 객체가 아니라 추상적인 역할의 관점에서 설계하면 협력이 유연하고 재사용 가능해진다는 것이다.
따라서 역할의 가장 큰 장점은 설계의 구성 요소를 추상화할 수 있다는 것이다.
역할은 특정한 객체의 종류를 캡슐화하기 때문에 동일한 역할을 수행하고 계약을 준수하는 대체 가능한 객체들은 다형적이다.
느낀점
학교 수업 시간에 설계할 때 알아야할 책임과 행해야할 책임을 찾아야 함을 강조한 적이 있었는데 겹치는 내용이 있어 읽는 동안 내심 반가웠다. 설계를 함에 있어 객체들이 자율성을 갖도록 협력과 책임, 그리고 역할의 중요성을 명심 해야겠다.