Récemment, j'ai pensé à sécuriser une partie de mon code. Je suis curieux de savoir comment on peut s'assurer qu'un objet ne peut jamais être créé directement, mais uniquement via une méthode d'une classe d'usine. Disons que j'ai une classe "objet métier" et que je veux m'assurer que toute instance de cette classe aura un état interne valide. Pour ce faire, je devrai effectuer quelques vérifications avant de créer un objet, probablement dans son constructeur. Tout va bien jusqu'à ce que je décide que je souhaite que cette vérification fasse partie de la logique métier. Alors, comment puis-je faire en sorte qu'un objet métier puisse être créé uniquement via une méthode de ma classe de logique métier, mais jamais directement? Le premier désir naturel d'utiliser un bon vieux mot-clé "ami" de C ++ échouera avec C #. Nous avons donc besoin d'autres options ...
Essayons un exemple:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
Tout va bien jusqu'à ce que vous vous souveniez que vous pouvez toujours créer une instance MyBusinessObjectClass directement, sans vérifier l'entrée. Je voudrais exclure complètement cette possibilité technique.
Alors, qu'en pense la communauté?