Sto riscontrando un problema di progettazione relativo alle proprietà .NET.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
Problema:
Questa interfaccia ha due proprietà di sola lettura Id
e IsInvalidated
. Il fatto che siano di sola lettura, tuttavia, non garantisce di per sé che i loro valori rimangano costanti.
Diciamo che era mia intenzione chiarire che ...
Id
rappresenta un valore costante (che può quindi essere memorizzato nella cache in modo sicuro), mentreIsInvalidated
potrebbe cambiare il suo valore durante la vita di unIX
oggetto (e quindi non dovrebbe essere memorizzato nella cache).
Come potrei modificare interface IX
per rendere quel contratto sufficientemente esplicito?
I miei tre tentativi di soluzione:
L'interfaccia è già ben progettata. La presenza di un metodo chiamato
Invalidate()
consente a un programmatore di dedurre che il valore della proprietà con un nome simileIsInvalidated
potrebbe esserne influenzato.Questo argomento vale solo nei casi in cui il metodo e la proprietà hanno nomi simili.
Aumenta questa interfaccia con un evento
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
La presenza di un
…Changed
evento perIsInvalidated
afferma che questa proprietà può cambiare il suo valore e l'assenza di un evento simile perId
è una promessa che quella proprietà non cambierà il suo valore.Mi piace questa soluzione, ma è un sacco di roba aggiuntiva che potrebbe non essere utilizzata affatto.
Sostituisci la proprietà
IsInvalidated
con un metodoIsInvalidated()
:bool IsInvalidated();
Questo potrebbe essere un cambiamento troppo sottile. Dovrebbe essere un indizio del fatto che un valore viene calcolato di fresco ogni volta, il che non sarebbe necessario se fosse una costante. L'argomento MSDN "Scegliere tra proprietà e metodi" ha questo da dire al riguardo:
Utilizzare un metodo, anziché una proprietà, nelle seguenti situazioni. […] L'operazione restituisce un risultato diverso ogni volta che viene chiamata, anche se i parametri non cambiano.
Che tipo di risposte mi aspetto?
Sono molto interessato a soluzioni completamente diverse al problema, insieme a una spiegazione su come hanno battuto i miei tentativi di cui sopra.
Se i miei tentativi sono logicamente imperfetti o presentano svantaggi significativi non ancora menzionati, in modo tale che rimanga solo una soluzione (o nessuna), vorrei sapere dove ho sbagliato.
Se i difetti sono minori e più di una soluzione rimane dopo averla presa in considerazione, si prega di commentare.
Per lo meno, vorrei un feedback su quale sia la tua soluzione preferita e per quale motivo.
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
s, per esempio, ma non sono sicuro che ciò sia anche teoricamente possibile. Sarebbe carino, però.
IsInvalidated
bisogno di unprivate set
?