.net 为进行资源密集型设置的类进行适当的设计

.net 为进行资源密集型设置的类进行适当的设计,.net,oop,.net,Oop,我有一个类,它执行资源密集型调用来填充其数据。标准的东西。这是一个简化的版本 public class Foo1 { private bool _IsLoaded; private string _Prop; private string _Prop2; public string Prop1 { get { ResourceIntensiveCall(); return _Prop1;

我有一个类,它执行资源密集型调用来填充其数据。标准的东西。这是一个简化的版本

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规则UseProperties,因为该属性做了太多的工作(尽管是间接的),因此不适当

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

我可以用函数代替属性,但是如果你有很多函数,这会让你觉得很麻烦。不管怎样,只有第一个客户端调用才能完成真正的工作

我可以使用一个Public Init()方法,客户机代码在访问任何属性之前必须调用该方法,但这是一个不允许的设计,因为它使类太脆弱

我考虑使用Foo1Factory来创建Foo1对象,并将Foo1构造函数标记为内部,以防止世界绕过我的工厂

对于这种情况,什么是合适的设计

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

不管怎样,只有第一个客户端调用才能完成真正的工作

鉴于每个实例似乎只需要调用一次(我的假设是,整个过程可能只需要调用一次),我会在构造函数中执行,因为其他选项更糟糕


属性或方法中重复的代码违反了DRY,而
Init
方法就像是有人忘记的东西。

我最后做的是将属性提取到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();