2015-12-10 179 views
3

我得到了一個我製作了靜態的類,但這是一個糟糕的選擇嗎?它應該是一個非靜態類嗎?使用靜態或非靜態類

我想在我的班級中設置兩個值。

當你給屬性值設置它們並獲取它們時會有某種衝突嗎?有沒有什麼機會?如果另一個用戶具有相同的目標。

我有一個頁面調用這個類。 一位用戶點擊該頁面,發生這種情況。

  1. 設置屬性的計算
  2. 運行的空隙來計算兩個屬性
  3. 「也許一些其他的功能,運行和需要一些時間」
  4. 獲取兩個屬性的值

但是如果其他用戶擊中頁面並設置其他值並使第一個用戶的值不正確,該怎麼辦?我想這可能嗎?

我想到了一些其他的選擇是要麼

  • 發送所有屬性到空隙作爲參數,並與我的兩個值,我需要回到一個新的類。 (不要將它們存儲爲靜態屬性,在使用之前可以由其他用戶更改)。
  • 使用屬性(可能稱爲BreakTime)創建一個新類。將其作爲一個參數發送給void。計算後返回。
  • 或者你告訴我什麼是最好的選擇! :)

這裏怎麼看起來:

public static class BreakTimeCalculator 
{ 
    public static int BreakFromSec { get; private set; } 
    public static int BreakUntilSec { get; private set; } 
    public static int CustomBreakSec { get; set; } 
    public static int FromSec { get; set; } 
    public static int UntilSec { get; set; } 
    public static int Equlizer { get; set; } 

    public static void CalculateBreakFromAndBreakeUntil() 
    { 
     var taskLength = UntilSec - FromSec; 
     var middleOfTask = FromSec + (taskLength/2); 
     var secondsToMoveLeft = middleOfTask % 300; 
     var amountEqualizers = CustomBreakSec/Equlizer; 
     var fiftyFifty = amountEqualizers % 2 == 0; 
     var leftSideEqualizers = fiftyFifty ? amountEqualizers/2 : (amountEqualizers/2) + 1; 

     BreakFromSec = middleOfTask - secondsToMoveLeft - (leftSideEqualizers * Equlizer); 
     BreakUntilSec = BreakFromSec + CustomBreakSec; 
    } 
} 
+0

簡單地說,如果你需要使一個類是靜態的,而不是如果可能的話。我懷疑這是否是這種情況。通常這應該很少發生(例如,在包含擴展方法的類上)。 – HimBromBeere

+1

@HimBromBeere,我會遵循這樣的規則:「如果可以的話,讓一個類變成靜態的,如果你有狀態,那麼你就不能」。 –

+0

@DavidArno嗯,你可以爲靜態對象提供(單一)狀態,但是它的設計很糟糕。然而,「當你可以」的時候,我認爲它的語法正確。 – HimBromBeere

回答

6

從不創建靜止狀態,除非你真的,真的要因爲如果你這樣做,你會爲自己設定了一個秋天。你讓測試變得更加困難,並且使得線程衝突的可能性(如你所描述的)發生得更高。

如果您必須在類中設置狀態,然後調用方法,而不是僅將值作爲參數傳遞給方法,請將其設置爲非靜態類。另外,您最好通過構造函數傳遞值,而不是使用屬性。如上所述,我對待您的問題的方法是創建一個POCO來保存結果數據並使用靜態方法進行計算。使用C#6語法,它看起來像這樣:

public class BreakTimeResult 
{ 
    public BreakTimeResult(int breakFromSec, int breakUntilSec) 
    { 
     BreakFromSec = breakFromSec; 
     BreakUntilSec = breakUntilSec; 
    } 

    public int BreakFromSec { get; } 
    public int BreakUntilSec { get; } 
} 


public static class BreakTimeCalculator 
{ 
    public static BreakTimeResult CalculateBreakFromAndBreakeUntil(int customBreakSec, 
                    int fromSec, 
                    int untilSec, 
                    int equlizer) 
    { 
     var taskLength = untilSec - fromSec; 
     var middleOfTask = fromSec + (taskLength/2); 
     var secondsToMoveLeft = middleOfTask % 300; 
     var amountEqualizers = customBreakSec/equlizer; 
     var fiftyFifty = amountEqualizers % 2 == 0; 
     var leftSideEqualizers = fiftyFifty 
      ? amountEqualizers/2 
      : (amountEqualizers/2) + 1; 

     var breakFromSec = middleOfTask - secondsToMoveLeft - (leftSideEqualizers * equlizer); 
     var breakUntilSec = breakFromSec + customBreakSec; 
     return new BreakTimeResult(breakFromSec, breakUntilSec); 
    } 
} 
+0

分離哪些變化與什麼不...好點:-) – Philippe