.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();