종속성 반전 원리와 "구현이 아닌 인터페이스로의 프로그램"


12

Dependency Inversion Principle이 "구현이 아닌 인터페이스에 대한 프로그램"원칙과 어떻게 다른지 이해하려고합니다.

"구현이 아닌 인터페이스에 대한 프로그램"의 의미를 이해합니다. 또한보다 유연하고 유지 관리 가능한 디자인이 가능한 방법을 이해합니다.

그러나 Dependency Inversion Principle이 "구현이 아닌 인터페이스에 대한 프로그램"원칙과 어떻게 다른지 이해하지 못합니다.

웹의 여러 곳에서 DIP에 대해 읽었지만 혼란을 풀지 못했습니다. 나는 여전히 두 원칙이 어떻게 다른지 알지 못한다. 당신의 도움을 주셔서 감사합니다.

답변:


26

"인터페이스에 대한 프로그램"은 작업을 수행하기 위해 구체적인 유형에 의존 하지 않지만 의존성을 얻는 방법 을 지정하지는 않습니다 .

"종속성 역전 원리 (Dependency Inversion Principle)"는 객체가 의존성 생성을 제어해서는 안되며, 필요한 의존성을 알리고 호출자가이를 제공하게한다고 말합니다 . 그러나 종속성이 구체적 유형인지 인터페이스인지 지정하지 않습니다.

C # 코드와의 차이점을 설명하겠습니다.

다음 예제는 구체적 유형에 따라 다르며 자체 종속성 생성을 제어합니다. "인터페이스에 대한 프로그램"이나 "종속성 반전"을 따르지 않습니다 .

public class ThingProcessor
{
    MyThing _myThing;

    public ThingProcessor()
    {
        _myThing = new MyThing();
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

다음 예제는 인터페이스에 따라 다르지만 자체 종속성 생성을 제어합니다. "인터페이스 프로그램"을 따르지만 "종속성 반전"은 아닙니다.

public class ThingProcessor
{
    IMyThing _myThing;

    public ThingProcessor()
    {
        _myThing = ThingFactory.GiveMeANewMyThing();
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

다음 예제는 구체적 유형에 따라 다르지만 종속성을 작성하여 전달하도록 요청합니다. "종속성 반전"을 따르지만 "인터페이스에 대한 프로그램"은 아닙니다.

public class ThingProcessor
{
    MyThing _myThing;

    public ThingProcessor(MyThing myThing)
    {
        _myThing = myThing;
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

다음 예제는 인터페이스에 따라 다르며 인터페이스의 종속성을 작성하여 전달하도록 요청합니다. "종속성 반전" "인터페이스에 대한 프로그램 "을 모두 따릅니다 .

public class ThingProcessor
{
    IMyThing _myThing;

    public ThingProcessor(IMyThing myThing) // using an interface
    {
        _myThing = myThing;
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

1
그 차이를 잘 보여줍니다.
Rory Hunter

8
당신이 말하는 것은 연금술 주입입니다. 의존성 반전과 의존성 주입은 서로 다른 두 가지입니다.
Euphoric

1
@Euphoric 저는 구체적인 구현 예제로 Dependency Injection을 사용하여 추상적 개념 인 Dependency Inversion Principle에 대해 이야기하고 있습니다. 차이점을 이해합니다.
Eric King

1
@EricKing 그렇다면 당신은 당신의 답변에서 ""종속성 역전 원리 "라고 말하는 대신에 명시 적으로 말해야합니다. 이것은 당신이 나의 대답을 읽는다면 분명히 잘못되었습니다.
Euphoric

1
나는 행복감에 동의합니다. Dependency Inversion Principle에 따르면 높은 수준의 코드 계층은 그 반대 수준이 아니라 하위 수준의 코드 부분에 의존해야합니다. 예를 들어 PrintStream에 의해 설정된 인터페이스에 의존해야합니다 ByteOutputStream. 의존성 주입은 누가 누구에게 의존해야하는지에 대해서는 언급하지 않습니다.
Doval

5

그들은 일반적으로 같은 것입니다. Dependency Inversion Principle이란 무엇이며 왜 중요한가? 를 읽으십시오 . 의존 관계 역전 원칙은 , 같은 일에 대해 기본적으로 두 개의 "원칙"이야기를 알게 될 것이다.

  • 고수준 모듈은 저수준 모듈에 의존해서는 안됩니다. 둘 다 추상화에 의존해야합니다.
  • 추상화는 세부 사항에 의존해서는 안됩니다. 세부 사항은 추상화에 의존해야합니다.

인터페이스는 추상화이며 구현은 세부 사항입니다. 앞의 두 문장에서 그것들을 대체하면 기본적으로 "코드는 구현이 아니라 인터페이스에 의존해야한다"라는 메시지가 나타납니다. 그리고 그것은 나에게 같은 소리입니다.


이 답변은 허용되어야합니다. 가장 많이 투표 된 다른 답변은 오도합니다
Sameh Deabes

2

인터페이스는 DI를 구현하는 한 가지 방법입니다. 클래스의 생성자 메서드에서 인터페이스를 매개 변수로 지정하면 해당 개체가 생성자 매개 변수의 인터페이스를 구현하는 한 원하는 생성자를 해당 생성자 메서드에 전달할 수 있습니다.

즉, 인터페이스를 프로그래밍하면 해당 인터페이스 의 구현변경할 수 있습니다 . 단위 테스트 중에 실제 객체 대신 모의 객체를 대체하고 다른 데이터 공급자를 지정하는 방법 등이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.