リソースを大量に消費する呼び出しを実行してデータを入力するクラスがあります。標準的なもの。ここに簡略化されたバージョンがあります...
public class Foo1 {
private bool _IsLoaded;
private string _Prop;
private string _Prop2;
public string Prop1 {
get {
ResourceIntensiveCall();
return _Prop1;
}
}
public string Prop2 {
get {
ResourceIntensiveCall();
return _Prop2;
}
}
private void ResourceIntensiveCall() {
if ((!_IsLoaded)) {
// Do processing...
_IsLoaded = true;
}
_Prop1 = "something";
_Prop2 = "stuff";
}
}
これは問題なく動作しますが、Microsoft.Design ルールの UsePropertiesWhereAppropriate に違反します。これは、プロパティが (間接的ではありますが) あまりにも多くの作業を行っているためです。
呼び出しをコンストラクターに移動することもできますが、それはコンストラクターでの作業が多すぎるという規則に違反しています。
プロパティの代わりに関数を使うこともできますが、関数がたくさんある場合は面倒です。とにかく、最初のクライアント呼び出しだけが実際の作業を行います。
クライアント コードがプロパティにアクセスする前に呼び出さなければならない Public Init() メソッドを使用することもできますが、クラスが脆弱になりすぎるため、これは設計上許されません。
Foo1Factory を使用して Foo1 オブジェクトを新規作成し、Foo1 コンストラクターを Internal にマークして、世界が私の工場をバイパスしないようにすることを考えました。
このシナリオの適切な設計と見なされるものは何ですか?