0

リソースを大量に消費する呼び出しを実行してデータを入力するクラスがあります。標準的なもの。ここに簡略化されたバージョンがあります...

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 にマークして、世界が私の工場をバイパスしないようにすることを考えました。

このシナリオの適切な設計と見なされるものは何ですか?

4

2 に答える 2

0

私がやったことは、自分のプロパティを DataTransferObject に抽出することです。

public class Foo1Return {
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

Foo1 には、計算を実行して DTO を返すメソッドがあります。

public class Foo1 {
    public Foo1Return GetFoo1Results() {
        // Do processing...
        Foo1Return output = new Foo1Return();
        output.Prop1 = "something";
        output.Prop2 = "stuff";
        return output;
    }
}

クライアントコードの例:

Foo1 obj = new Foo1();
Foo1Results results = obj.GetFoo1Results();
于 2012-09-28T21:47:51.240 に答える
0

呼び出しをコンストラクターに移動することもできますが、それはコンストラクターでの作業が多すぎるという規則に違反しています。

とにかく、最初のクライアント呼び出しだけが実際の作業を行います。

インスタンスごとに1回だけ呼び出しを行う必要があるように見えるので(私の仮定-プロセス全体で1回である可能性があります)、他のオプションの方が悪いため、コンストラクターで行います。

プロパティまたはメソッドで繰り返されるコードは DRY に違反し、Initメソッドは誰かが忘れるもののようになります。

于 2012-09-28T19:28:55.943 に答える