경주장

8장 의존성 관리하기 01 - 의존성 본문

기술서적/오브젝트

8장 의존성 관리하기 01 - 의존성

달리는치타 2021. 9. 3. 15:31

.잘 설계된 객체지향 애플리케이션은 작고 응집도 높은 객체들로 구성된다.

.작은 객체들은 단독으로 수행 할 수 있는 작업은 제한적이며 서로 협력해야 한다.

.다른 객체들이 존재한다는 것, 자신이 다른 객체에게 어떤 메시지를 보낼 수 있는가를 미리 알고 있어야 하고 이런 지식이 객체 사이의 의존성을 낳는다.

의존성은 단뱡향성을 가진다.

의존성은 변경에 의한 영향의 전파 가능성을 암시한다.

실행 시점/구현 시점 의존성의 차이

- 실행 시점 : foward한 의존성을 의미한다.

- 구현 시점 : backward한 영향을 의미한다.

-> 둘 모두 foward한 의존성의 존재 아래 필연적으로 발생하는 상황이다 (의존성 자체는 단방향)

예를 들어 위와 같은 의존 관계에서

실행 시점에 MemberService객체는 MemberRepo객체의 존재를 필요로 한다.

구현 시점에 MemberRepo의 변경은 MemberService의 변경을 의미한다.

의존성 전이

MemberController는 간접적으로 MemberRepo에 의존한다.

MemberRepo의 변경은 MemberService 뿐만 아니라 MemberController에도 변경을 야기한다.

런타임 의존성/ 컴파일 타임(코드 작성시점) 의존성

: 객체 중심/ 클래스 중심

. 유연하고 재사용 가능한 코드를 설계하기 위해서는 두 종류의 의존성을 서로 다르게 만들어야 한다.

. 런타임에는 컴파일 되지 않은 클래스 (채택되지 못한 interface/추상 class의 구현) 및 interface자체와

어떠한 의존성도 가지지 않는다.

. 반면 코드 작성시점에는 interface/추상 class 및 하부 모든 구현의 의존성을 고려하여야한다.

. 클래스 사이에 의존성을 두지 않고 interface/추상 class를 통하여 구체적인 class단위의 협력 단위는 런타임에 결정되도록 설계하라.

=> 컨텍스트 독립성을 고려하라. :자신이 다른 객체에 보낼 메세지가 구체적으로 어느 클래스에 전송될지 고려하면 안됨.

의존성 해결

컴파일타임 의존성이 구체적인 런타임 의존성으로 대체되는것

다음과 같은 세 가지 방법을 사용한다.

  • 객체를 생성하는 시점에 생성자를 통해 의존성 해결
  • 객체 생성 후 setter 메서드를 통해 의존성 해결
  • 메서드 실행 시 인자를 이용해 의존성 해결
  1. 객체를 실행하는 시점
Movie avatar = new Movie("아바타", new AmountDiscountPolicy(...));

Setter를 아에 두지 않아 변경의 가능성을 원천 차단 할 수 있다는 장점이 있다.

  1. Setter
avatar.setDiscountPolicy(new AmountDiscountPolicy(...);

런타임에 유동적으로 객체를 전환 할 수 있는 장점이 있다. (잘 사용하여야 한다.)

  1. Method의 인자로 전달 하기
    public class Movie{
     public Money calculateMovieFee(Screening screening, DiscountPolicy discountPolicy){
             ...
         }
     }
    Method가 실행될 때마다 객체를 매번 변경 할 필요가 있을 경우 유용하지만 그런 경우는 잘 없다.