我正在为我的工作重构一些旧代码.一些白痴(我,2年前)写了一些我觉得很臭的东西.我有这种感觉(我可能会在某处阅读并忘记源代码)C#中的构造函数应该快速返回,因为有一些技术细节,可能与垃圾收集有关.即以下
class A
{
public object Result {get; private set;}
private object RunLongOperation(){/* ... */}
public A(){
Result = RunLongOperation();
}
}
Run Code Online (Sandbox Code Playgroud)
是不好的做法.所以我的问题是双重的 - 它真的很糟糕,如果是这样,为什么呢?以上可以改写为
class A
{
public object Result {get; private set;}
private static object RunLongOperation(){/* ... */}
private A() { }
public static A Make(){
return new A { Result = RunLongOperation() };
}
}
Run Code Online (Sandbox Code Playgroud)
通过一种工厂静态方法.这对我来说似乎代码不是必要的,但实际的对象很快就构建了.
为了照亮光线,构造函数会获取一些参数并渲染图像RunLonOperation(),并根据输入参数执行其他一些操作.然后该类缩减为不可变结果容器.根据参数,操作大约需要10到20秒.
我不认为存在构造函数不应超过一定时间的技术要求(例如 GC)。然而,从程序员的角度来看,我当然不希望new-ing 一个对象会花费很长时间。对我来说,工厂方法似乎更适合这种用途。
您还可以考虑删除长时间运行的操作并将结果注入到构造函数中,然后使用 a RenderImageFactory。将使该过程更加明显,并可能有助于单元测试(意思是:如果您想要将 Tets A 类单元化,您可能不希望每次都渲染图像,而是能够模拟它以加快速度并减少测试设置开销)