2017-06-08 8 views
1

Existe-t-il un moyen d'appliquer le reste de ma classe pour accéder au setter de propriété plutôt qu'au champ de sauvegarde? Considérons le code maladroit suivant:Comment masquer le champ de sauvegarde du reste de la classe

public class Brittle 
{ 
    private string _somethingWorthProtecting; 
    public string SomethingWorthProtecting 
    { 
     get { return _somethingWorthProtecting; } 
     set 
     { 
      _somethingWorthProtecting = value; 
      ReallyNeedToDoThisEverTimeTheValueChanges(); 
     } 
    } 

    public void OhDearWhatWasIThinking() 
    { 
     _somethingWorthProtecting = "Shooting myself in the foot here, aren't I?"; 
    } 
} 

Pour autant que je sache, C# ne fournit pas de mécanisme pour empêcher le développeur de la classe de faire cette erreur. (Les propriétés automatiques ne sont manifestement pas une option dans cette situation.) Existe-t-il un modèle de conception ou une pratique qui peut aider à protéger contre ces fins de contournement par inadvertance?

+0

S'il est si important alors il vaut la peine d'être testé unitairement –

+2

* « pour empêcher le développeur de la classe de faire cette erreur » * - c'est surpuissant, au sérieux. Si une personne modifie cette classe, a besoin d'aide comme celle-ci, alors ne laissez pas cette personne modifier quoi que ce soit. Les commentaires devraient suffire. De l'autre côté, vous pouvez donner ce nom de champ * dédié *: _doNotModifyMePlx'. – Sinatr

Répondre

1

vous pouvez déplacer cette logique à une classe de base abstraite:

public abstract class Brittle 
{ 
    private string _somethingWorthProtecting; 
    public string SomethingWorthProtecting 
    { 
     get { return _somethingWorthProtecting; } 
     set 
     { 
      _somethingWorthProtecting = value; 
      ReallyNeedToDoThisEverTimeTheValueChanges(); 
     } 
    } 

    //..... 
} 

alors vous pouvez être sûr que personne n'instancier cette classe et les classes dérivées ne seront pas en mesure d'accéder au champ privé.

public class BrittleDerived : Brittle 
{ 
    public void DoSomething() 
    { 
     // cannot access _somethingWorthProtecting; 
    } 
} 
+1

Dupliquer de la réponse à cette question: https://stackoverflow.com/a/3265833/993547 :) Deux esprits qui pensent la même chose. –

+0

Cette solution ne donne rien. Un mois plus tard, quelqu'un va essayer d'ajouter de nouvelles fonctionnalités à la classe de base, et le problème reviendra. – apocalypse

+0

Je veux dire, si quelqu'un a accès à votre base de code, il y a seulement autant de failafes que vous pouvez mettre. S'ils veulent détruire votre code, ils le peuvent. – Jonesopolis