"Programar a una interfaz" significa no depender de un tipo concreto para hacer su trabajo , pero no especifica cómo debe obtener su dependencia.
El "Principio de inversión de dependencia" dice que un objeto no debe controlar la creación de sus dependencias, solo debe anunciar qué dependencia necesita y dejar que la persona que lo llama se la proporcione . Pero no especifica si la dependencia debe ser un tipo concreto o una interfaz.
Ilustraré las diferencias con un código C #.
El siguiente ejemplo depende de un tipo concreto y controla la creación de su propia dependencia. No sigue ni "programa a una interfaz" ni "inversión de dependencia":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
El siguiente ejemplo depende de una interfaz, pero controla la creación de su propia dependencia. Sigue "programa a una interfaz", pero no "inversión de dependencia":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
El siguiente ejemplo depende de un tipo concreto, pero pide que se cree y se le pase su dependencia. Sigue "inversión de dependencia", pero no "programa a una interfaz":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
El siguiente ejemplo depende de una interfaz y solicita que se cree y se le pase su dependencia. Sigue tanto "inversión de dependencia" como "programa para una interfaz":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}