.NET özellikleri ile ilgili bir tasarım sorunu yaşıyorum.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
Sorun:
Bu arabirimin iki salt okunur özelliği vardır Id
ve IsInvalidated
. Bununla birlikte, salt okunur olmaları, kendi değerlerinin sabit kalacağının garantisi değildir.
Diyelim ki çok açıklamak niyetim bu…
Id
sabit bir değeri temsil eder (bu nedenle güvenli bir şekilde önbelleğe alınabilir)IsInvalidated
birIX
nesnenin ömrü boyunca değerini değiştirebilir (ve önbelleğe alınmamalıdır).
interface IX
Bu sözleşmeyi yeterince açık hale getirmek için nasıl değişiklik yapabilirim?
Bir çözüm için kendi üç girişimim:
Arayüz zaten iyi tasarlanmış. Denilen bir yöntemin varlığı, bir
Invalidate()
programcının benzer şekilde adlandırılmış özelliğin değerininIsInvalidated
bundan etkilenebileceğini anlamasını sağlar .Bu argüman yalnızca yöntem ve özelliğin benzer şekilde adlandırıldığı durumlarda geçerlidir.
Bu arayüzü bir etkinlikle artırın
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
Bir
…Changed
etkinliğin varlığı,IsInvalidated
bu özelliğin değerini değiştirebileceğini belirtir ve benzer bir etkinliğin olmaması,Id
söz konusu özelliğin değerini değiştirmeyeceğine dair bir vaattir.Bu çözümü seviyorum, ancak hiç kullanılmayabilecek birçok ek şey var.
Özelliği
IsInvalidated
bir yöntemle değiştirinIsInvalidated()
:bool IsInvalidated();
Bu çok ince bir değişiklik olabilir. Her seferinde bir değerin taze olarak hesaplandığına dair bir ipucu olması gerekiyordu - bu sabit olsaydı gerekli olmazdı. "Özellikler ve Yöntemler Arasında Seçim Yapma " başlıklı MSDN konulu bu konuda şunları söyler:
Aşağıdaki durumlarda bir özellik yerine bir yöntem kullanın. […] Parametreler değişmese bile işlem her çağrıldığında farklı bir sonuç döndürür.
Ne tür cevaplar bekliyorum?
En çok soruna tamamen farklı çözümlerle ve yukarıdaki girişimlerimi nasıl yendiklerine dair bir açıklama ile ilgileniyorum.
Eğer teşebbüslerim mantıklı bir şekilde kusurluysa veya henüz değinilmeyen önemli dezavantajları varsa, tek bir çözüm (veya hiçbiri) kalmayacaksa, nerede yanlış yaptığımı duymak isterim.
Kusurlar küçükse ve dikkate alındıktan sonra birden fazla çözüm kalırsa, lütfen yorum yapın.
En azından, tercih ettiğiniz çözüm ve hangi sebep (ler) için bazı geri bildirimler istiyorum.
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
örneğin asla endişelenmemeliyiz , ancak bunun teorik olarak mümkün olup olmadığından emin değilim. Olsa iyi olurdu.
IsInvalidated
İhtiyaç yok muprivate set
?