2011-09-08 273 views
6

我的代碼與if - else非常混亂,如果檢查正在進行。分支和嵌套分支的數量非常大(如果超過20個 - 否則如果嵌套也是如此)。這使得我的代碼更難以閱讀,並可能會成爲一個表現豬。對於很多從用戶等應用程序獲取條件,我的應用程序的檢查必須檢查所有的時間針對不同的情況,例如:嵌套'if' - 'else'語句

如果文本框中的文本不爲0,繼續下一個...

if ((StartInt != 0) && (EndInt != 0)) 
{ 

然後在這裏它檢查用戶是否已經選擇日期:

if ((datePickerStart.SelectedDate == null) || (datePickerEnd.SelectedDate == null)) 
{ 
    MessageBox.Show("Please Choose Dates"); 
} 

在這裏,如果datepickers不爲null,則繼續代碼...

else if ((datePickerStart.SelectedDate != null) && (datePickerEnd.SelectedDate != null)) 
{ 
    // CONDITIONS FOR SAME STARTING DAY AND ENDING DAY. 
    if (datePickerStart.SelectedDate == datePickerEnd.SelectedDate) 
    { 
     if (index1 == index2) 
     { 
      if (StartInt == EndInt) 
      { 
       if (radioButton1.IsChecked == true) 
       { 
        printTime3(); 
       } 
       else 
       { 
        printTime(); 
       } 
      } 

這只是檢查的一小部分。其中一些是功能,一些是輸入驗證的東西。

有沒有什麼辦法讓它更具可讀性和更少的性能豬?

+0

也許你應該在方法或事件前面進行驗證,如果你正在做它,就像(dtp.SelectedDate == null)return;比繼續進行信息處理。 – Burimi

+1

我有一個強烈的感覺SelectedDate是從日曆控件,這些永遠不能爲空,你需要檢查'datePickerStart.SelectedDate == DateTime.MinValue'。 –

+0

代碼運行良好,這不是我的問題。如果((StartInt!= 0)&&(EndInt!= 0)&&(EndInt!= 0)這個複雜的可讀性和性能如此分支 – Yosi199

回答

13

這不是一個表演豬。一篇關於如何解決這些常見問題的好博客文章是Flattening Arrow Code

+0

這看起來像我需要我會很快檢查出來並且回發 – Yosi199

2

一種方法是通過下列方式封裝複雜條件重構:

public bool DateRangeSpecified 
{ 
    get 
    { 
    return (datePickerStart.SelectedDate != null) 
      && 
      (datePickerEnd.SelectedDate != null) 
      && StartInt != 0 && EndInt != 0; 
    } 
} 

,然後使用這些「條件門面」的屬性

3

我在這裏看到的驗證一些組合。嘗試從其他移動一個領域,並分別對其進行驗證,這樣的事情:

if (StartInt == 0 || EndInt == 0) 
{ 
    MessageBox.Show("Please Choose Ints"); 
    return; 
} 
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null) 
{ 
    MessageBox.Show("Please Choose Dates"); 
    return; 
} 

在這種方法中,你會總是說什麼他做錯了用戶,並且你的代碼要簡單得多。從Jeff's blog

+0

)) { 不用於檢查用戶是否插入了int。它用於檢查2個文本框的輸入是否爲0。如果是,那麼做點什麼,或者做點別的。 就像我說的 一些if else語句是用於輸入驗證的,但其中大多數用於條件檢查。 – Yosi199

0

更多信息使用return聲明停止塊的執行。

例如,

void Test() 
{ 
    if (StartInt==0 || EndInt==0) 
    { 
     return; 
    } 

    if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null) 
    { 
     MessageBox.Show("Please Choose Dates"); 
     return; 
    } 
} 
0

一些輕微的重構使得它更易於閱讀我的眼睛。我刪除了多餘的括號併合並了多個真正只是AND邏輯的IF語句。

if (StartInt == 0 || EndInt == 0)  
    return; 
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null) 
{ 
    MessageBox.Show("Please Choose Dates"); 
    return;   
} 
if (datePickerStart.SelectedDate != null 
    && datePickerEnd.SelectedDate != null 
    && datePickerStart.SelectedDate == datePickerEnd.SelectedDate 
    && index1 == index2 
    && StartInt == EndInt) 
{ 
    if (radioButton1.IsChecked == true) 
     printTime3(); 
    else 
     printTime(); 
} 
0

您可以用有意義的名稱定義您自己的謂詞或泛型函數,並將您的邏輯封裝到這些謂詞中。

下面是一些謂詞代碼示例:

public Predicate<DateTime> CheckIfThisYear = a => a.Year == DateTime.Now.Year; 
public Func<DateTime, int, bool> CheckIfWithinLastNDays = (a, b) => (DateTime.Now - a).Days < b; 

現在你可以在你的代碼很容易地編寫

if (CheckIfThisYear(offer) && CheckIfWithinLastNDays(paymentdate,30)) ProcessOrder(); 

考慮使用泛型委託,像Func<>Delegate<>寫的小塊你使用lambda表達式的條件 - 它將節省空間並使您的代碼更易讀。