2016-03-01 166 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類很有幫助。它可以生成構造函數並使用現有構造函數初始化屬性。

無論如何我會在代碼審查中失敗的代碼。

相關問題