正确设计适合资源密集型设置的类

时间:2012-09-28 19:25:48

标签: .net oop

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

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以防止世界绕过我的工厂。

对于这种情况,什么被认为是合适的设计?

2 个答案:

答案 0 :(得分:0)

  

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

     

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

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

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

答案 1 :(得分: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();