«Programmer vers une interface» signifie ne pas dépendre d'un type concret pour faire votre travail , mais il ne spécifie pas comment vous devez obtenir votre dépendance.
Le "Principe d'inversion des dépendances" dit qu'un objet ne doit pas contrôler la création de ses dépendances, il doit simplement annoncer les dépendances dont il a besoin et laisser l'appelant les lui fournir . Mais il ne précise pas si la dépendance doit être un type concret ou une interface.
Je vais illustrer les différences avec du code C #.
L'exemple suivant dépend d'un type concret et contrôle sa propre création de dépendance. Il ne suit ni "programme vers une interface" ni "inversion de dépendance":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
L'exemple suivant dépend d'une interface, mais il contrôle la création de sa propre dépendance. Il suit "programme vers une interface", mais pas "inversion de dépendance":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
L'exemple suivant dépend d'un type concret, mais il demande que sa dépendance soit créée et lui soit transmise. Il suit "l'inversion de dépendance", mais pas "programme vers une interface":
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
L'exemple suivant dépend d'une interface, et il demande que sa dépendance soit créée et lui soit transmise. Il suit à la fois "inversion de dépendance" et "programme vers une interface":
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}