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

我可以将调用移至构造函数,但这违反了在构造函数中做太多工作的规则。

无论如何,只有第一个客户调用才能真正发挥作用。

看到您似乎只需要对每个实例进行一次调用我的假设 - 整个过程可能是一次),我会在构造函数中这样做,因为其他选项更糟。

属性或方法中的重复代码违反了 DRY,并且Init方法可能会让人忘记。

于 2012-09-28T19:28:55.943 回答
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 回答