오브젝트

Ch04. 책임 할당하기 - 다형성

webmaster 2024. 10. 5. 22:34
728x90

다형성이 필요한 이유

할인 금액을 계산할 책임을 도메인 모델에서 찾아야 한다. 할인 정책 CRC 카드를 작성하고, 필요한 책임을 작성한다.

  • 금액 할인 계산식을 알고 있다.
  • 비율 할인 계산식을 알고 있다.
  • 비율 할인을 계산한다.
  • 금액 할인을 계산한다.

이렇게 설계를 하게 된다면 2가지 방식으로 영화와 할인 정책이 협력을 해야한다. 

두가지 책임
코드로 작성한다면..?

  • 비율 할인을 계산하라는 책임을 할인 정책에 요청한다.
  • 금액 할인을 계산하라는 책임을 할인 정책에 요청한다.
  • 이러한 설계는 영화가 할인 정책에게 서로 다른 책임을 요청해야 하는 문제가 발생한다.
    •  Movie의 calculateFee 메서드에 조건문이 들어가며, DiscountPolicy에 서로 다른 책임을 반환하는 메서드가 존재해야한다.

DiscountPolicy는 서로 상관없는 비율 할인 계산하는 로직과, 금액 할인을 계산하는 로직을 하나의 클래스 안에서 구현하고 있으며, 이는 응집도가 낮은 설계로 새로운 할인 정책이 추가되면, DiscountPolicy 내부를 수정해야 하며(새로운 기능 추가), Movie(의존하는 클래스)도 영향을 받기 쉬워진다.

이러한 설계는 현재 낮은 응집도 문제(새로운 할인 정책이 추가되면, DiscountPolicy 내부를 수정)와 높은 결합도(Movie 코드 수정)의 문제를 가지고 있다.

 

다형성(Polymorphism)

  • 문제 
    • 타입을 기반으로 유사하지만 서로 다르게 행동할 때, 조건문을 사용하지 않고 변하는 행동을 어떻게 처리할 것인가?
  • 해결 방법
    • 다형적인 메시지를 이용해서 행동이 변하는 타입들에게 각 행동을 다루기 위한 책임을 할당하라

예제) DiscountPolicy가 두가지 책임을 한 메서드에서 처리할 때 발생하는 문제

  • DiscountPolicy는 금액 할인 정책/ 비율 할인 정책 타입을 기반으로 할인 요금을 타입에 따라 다른 방식으로 계산하는 문제가 있다(타입을 기반으로 유사하지만 서로 다르게 행동할 때)
  • Movie에 어떤 로직을 실행할지 결정하기 위해 조건문을 사용하는 문제점이 있다.(조건문을 사용하지 않고 변하는 행동을 어떻게 처리할 것인가)

행동이 변하는 타입들에게 각 행동을 다루기 위한 책임을 할당

클라이언트 입장에서 행동이 변하는 것처럼 보인다면, 행동에 따라 타입을 분리하는 것이 좋다(영화에 따라 할인 정책 행동이 변한다) 유사해 보이지만 서로 다르게 동작하는 책임이 하나의 후보안에 뭉쳐있다면 타입을 분리한 후에 서로 다른 책임은 서로 다른 타입의 객체에게 할당해야 한다. 

예제)

행동이 변하는 타입들에게 각 행동을 다루기 위한 책임을 할당
코드로 설명

  • 비율 할인 정책 책임을 수행하는 비율 할인 정책 객체를 생성한다.
  • 금액 할인 정책 책임을 수행하는 금액 할인 정책 객체를 생성한다.
  • Movie는 비율/금액 할인 정책 책임을 내부적으로 가지고 있어야 하며, 이를 조건문을 통해 책임을 요청해야한다.
    • 다형성 패턴의 목표가 조건문을 제거하는것임에도 아직 조건문이 남아있다 
    • 조건문이 존재하기 때문에 아직 Movie는 높은 결합도 문제를 가지고 있으며, 새로운 정책이 추가된다면 여전히 Movie 코드가 수정되어야 하는 문제점이 존재한다.

 

728x90