J'essaie d'expliquer à mon équipe de pourquoi c'est une mauvaise pratique, et suis à la recherche d'un anti-modèle de référence pour les aider dans mon explication. C'est une très grande entreprise application, donc voici un exemple simple pour illustrer ce qui a été mis en œuvre:
public void ControlStuff()
{
var listOfThings = LoadThings();
var listOfThingsThatSupportX = new string[] {"ThingA","ThingB", "ThingC"};
foreach (var thing in listOfThings)
{
if(listOfThingsThatSupportX.Contains(thing.Name))
{
DoSomething();
}
}
}
Je suggère d'ajouter une propriété à la "Choses" de la classe de base pour nous dire si elle prend en charge X, puisque la Chose la sous-classe aura besoin pour mettre en œuvre la fonctionnalité en question. Quelque chose comme ceci:
public void ControlStuff()
{
var listOfThings = LoadThings();
foreach (var thing in listOfThings)
{
if (thing.SupportsX)
{
DoSomething();
}
}
}
class ThingBase
{
public virtual bool SupportsX { get { return false; } }
}
class ThingA : ThingBase
{
public override bool SupportsX { get { return true; } }
}
class ThingB : ThingBase
{
}
Donc, il est assez évident pourquoi la première approche est une mauvaise pratique, mais qu'est-ce appelé? Aussi, est-il un modèle mieux adapté à ce problème que celui que je suggère?