협력을 위해 필요한 의존성은 유지하되, 변경을 방해하는 의존성은 제거한다.
어떤 객체가 협력하기 위해 다른 객체를 가질 때, 두 객체 사이에 의존성이 존재한다고 볼 수 있다.
class PeriodCondition implements DiscountCondition {
private dayOfWeek: Date;
private startTime: Date;
private endTime: Date;
public isSatisfiedBy(screening: Screening): boolean {
return (
(screening.getStartTime().getDayOfWeek() === this.dayOfWeek) &&
(this.startTime < screening.getStartTime()) &&
(this.endTime > screening.getEndTime()
);
}
}
isSatisfiedBy
라는 method 의 arguments 로 주어지는 screening
이란 이름의 Screening
instance 가 존재하지 않는다면, 혹은 존재하나 getStartTime
등으로 전달되는 message 를 이해할 수 없다면, 해당 method 는 예상하는 대로 동작하지 않을 것이다.PeriodCondition
은 Screening
에 의존하고 있기에, dependency graph 를 나타낸다면 이렇게 나타낼 수 있을 것이다.DiscountCondition
이라는 interface 와 dependency inversion 으로 끌어올려진, 해당 interface 에 맞추어 구현된 (implements
) PeriodCondition
의 관점에서 보자면 저런 식으로 의존성의 방향이 단방향성이지만, 기존 의존성과는 다른 모습을 볼 수 있다.Screening
과 DayOfWeek
, LocalTime
(TypeScript 에서는 Date
object 가 이용되지만) 도 구분이 될 수 있다. Screening 은 method 의 parameter(argument) 로서의 dependency, DayOfWeek
, LocalTime
은 property 로서의 dependency 이다.