반응형
오브젝트 09 - 유연한 설계
9.4 의존성 역전 원칙
9.4.1 추상화와 의존성 역전
public class Movie {
private AmountDiscountPolicy discountPolicy;
}
- 상위 수준 클래스인 Movie가 하위 수준 클래스인 AmountDiscountPolicy에 의존하고 있다.
- 상위 수준의 클래스가 하위 수준의 클래스에 의존하면 하위 수준의 변경에 의해 상위 수준 클래스가 영향을 받는다.
- 의존성 방향은 상위에서 하위로 흘러야 한다.
- 위와 같은 코드는 클래스의 결합도가 높아지고 재사용성과 유연성이 저해된다.
- Movie와 AmountDiscountPolicy 모두 추상화에 의존하도록 수정해 문제를 해결할 수 있다.
- 하위 클래스 변경이 상위 클래스에 영향을 주는 것을 방지할 수 있다.
- 상위 수준을 재사용할 때 하위 수준에 얽매이지 않고 다양한 컨텍스트에서 재사용이 가능하다.
의존성 역전 원칙
- 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다.
- 추상화는 구체적인 사항에 의존해서는 안 된다. 구체적인 사항은 추상화에 의존해야 한다.
9.4.2 의존성 역전 원칙과 패키지
- 위의 구조는 구체 클래스가 모두 추상 클래스에 의존하기 때문에 설계가 유연하고 재사용 가능해보인다.
- 하지만 Movie를 다양한 컨텍스트에서 재사용하기 위해서는 불필요한 클래스들이 Movie와 함께 배포되어야 한다.
- Movie를 정상적으로 컴파일 하기 위해서는 DiscountPolicy가 필요하다.
- DiscountPolicy가 속한 패키지 안에는 AmountDiscountPolicy 와 PercentDiscountPolicy 가 포함되어 있다.
- 의존성에 따라 Movie는 DiscountPolicy를 수정하지 않을 경우에는 영향을 받지 말아야 한다.
- 그러나 DiscountPolicy가 포함된 패키지 안의 어떤 클래스가 수정되더라도 패키지 전체가 재배포 되어야한다.
- Movie와 DiscountPolicy를 하나의 패키지로 모아 독립시킨다.
- Movie를 다른 컨텍스트에서 재사용하기 위해서는 단지 Movie가 속한 패키지만 재사용하면 된다.
9.5 유연성에 대한 조언
9.5.1 유연한 설계는 유연성이 필요할 때만 옳다
- 유연하고 재사용 가능한 설계란 동일한 컴파일 타입 의존성으로부터 다양한 런타임 의존성을 만들 수 있는 설계를 의미한다.
- 그러나 변경하기 쉽고 확장하기 쉬운구조를 만들 수록 코드는 복잡해진다.
- 유연하지 않은 설계는 단순하고 명확하다.
- 유연한 설계는 복잡하고 암시적이다.
- 단순하고 명확한 해법이 만족스럽다면 유연성을 제거하라.
9.5.2 협력과 책임이 중요하다
- 설계를 유연하게 만들기 위해서는 먼저 역할, 책임, 협력에 초점을 맞춰야 한다.
- 다양한 컨텍스트에서 협력을 재사용할 필요가 없다면 설계를 유연하게 만들 당위성도 함께 사라진다.
- 객체를 생성할 책임을 담당할 객체나 객체 생성 메커니즘을 결정하는 시점은 책임 할당의 마지막 단계로 미뤄야한다.
- 중요한 비즈니스 로직을 처리하기 위해 책임을 할당하고 협력의 균형을 맞추는 것이 객체 생성 보다 우선이다.
728x90
반응형
'스터디 > 오브젝트' 카테고리의 다른 글
오브젝트 11 - 합성과 유연한 설계 (0) | 2024.03.26 |
---|---|
오브젝트 10 - 상속과 코드 재사용 (0) | 2024.03.26 |
오브젝트 07 - 객체 분해 (1) | 2024.03.05 |
오브젝트 06 - 메시지와 인터페이스 (0) | 2024.02.26 |
오브젝트 05 - 책임 할당하기 (0) | 2024.02.20 |
댓글