我试图了解依赖倒置原则与“程序到接口,而不是实现”原则的区别。
我了解“对接口编程,而不是实现”的含义。我也了解它如何允许更灵活和可维护的设计。
但是我不理解依赖关系反转原理与“程序到接口,而不是实现”原理有何不同。
我在网上的几个地方都读到了DIP,但这并没有消除我的困惑。我仍然看不到这两个原则之间的区别。谢谢你的帮助。
我试图了解依赖倒置原则与“程序到接口,而不是实现”原则的区别。
我了解“对接口编程,而不是实现”的含义。我也了解它如何允许更灵活和可维护的设计。
但是我不理解依赖关系反转原理与“程序到接口,而不是实现”原理有何不同。
我在网上的几个地方都读到了DIP,但这并没有消除我的困惑。我仍然看不到这两个原则之间的区别。谢谢你的帮助。
Answers:
“编程到接口”意味着不依赖于具体的类型来完成工作,但未指定如何获取依赖项。
“依赖关系反转原理”说,一个对象不应该控制其依赖关系的创建,它应该只是通告它需要什么依赖关系,并让调用者提供它。但是它没有指定依赖关系是具体类型还是接口。
我将用一些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();
}
}
PrintStream
应取决于所建立的接口ByteOutputStream
。依赖注入没有提及谁应该依赖谁。
他们通常是同一回事。如果您阅读什么是依赖倒置原则,为什么重要呢?和Dependency Inversion Principle,您将认识到两个“原理”基本上是关于同一件事的。
接口是一个抽象,实现是一个细节。如果将它们替换为前两个语句,则基本上会得到“代码应取决于接口而不是实现”。对我来说,这听起来是一样的。