Ich habe ein Designproblem in Bezug auf .NET-Eigenschaften.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
Problem:
Diese Schnittstelle verfügt über zwei schreibgeschützte Eigenschaften Idund IsInvalidated. Die Tatsache, dass sie schreibgeschützt sind, ist jedoch keine Garantie dafür, dass ihre Werte konstant bleiben.
Nehmen wir an, ich wollte klarstellen, dass ...
Idstellt einen konstanten Wert dar (der daher sicher zwischengespeichert werden kann), währendIsInvalidatedkann seinen Wert während der Lebensdauer einesIXObjekts ändern (und sollte daher nicht zwischengespeichert werden).
Wie könnte ich interface IXdiesen Vertrag so ändern , dass er ausreichend explizit ist?
Meine eigenen drei Lösungsversuche:
Die Schnittstelle ist bereits gut gestaltet. Das Vorhandensein einer aufgerufenen Methode
Invalidate()lässt einen Programmierer darauf schließen, dass der Wert der gleichnamigen EigenschaftIsInvalidateddavon betroffen sein könnte.Dieses Argument gilt nur in Fällen, in denen die Methode und die Eigenschaft ähnlich benannt sind.
Ergänzen Sie diese Schnittstelle mit einem Ereignis
IsInvalidatedChanged:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;Das Vorhandensein eines
…ChangedEreignisses fürIsInvalidatedbesagt, dass diese Eigenschaft ihren Wert ändern kann, und das Fehlen eines ähnlichen Ereignisses fürIdist ein Versprechen, dass diese Eigenschaft ihren Wert nicht ändern wird.Ich mag diese Lösung, aber es gibt viele zusätzliche Dinge, die möglicherweise überhaupt nicht verwendet werden.
Ersetzen Sie die Eigenschaft
IsInvalidateddurch eine MethodeIsInvalidated():bool IsInvalidated();Dies könnte eine zu subtile Änderung sein. Es soll ein Hinweis sein, dass ein Wert jedes Mal neu berechnet wird - was nicht nötig wäre, wenn es eine Konstante wäre. Das MSDN-Thema "Auswählen zwischen Eigenschaften und Methoden" enthält Folgendes:
Verwenden Sie in den folgenden Situationen eine Methode anstelle einer Eigenschaft. […] Die Operation gibt bei jedem Aufruf ein anderes Ergebnis zurück, auch wenn sich die Parameter nicht ändern.
Welche Antworten erwarte ich?
Ich interessiere mich am meisten für ganz andere Lösungen des Problems, zusammen mit einer Erklärung, wie sie meine obigen Versuche schlagen.
Wenn meine Versuche logisch fehlerhaft sind oder wesentliche, noch nicht erwähnte Nachteile aufweisen, so dass nur eine (oder keine) Lösung übrig bleibt, würde ich gerne erfahren, wo ich einen Fehler gemacht habe.
Wenn die Mängel geringfügig sind und mehr als eine Lösung nach Berücksichtigung verbleibt, kommentieren Sie bitte.
Zumindest würde ich gerne eine Rückmeldung darüber erhalten, welche Lösung Sie bevorzugen und aus welchem Grund.
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateExceptionzum Beispiel nie um s kümmern müssen , aber ich bin mir nicht sicher, ob dies überhaupt theoretisch möglich ist. Wäre aber nett.
IsInvalidatedein benötigenprivate set?