2016-03-01 29 views
2

考虑下列设想一个基类是这样的:受保护的基类中的静态属性在派生类之间共享数据的良好做法?

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

这是一个快速的解决方法,但代码的作者可能有其他解释应该被听到。 – Shark

+0

我对这段代码没有很好的感觉,并且想知道它是否必须改变。我自己写的是试图将现有的功能重构为战略模式,但我并不完全幸运,因为我不确定这些静态属性是否是好设计。 –

+0

如果有效,请不要修复它。 KISS原理在这里很有帮助,因为我在某种程度上相当确定,即使你不想向客户端发布蹩脚的代码,你也不希望通过不必要的代码重构来引入新的未知错误那甚至没有破裂。 – Shark

回答

1

问题在于静态变量是跨实例和跨线程共享的。这非常容易出错,因为您必须确保不会同时实例化两个这样的类的全局不变量。此外,递归实例化不再可能(可以说是一个更人为的场景)。

在大代码库中维护像这样的全局不变量是单调乏味且容易出错的。

我通常使用Resharper生成委托给基构造器的构造函数。我想,Alt+Ins, Up, Space, Enter是完全生成所有代码的关键序列。

也许你可以将所有这些值打包到DTO类中,以便它们更容易传递。 Resharper对管理DTO类很有帮助。它可以生成构造函数并使用现有构造函数初始化属性。

无论如何我会在代码审查中失败的代码。

相关问题