본문 바로가기
Study-Book/Object

협력,,

by 어렵다어려웡 2022. 3. 28.

객체지향 시스템은 자율적인 객체들의 공동체이다.

 

객체는 고립된 존재가 아니라 시스템의 기능이라는 더 큰 목표를 달성하기 위해서

다른 객체와 협력하는 사회적인 존재이다.

 

협력은 객체지향 세계에서 기능을 구현할수 있는 유일한 방법이다.

두 객체 사이의 협력은 하나의 객체가 다른 객체에게 도움을 요청할 때 시작된다.

 

메세지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다.

메시지를 수신한 객체는 메서드를 실행해서 요청에 응답한다.

 

여기서 객체가 스스로 메서지를 처리할 방법을 선택한다.

외부 객체는 메세지를 전송할 뿐이며, 메세지를 어떻게 처리할 지는 메세지를 수신한 객체가 직접 결정한다.

 

 

ScreeningMovie 에게 처리를 위임하는 이유는 계산하는데 필요한 기본 요금할인 정책

Movie 가 가장 잘 알기 떄문이다.

 

만약 Screening 이 수행한다면 Moive 의 인스턴스 변수인 feediscountPolicy 에 직접 접근해야만 할 것이다.

이 경우 ScreeningMovie 의 내부 구현에 결합된다.

 

Movie 가 자율적은 존재가 되기 위해서는 직접 자신이 아는 정보로 요금을 계산해야 한다.

이것이 계산을 위임 하는 이유이다.

 

자신이 할 수 없는 일을 다른 객체에게 위임하면 협력에 참여하는 객체들의 전체적인 자율성을 향상시킬 수 있다.

 

결과적으로 객체를 자율적으로 만드는 가장 기본적인 방법은 내부구현은 캡슐화하는 것이다.

 

Screening 이 요금을 계산히기 위해 Movie 의 내부구현에 직접 접근한다는 것은 캡슐화의 원칙을 위반한다는 것이다.

이 경우 Movie 의 내부구현을 바꾸면 Screening 도 영향을 받게된다.

 

반면 Movie 가 직접 자신의 정보를 바탕으로 계산을 하면 ScreeningMovie 사이 결합도를 느슨하게 유지하며

변경의 여파가 Screening 으로 확산되는 것을 막을 수 있다.

 

 

협력이 설계를 위한 문맥을 결정한다.

애플리케이션 안에 어떤 객체가 필요하다면 그 이유는 단 하나여야 한다.

그 객체가 어떤 협력에 참여하고 있기 때문이다.

 

그리고 그 객체가 협력에 참여할 수 있는 이유는 협력에 필요한 적절한 행동을 보유하고 있기 때문이다.

결론적으로 객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력이다.

협력이 바뀌는 객체가 제공해야 하는 행동 역시 바뀌어야 한다.

 

객체의 행동을 결정하는 것이 협력이라면 객체의 상태를 결정하는 것은 행동이다.

객체의 상태는 그 객체가 행동을 수행하는 데 필요한 정보가 무엇인지로 결정된다.

 

객체는 스스로 자신의 상태를 결정하는 자율적인 존재이기 떄문에 객체가 수행하는 행동에 필요한 상태도 함께 가지고 있어야 한다.

 

상태는 객체가 행동하는데 필요한 정보에 의해 결정되고

행동은 협력 안에서 객체가 처리할 메세지로 결정된다.

 

결과적으로 객체가 참여하는 협력이 객체를 구성하는 행동과 상태를 모두 결정한다.

따라서 협력은 객체를 설계하는 데 필요한 일종의 문맥을 제공한다.