2010-08-24 44 views
2

我可以用更簡單,更易於閱讀的方式編寫以下邏輯嗎?下面做什麼,我需要的,但它是非常混亂:這個if-else-else邏輯可以被重寫成更整潔的東西嗎?

if (IsChanged == true) 
{ 
    return; 
} 

else if (Status == "" && IsChanged == false) // Executed when the close (x) button is pressed, as the Status string is not yet set to a real value... 
{ 
    CancelClose(); 
} 

else if (IsChanged == false && Status == "saving") // saving logic falls to here... 
{ 
    // IsChanged = false; 
} 

感謝

+12

'==(true | false)'是魔鬼。我說,魔鬼! – delnan 2010-08-24 16:31:08

+0

是的,用'!IsChanged'與'IsChanged == False'一起去# – Skilldrick 2010-08-24 16:34:31

+1

使用字符串。空不是「」,以避免不必要的對象創建 – 2010-08-24 16:37:18

回答

12

這是一個有點清潔:

if (IsChanged) 
{ 

} 
else if (Status == "saving") 
{ 

} 
else if (Status == "") 
{ 

} 
else 
{ 

} 

我會建議您使用enum來表示狀態。這將允許您的代碼被強制輸入。

public enum Status 
{ 
    Closing, 
    Saving, 
    Changed, 
} 

然後,您可以使用一個不錯的switch語句來決定採取什麼操作。

switch (_status) 
{ 
    case Status.Saving: 
     break; 
    case Status.Closing: 
     break; 
    case Status.Changed: 
     break; 
    default: 
     break; 
} 
+0

如果使用枚舉,則不檢查其他情況下的狀態==「」 – recursive 2010-08-24 16:29:50

+2

+1。 – Charles 2010-08-24 18:02:41

20
if (isChanged) return; 

switch (Status) { 
    case "": 
     CancelClose(); 
     break; 
    case "saving": 
     // IsChanged = false; 
     break; 
} 

這大約是整齊的,因爲它得到。請注意,因爲如果isChanged爲true,您可以進一步始終假定isChanged爲false。

+0

我認爲這是解決雙方最有效的解決方案。 – Jookia 2010-08-24 16:30:50

+0

「if(isChanged == true)」可以重寫爲「if(isChanged)」。 – TrueWill 2010-08-24 16:34:04

+0

可以保存'== true'部分 – 2010-08-24 16:34:07

1

是:

if (IsChanged) return; 
    if (String.IsNullOrEmpty(Status)) CancelClose(); 
+1

這是不完整的。你錯過了一個實際的保存邏輯 - 你不想陷入如果CancelClose被調用。 – 2010-08-24 16:29:30

+0

我上面的東西等同於示例,因爲無論如何都不會發生在最後一個塊中(除非狀態屬性除了返回字符串值之外還有一些副作用,這會非常糟糕......) – 2010-08-24 19:40:13

4
if(IsChanged) 
    return; 

if(Status == "saving") 
{ 
    // save  
} 
else if(string.IsNullOrEmpty(Status)) 
{ 
    CancelClose();  
} 
+0

絕對沒有關係,檢查'isChanged'是否爲false時它會返回如果它是真的 – Skilldrick 2010-08-24 16:29:47

+0

在其他情況下不檢查狀態==「」 – recursive 2010-08-24 16:30:16

+2

如果有更多的狀態選項可用,這將失敗 – 2010-08-24 16:32:47

0

它可以以

if (IsChanged) 
    { 
     return; 
    } 

    else if (Status == "") // Executed when the close (x) button is pressed, as the Status string is not yet set to a real value... 
    { 
     CancelClose(); 
    } 

    else if (Status == "saving") // saving logic falls to here... 
    { 
     //  IsChanged = false; 
    } 

你不需要== true在第一次檢查,因爲它已經是真還是假來simplifed。你不需要在其他選擇中檢查錯誤,因爲如果它不是真的,它肯定是錯誤的。

2

既然你返回,如果IsChanged == true,你不需要它在其他ifs。

if (IsChanged == true) 
     return; 

    switch (Status) 
    { 
     case "": 
     CancelClose(); 
     break; 
     case "saving": 
     break; 
    } 
+1

我傾向於避免少數字符串的'switch'語句 – ChaosPandion 2010-08-24 16:29:22

+0

我認爲優勢在這種情況下switch語句的s就是這樣。您可以很容易地看到流程將如何取決於狀態(並且沒有其他變量),並且可以輕鬆想象根據狀態的新值添加更多情況。 – HaskellElephant 2010-08-24 16:41:01

0
if (IsChanged) return; 

if (Status == "saving") 
{ 
    //IsChanged = false; 
} 
else if (Status = "") 
{ 
    CancelClose(); 
} 

我會避免用大寫字母開頭的變量名。

+0

您可以將其他大塊中的所有內容全部取出。 – recursive 2010-08-24 16:31:06

+0

也許'IsChanged'和'狀態'是屬性? – 2010-08-24 16:33:07

+0

這些是屬性名稱,屬性名稱通常以大寫字母開頭。另一種方法就像私人的_isChanged。 – Thorsten79 2010-08-24 16:34:16

1
  • 切第一個else if if just if。如果IsChanged爲真,那麼「其他」將永遠達不到。
  • 從其他ifs中刪除IsChanged == false,因爲它們始終爲真。
  • 想想你的狀態的枚舉而不是字符串。

我建議:

if (IsChanged) 
{ 
     return; 
} 

if (CurrentStatus == Status.None) 
{ 
    CancelClose(); 
    return; 
} 

if (CurrentStatus == Status.Saving) 
{ 
    //  IsChanged = false; 
} 
1
if(!IsChanged) { 
     if (Status == "saving") // saving logic falls to here... 
     { 
      //  IsChanged = false; 
     } 
     else if (Status == "") // Executed when the close (x) button is pressed, as the Status string is not yet set to a real value... 
     { 
      CancelClose(); 
     } 
    } else { 
     return; 
    } 
0
if (IsChanged) 
    return; 

if (String.IsNullOrEmpty(Status)) // better use this unless you would like a 
    CancelClose();     // nullPointerException 

else if (Status.equals("Saving")) 
    // whatever you want for save 
0

我不熟悉C#,但it supports the conditional operator

condition ? first_expression : second_expression; 

由於我不熟悉C#,我不會嘗試重新編寫代碼,但無論如何,三元運算符可以導致在某些地方令人愉快的簡潔秒。

相關問題