.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 Idve IsInvalidated. Bununla birlikte, salt okunur olmaları, kendi değerlerinin sabit kalacağının garantisi değildir.
Diyelim ki çok açıklamak niyetim bu…
Idsabit bir değeri temsil eder (bu nedenle güvenli bir şekilde önbelleğe alınabilir)IsInvalidatedbirIXnesnenin ömrü boyunca değerini değiştirebilir (ve önbelleğe alınmamalıdır).
interface IXBu 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ğerininIsInvalidatedbundan 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
…Changedetkinliğin varlığı,IsInvalidatedbu özelliğin değerini değiştirebileceğini belirtir ve benzer bir etkinliğin olmaması,Idsö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
IsInvalidatedbir 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?