Tengo un problema de diseño con respecto a las propiedades de .NET.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
Problema:
Esta interfaz tiene dos propiedades de solo lectura, Id
y IsInvalidated
. Sin embargo, el hecho de que sean de solo lectura no garantiza que sus valores permanezcan constantes.
Digamos que era mi intención dejar muy en claro que ...
Id
representa un valor constante (que, por lo tanto, puede almacenarse en caché de forma segura), mientras queIsInvalidated
podría cambiar su valor durante la vida útil de unIX
objeto (y, por lo tanto, no debería almacenarse en caché).
¿Cómo podría modificar interface IX
para hacer ese contrato suficientemente explícito?
Mis propios tres intentos de solución:
La interfaz ya está bien diseñada. La presencia de un método llamado
Invalidate()
permite a un programador inferir que el valor de la propiedad con un nombre similarIsInvalidated
podría verse afectado por ella.Este argumento es válido solo en los casos en que el método y la propiedad tienen un nombre similar.
Aumente esta interfaz con un evento
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
La presencia de un
…Changed
evento para losIsInvalidated
estados que esta propiedad puede cambiar su valor, y la ausencia de un evento similar paraId
es una promesa de que la propiedad no cambiará su valor.Me gusta esta solución, pero es una gran cantidad de cosas adicionales que pueden no utilizarse en absoluto.
Reemplace la propiedad
IsInvalidated
con un métodoIsInvalidated()
:bool IsInvalidated();
Esto podría ser un cambio demasiado sutil. Se supone que es una pista de que un valor se calcula nuevamente cada vez, lo que no sería necesario si fuera una constante. El tema de MSDN "Elegir entre propiedades y métodos" tiene esto que decir al respecto:
Utilice un método, en lugar de una propiedad, en las siguientes situaciones. […] La operación devuelve un resultado diferente cada vez que se llama, incluso si los parámetros no cambian.
¿Qué tipo de respuestas espero?
Estoy más interesado en soluciones completamente diferentes al problema, junto con una explicación de cómo superaron mis intentos anteriores.
Si mis intentos son lógicamente defectuosos o tienen desventajas significativas aún no mencionadas, de modo que solo quede una solución (o ninguna), me gustaría saber dónde me equivoqué.
Si las fallas son menores y queda más de una solución después de tomarla en consideración, comente.
Como mínimo, me gustaría recibir comentarios sobre cuál es su solución preferida y por qué motivo (s).
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
s, por ejemplo, pero no estoy seguro de si esto es teóricamente posible. Sin embargo, sería bueno.
IsInvalidated
necesita unprivate set
?