J'ai un problème de conception concernant les propriétés .NET.
interface IX
{
    Guid Id { get; }
    bool IsInvalidated { get; }
    void Invalidate();
}
Problème:
Cette interface a deux propriétés en lecture seule, Idet IsInvalidated. Le fait qu'ils soient en lecture seule, cependant, n'est pas en soi une garantie que leurs valeurs resteront constantes.
Disons que j'avais l'intention de dire très clairement que…
Idreprésente une valeur constante (qui peut donc être mise en cache en toute sécurité), tandis queIsInvalidatedpeut changer sa valeur pendant la durée de vie d'unIXobjet (et ne doit donc pas être mis en cache).
Comment pourrais-je modifier interface IXpour rendre ce contrat suffisamment explicite?
Mes trois tentatives de solution:
L'interface est déjà bien conçue. La présence d'une méthode appelée
Invalidate()permet à un programmeur de déduire que la valeur de la propriété portant le même nomIsInvalidatedpourrait en être affectée.Cet argument ne s'applique que dans les cas où la méthode et la propriété sont nommées de manière similaire.
Augmentez cette interface avec un événement
IsInvalidatedChanged:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;La présence d'un
…Changedévénement pourIsInvalidatedindique que cette propriété peut changer sa valeur, et l'absence d'un événement similaire pourIdest une promesse que cette propriété ne changera pas sa valeur.J'aime cette solution, mais c'est beaucoup de choses supplémentaires qui peuvent ne pas être utilisées du tout.
Remplacez la propriété
IsInvalidatedpar une méthodeIsInvalidated():bool IsInvalidated();Cela pourrait être un changement trop subtil. C'est censé être un indice qu'une valeur est calculée à chaque fois - ce qui ne serait pas nécessaire si c'était une constante. La rubrique MSDN "Choisir entre les propriétés et les méthodes" a ceci à dire à ce sujet:
Utilisez une méthode plutôt qu'une propriété dans les situations suivantes. […] L'opération renvoie un résultat différent à chaque appel, même si les paramètres ne changent pas.
À quel genre de réponses dois-je m'attendre?
Je suis plus intéressé par des solutions entièrement différentes au problème, avec une explication sur la façon dont elles ont battu mes tentatives ci-dessus.
Si mes tentatives sont logiquement viciées ou présentent des inconvénients importants non encore mentionnés, de sorte qu'il ne reste qu'une seule solution (ou aucune), je voudrais savoir où je me suis trompé.
Si les défauts sont mineurs et qu'il reste plus d'une solution après en avoir pris en considération, veuillez commenter.
À tout le moins, j'aimerais avoir des commentaires sur quelle est votre solution préférée et pour quelle (s) raison (s).
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
                InvalidStateExceptions, par exemple, mais je ne suis pas sûr que ce soit même théoriquement possible. Ce serait bien, cependant.
                
IsInvalidatedbesoin d'unprivate set?