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 rimarranno costanti.
Diciamo che era mia intenzione chiarire che ...
-
Id
rappresenta un valore costante (che può quindi essere tranquillamente memorizzato nella cache), mentre -
IsInvalidated
potrebbe cambiare il suo valore durante la vita di un oggettoIX
(e quindi non dovrebbe essere memorizzato nella cache).
Come posso modificare interface IX
per rendere tale 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 nome simileIsInvalidated
potrebbe esserne influenzato.Questo argomento vale solo nei casi in cui il metodo e la proprietà sono denominati in modo simile.
-
Aumenta questa interfaccia con un evento
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
La presenza di un evento
…Changed
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 ci sono molte cose aggiuntive che potrebbero non essere affatto utilizzate.
-
Sostituisci la proprietà
IsInvalidated
con un metodoIsInvalidated()
:bool IsInvalidated();
Questo potrebbe essere un cambiamento troppo sottile. Dovrebbe essere un suggerimento che ogni volta un valore viene calcolato ogni volta, cosa che non sarebbe necessaria se fosse una costante. L'argomento MSDN "Scelta tra proprietà e metodi" ha questo da dire al riguardo:
Do use a method, rather than a property, in the following situations. […] The operation returns a different result each time it is called, even if the parameters do not change.
Che tipo di risposte mi aspetto?
-
Sono più interessato a soluzioni completamente diverse al problema, insieme a una spiegazione su come hanno superato i miei tentativi precedenti.
-
Se i miei tentativi sono logicamente errati o presentano svantaggi significativi non ancora menzionati, in modo tale che rimane una sola soluzione (o nessuna), mi piacerebbe sapere dove ho sbagliato.
Se i difetti sono minori e rimane più di una soluzione dopo averla presa in considerazione, si prega di commentare.
-
Per lo meno, vorrei un feedback su quale sia la soluzione preferita e per quale motivo.