본문 바로가기
스터디/오브젝트

오브젝트 09 - 유연한 설계

by 디토20 2024. 3. 25.
반응형

 

 

 

 

 

 

 

오브젝트 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
반응형

댓글