오브젝트

Ch04 책임 할당하기 - 변경 보호

webmaster 2024. 10. 5. 23:07
728x90

다형적인 메시지

메시지는 한 객체지향에서 한 객체가 다른 객체와 협력하기 위해 보내는 요청이며, 객체가 협력을 위해 사용할 수 있는 유일한 의사소통 수단이다. 

영화의 메시지 전송

  • 영화는 비율 할인 정책 클래스에게 비율 할인을 계산하라는 메시지를 전송하고 있다.
  • 영화는 금액 할인 정책 클래스에게 금액 할인을 계산하라는 메시지를 전송하고 있다.
  • 영화의 입장에서는 할인 금액을 계산하고 계산된 할인 금액을 반환한다는 점에서는 두 정책은 다르지 않다.
  • 영화는 협력하는 대상이 할인 금액만 반환할 수 있다면 조건문을 이용해서 누구에게 메시지를 전송할지 고민할 필요가 없다.
  • 따라서 메시지를 통일해서 영화가 할인 정책의 타입과 무관하게 동일한 메시지를 전송하도록 변경해야 한다.

객체지향에서는 메시지를 수신한 객체가 메시지를 처리할 방식을 스스로 선택할 수 있는 메커니즘을 제공한다.
동일한 메시지를 전송했을 때 메시지를 수신한 객체의 타입에 따라 서로 다른 방식으로 동작하는 것을 다형성이라고 부른다. 타입에 따라 다르게 동작하도록 요청을 전송하는 메시지를 다형적인 메시지라고 부른다.

하지만 이렇게 메시지를 통합한 후에도 여전히 높은 결합도 문제를 가지게 되는데, 이를 해결하기 위해서는 할인 정책을 타입을 숨겨야 한다

변경 보호 패턴

  • 문제 - 요소들의 변화나 불안정한 요소가 다른 요소에 해로운 영향을 미치지 않도록 할 수 있을까?
  • 해결 방법 - 변화가 예상되거나 불안정한 지점을 식별하고, 그 주위에 안정적인 인터페이스 또는 추상화를 형성하도록 책임을 할당하라

변경 보호 패턴 예제)

변경 보호 패턴

  • 비율 할인 정책, 금액 할인 정책을 추상화할 수 있는 할인 정책을 추가한다.
  • 추상화는 불필요한 세부사항을 덜어내는 방식이기 때문에 추상화인 할인 정책이 비율/금액 할인 정책보다 더 일반적인 책임을 보유하게 된다.
  • 추상화를 도입했으므로 Movie 또한 구체적인 타입 대신 추상화에 의존하도록 협력자를 변경해야 한다.

다형적인 메시지로 요청을 통일하고 변경 보호 패턴을 통해 변화를 캡슐화하면, 다형적으로 동작하는 협력 관계를 완성할 수 있다.

 

역할

힌 종류의 객체만 역할을 대체
여러 종류의 객체가 대체할 수 있는 역할

  • 다용성을 위해 도입한 추상화를 구체적인 타입들이 대체 가능해야 한다.
  • 이처럼 구체적인 타입들로 대체 가능한 추상화를 역할이라고 한다.
  • 한 종류의 객체만 역할을 대체한다면 객체와 역할은 동일하다.
  •  여러 종류의 객체가 대체할 수 있다면, 역할은 객체와 동일하지 않으며 이 경우 역할은 객체가 대체할 수 있는 추상화를 의미한다.

책임 주도 설계 구성 요소

협력, 책임, 역할

  • 협력은 한 객체가 다른 객체에게 메시지를 전송해서 도움을 요청하고 응답을 받는 과정을 의미
  • 책임은 객체가 다른 객체와 협력하기 위해 알아야 하거나, 행동해야 하는 것을 의미
  • 역할은 협력 안에서 책임을 수행하는 대상(객체일 수도 있으며, 다수의 객체를 대체할 수 있는 슬롯일 수도 있다)
  • 협력/ 책임/ 역할은 책임 주도 설계를 구성하는 핵심적인 요소이다.
728x90