我有一个类执行资源密集型调用来填充其数据。标准的东西。这是一个简化的版本......
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以防止世界绕过我的工厂。
对于这种情况,什么被认为是合适的设计?
答案 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();