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, Id
et 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…
Id
représente une valeur constante (qui peut donc être mise en cache en toute sécurité), tandis queIsInvalidated
peut changer sa valeur pendant la durée de vie d'unIX
objet (et ne doit donc pas être mis en cache).
Comment pourrais-je modifier interface IX
pour 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 nomIsInvalidated
pourrait 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 pourIsInvalidated
indique que cette propriété peut changer sa valeur, et l'absence d'un événement similaire pourId
est 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é
IsInvalidated
par 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; } }
InvalidStateException
s, par exemple, mais je ne suis pas sûr que ce soit même théoriquement possible. Ce serait bien, cependant.
IsInvalidated
besoin d'unprivate set
?