2012-06-26 99 views
1

,你會在這種情況下做些什麼來減少圈Complexty如何降低圈複雜的if-else語句

if (Name.Text == string.Empty) 
    Name.Background = Brushes.LightSteelBlue; 

else if(Age.Text == string.Empty) 
    Age.Background = Brushes.LightSteelBlue; 

else if(...) 
    ... 

else 
{ 
    // TODO - something else 
} 

讓我們假設我有30個或更多。

+12

我認爲減少圈複雜性本身不應該是一個目標。編寫可讀代碼應該。 – svick

+0

是名稱,年齡等,多態,還是他們共享一個有用的基類? – GregRos

+3

你確定這是做你想做的事嗎?你想只設置一種背景顏色嗎?或者您是否希望_every_項目的背景設置爲空? – NominSim

回答

2

它看起來像你在每個「文本框」(至少我認爲他們是文本框)執行相同的邏輯。我建議把所有的人都到一個集合並執行以下邏輯:

// Using var, since I don't know what class Name and Age actually are 
// I am assuming that they are most likely actually the same class 
// and at least share a base class with .Text and .BackGround 
foreach(var textBox in textBoxes) 
{ 
    // Could use textBox.Text.Length > 0 here as well for performance 
    if(textBox.Text == string.Empty) 
    { 
     textBox.Background = Brushes.LightSteelBlue; 
    } 
} 

注:這會改變你的代碼了一下,因爲我注意到你只檢查一個「文本框」僅當值以前的文本沒有空文本。如果你想保持這個邏輯,只需在textBox.Background = Brushes.LightSteelBlue;之後放置一條break;語句,並且只有第一個空的「文本框」將設置其背景色。

+0

這不會執行與OP代碼相同的功能。 – NominSim

+0

@NominSim如果你在'if'裏面添加了一個'break',它會。 – svick

+0

@svick這將是接近的,你將不得不添加一些其他的條款來捕捉最後一種情況......我會反過來切換我的-1,但因爲OP已經指定它只是一個例子。 – NominSim

2

例如,對於這種混凝土情況下,你可以

  • 定義Dictionary<string, dynamic> dic,其中關鍵是字符串值和價值是動態的(名稱年齡 ...不管)

  • do dic [stringValue] .Background = Color.LightSteelBlue;

只是一個例子。

可能想要選擇dynamic與否。可能是一些更加直觀和易於理解,但其基本思想是:

化妝用字典的與主要基於if右值和的值等一些操作/方法/對象。

希望這會有所幫助。

+1

每次有人使用''dynamic''不是因爲互操作性,而是因爲他想用動態語言編寫代碼,所以小貓死在某處;)認真地說,爲什麼要使用強類型語言,如果你想做動態的東西?我不知怎的不喜歡它... –

+0

@PhilipDaubmeier:這就像打開你的翅膀,從山上跳下來。如果一個人不知道飛行,就不要跳。事實上,我解釋瞭解決方案背後的* basic *思想,並給出了一些自定義實現,可能*或*可能不會被選擇。 – Tigran

+0

是的,我明白你的觀點。我只想指出,在使用'dynamic''之前,人們應該考慮他們是否真的需要。 –

0

我完全同意svick的評論。在某些情況下,下面的方法可以很好(但不減少圈複雜度,通常創造可插拔決策者):

public class SwitchAction{ 
    public Func<bool> Predicate { get; set; } 
    public Action TheAction { get; set; } 
} 

public List<SwitchAction> SwitchableActions = new List<SwitchAction>(); 

public void InitialiseSwitchableActions() 
{ 
    SwitchableActions.AddRange(new[] { 
    new SwitchAction() { Predicate =() => Name.Text == string.Empty, 
          TheAction =() => Name.Background = Brushes.LightSteelBlue }, 
    new SwitchAction() { Predicate =() => Age.Text == string.Empty, 
          TheAction =() => Age.Background = Brushes.LightSteelBlue }, 
    }); 
} 

public void RunSwitchables() 
{ 
    var switched = SwitchableActions.FirstOrDefault(s => Predicate()); 

    if(switched != null) 
    switched.TheAction(); 
    else 
    //TODO: something else. 
} 

當然 - 如果實際上這些行動不是相互排斥的,你必須改變最後的方法一點點:

public void RunSwitchables() 
{ 
    bool runCatchAll = true; 
    foreach(var switched in SwitchableActions.Where(a => a.Predicate()) 
    { 
    switched.TheAction(); 
    runCatchAll = false; 
    } 

    if(runCatchAll) 
    //TODO: Something else. 
} 

雖然這些更可讀嗎?嗯...可能不是。