给出以下基类的场景:
internal class ResolveVariableStrategyBase
{
...
protected static EntityFieldVariable EntityFieldVariable { get; private set; }
protected static EntityPropertyLoader EntityPropertyLoader { get; private set; }
protected static FunctionInvoker FunctionInvoker { get; private set; }
protected static string Variable { get; private set; }
protected static object EntityValue { get; private set; }
protected static object VariableValue { get; set; }
...
protected ResolveVariableStrategyBase() { }
internal ResolveVariableStrategyBase(
EntityFieldVariable entityFieldVariable,
EntityPropertyLoader propertyLoader,
FunctionInvoker functionInvoker,
string variable,
object entityValue,
object variableValue)
{ ... }
internal virtual object Execute() { ... }
}
这样的几个派生类:
internal sealed class RelationStrategy : ResolveVariableStrategyBase
{
internal override object Execute()
{
var result = resolveRelation();
base.VariableValue = result;
return resolveRelation();
}
...
}
真是个好主意
在基类中有静态属性,以便为所有派生类编写基本类的相同(内部)构造函数,所有参数都设置基类的字段,如下所示:
internal RelationStrategy(
EntityFieldVariable entityFieldVariable,
EntityPropertyLoader propertyLoader,
FunctionInvoker functionInvoker,
string variable,
object entityValue,
object variableValue) : base (entityFieldVariable,propertyLoader,functionInvoker,variable,entityValue,variableValue)
或者这只是懒惰优先于精心设计的代码吗?
什么是最佳解决方案?
答案 0 :(得分:1)
这个问题是静态变量跨实例和跨线程共享。这非常容易出错,因为您必须确保全局不变量,即不能同时实例化两个这样的类。此外,递归实例化不再可能(可以说是一个更人为的场景)。
在大型代码库中维护这样的全局不变量是乏味且容易出错的。
我通常使用Resharper生成委托给基础构造函数的构造函数。我认为Alt+Ins, Up, Space, Enter
是完全生成所有代码的关键序列。
也许您可以将所有这些值打包到DTO类中,以便更容易传递。 Resharper对管理DTO课程有很大的支持。它可以生成构造函数并使用现有构造函数初始化属性。
在任何情况下,我都会在代码审查中失败该代码。