오브젝트

Ch05 객체지향 구현 - 유연하고 일관적인 협력

webmaster 2024. 10. 9. 11:27
728x90

메시지와 메서드 분리의 문제점

컴파일/런타임 의존성

  • 컴파일 타임 의존성과 런타임 의존성이 다르다.

외부객체가 런타임 객체를 생성을 결정해서 이를 사용하는 객체에 전달해야 한다. 컴파일 타임 의존성과 런타임 의존성 사이의 차이를 해결하기 위해 외부의 객체가 의존하는 객체를 전달하는 방식을 의존성 주입이라고 한다.

 

의존성 주입 방법

생성자를 추가

  • 런타임에 협력할 수 있는 객체를 선택해서 입력받을 수 있다.
  • 새로운 클래스의 인스턴스가 추가되더라도 생성자를 통해 이를 전달받을 수 있기 때문에 이를 사용하는 부분을 코드를 수정 없이 추가가 가능하다.

Setter 주입

  • 객체 생성 후 Setter를 통한 의존성 주입

메서드 주입 

  • 메서드 실행 시 인자를 이용한 의존성 해결

일관성 있는 설계

  • 추상화에 대한 의존성으로 협력관계를 정의하면 상위 수준에서 객체들이 항상 따라야 하는 협력패턴을 정의할 수 있게된다.
  • 추상화를 이용해서 협력 패턴을 고정시키고 나면 기능을 확장하기 위해 사용할 수 있는 안정적인 구조를 얻을 수 있게 된다.
  • 즉, 설계를 확장하기 위해 일관된 방식을 따라야 하기 때문에 새로운 기능을 추가하거나 코드의 구조를 예측하기 쉬워진다.

EX) 비할인 정책

비할인 정책 같은 경우 가장 쉽게 구현하기 위해서는 DiscountPolicy 객체를 null로 할당받고 null 체크 로직을 추가하는 것이다.

null 추가

  • DiscountPolicy 필드가 null인 Movie를 생성할 수 있는 문제가 있다.
    • Movie안에서 DiscountPolicy 접근하는 모든 로직에 null 체크를 강요
    • DiscountPolicy가 비할인 정책인지 아직 할인 정책이 할당되지 않은 것인지 이중적인 의미를 제공
  • caculate 메서드에 예외적인 플로우가 추가되는 문제
    • 조건에 따라 메시지를 전송할 수도 안 할 수도 있게 된다. 즉 코드의 실행 흐름을 이해하기 어려워진다.

이를 해결하기 위해서는 DiscountPolicy가 항상 존재하도록 다중성을 변경하고, DiscountPolicy를 구현한 비할인 정책을 반환하도록 코드를 작성하면 된다.

728x90