.NETプロパティに関する設計上の問題があります。
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
問題:
このインターフェイスには、2つの読み取り専用プロパティとがId
ありIsInvalidated
ます。ただし、それらが読み取り専用であるという事実は、それらの値が一定のままであることを保証するものではありません。
それを非常に明確にすることが私の意図だったとしましょう…
Id
定数値を表します(したがって、安全にキャッシュできます)。IsInvalidated
IX
オブジェクトの存続期間中にその値を変更する可能性があります(したがって、キャッシュすべきではありません)。
interface IX
その契約を十分に明確にするためにどのように変更できますか?
私自身の解決策の3つの試み:
インターフェイスはすでに適切に設計されています。呼び出されたメソッドの存在
Invalidate()
により、プログラマは、同様の名前のプロパティの値IsInvalidated
が影響を受ける可能性があることを推測できます。この引数は、メソッドとプロパティの名前が似ている場合にのみ有効です。
このインターフェースをイベントで拡張します
IsInvalidatedChanged
:bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
の
…Changed
イベントの存在は、IsInvalidated
このプロパティがその値を変更する可能性があることを示し、同様のイベントが存在しないことは、Id
そのプロパティがその値を変更しないという約束です。私はこのソリューションが好きですが、それはまったく使われないかもしれない追加のものがたくさんあります。
プロパティ
IsInvalidated
をメソッドに置き換えますIsInvalidated()
:bool IsInvalidated();
これはあまりにも微妙な変更かもしれません。値は毎回新しく計算されるというヒントになるはずです-定数である場合は必要ありません。MSDNのトピック「プロパティとメソッドの選択」には、次のように書かれています。
次の状況では、プロパティではなくメソッドを使用してください。[…]パラメータが変更されていなくても、操作は呼び出されるたびに異なる結果を返します。
どのような答えが期待できますか?
私は、問題に対するまったく異なる解決策と、上記の試みをどのように打ち負かすかについての説明に最も興味があります。
私の試みが論理的に欠陥があるか、まだ言及されていない重大な欠点があり、解決策が1つしか残っていない(または何も残っていない)場合、どこで間違ったのかを聞きたいと思います。
欠陥が軽微であり、それを考慮した後、複数の解決策が残っている場合は、コメントしてください。
少なくとも、どちらがあなたの優先解決策であり、どのような理由であるかについてのフィードバックをお願いします。
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
、たとえばs について心配する必要はないはずですが、これが理論的にも可能かどうかはわかりません。しかし、いいでしょう。
IsInvalidated
必要としませんprivate set
か?