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 Id
und 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 ...
Id
stellt einen konstanten Wert dar (der daher sicher zwischengespeichert werden kann), währendIsInvalidated
kann seinen Wert während der Lebensdauer einesIX
Objekts ändern (und sollte daher nicht zwischengespeichert werden).
Wie könnte ich interface IX
diesen 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 EigenschaftIsInvalidated
davon 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
…Changed
Ereignisses fürIsInvalidated
besagt, dass diese Eigenschaft ihren Wert ändern kann, und das Fehlen eines ähnlichen Ereignisses fürId
ist 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
IsInvalidated
durch 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; } }
InvalidStateException
zum 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.
IsInvalidated
ein benötigenprivate set
?