【问题标题】:Are protected static properties in base classes good practice to share data between derived classes?基类中受保护的静态属性是在派生类之间共享数据的好习惯吗?
【发布时间】:2016-06-13 17:15:32
【问题描述】:

给定以下具有这样一个基类的场景:

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)

或者这只是懒惰优先于精心设计的代码?

什么是最优解?

【问题讨论】:

  • 这是一个快速的解决方法,但代码的作者可能有其他解释,应该听到。
  • 我对这段代码感觉不太好,想知道是否必须更改它。我自己编写了它,试图将现有功能重构为策略模式,但我并不完全幸运,因为我不确定这些静态属性是否是好的设计。
  • 如果它有效,请不要修复它。 KISS 原则在这里很有帮助,因为我相当确定即使您不想向客户端发布蹩脚的代码,您也真的不想通过不必要的重构引入新的未知错误甚至没有被破坏的代码。
  • 那么,如果我必须为尚不存在的代码做出设计决定,那么以这种方式实现它是否是一个好习惯?
  • 不幸的是,有时良好实践会阻碍快速解决方案:/只要它有效,我认为它没有什么可怕的。但这并不完美,可能比在最上层的基类中拥有 static 成员更好。

标签: c# oop properties static


【解决方案1】:

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

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

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

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

无论如何,我都会在代码审查中失败该代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多