클린코드

DPI: 의존관계 역전 원칙

RE.YEOL 2023. 4. 18. 10:00
Single Responsibility principle : 단일 책임 원칙
Open Close Principle : 개방 폐쇄 원칙
Liscov Substitution Principle : 리스코프 치환 원칙
Interface Sergregation Principle: 인터페이스 분리 원칙
Dependency Inversion Principle : 의존성 역전 원칙

좋은 객체 지향 설계의 5가지 원칙 중 의존관계 역전 원칙(DIP)에 대해 알아보겠습니다.


Dependency Inversion Principle
프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안 된다."

공휴일은 규정에 의존하기 때문에 규정 변경될 때 공휴일이 생길 수도 없어질 수도 있습니다.
다음과 같이 코드로 표현할 수 있습니다.

public class Holiday{
    private  Rule rule;
    public Holiday(){
        this.rule = new Rule();
    }
}

규정이 변경될 때 다른 결과를 가져오기 때문에 큰 영향을 끼칩니다.
영향을 느슨하게 적용하기 위해 interface로 추상화해 보겠습니다.

public class Holiday{
    private  Rule rule;
    public Holiday(){
        this.rule = new RuleV1Impl();
    }
}

# Rule interface
public interface Rule{
    RuleInfo getHolidayRule();
}

# Rule Implements
public class RuleV1Impl implements Rule{
    public RuleInfo getHolidayRule(){
        ...
    }
}

class 간 결합을 느슨하게 하였지만 아직까지 생성자에서 구체화를 의존하고 있습니다.

DIP를 지키기 위해 다음과 같이 변경하였습니다.

public class Holiday{
    private  Rule rule;
    public Holiday(Rule rule){
        this.rule = rule;
    }
}

이제 Holiday Class는 추상화인 Rule에 의존하고 Holiday의 Rule은 외부에 의해 의존관계가 설정됩니다.

이를 의존관계 역전이라 하며, DIP를 준수하게 됩니다.