2011-01-07 53 views
4

我正在驗證表單上的輸入,並試圖根據所用控件的組合提示用戶輸入了不正確的輸入。如果陳述過於複雜,這是多行嗎?

例如,我有2個組合框和3個文本框。 2個組合框必須始終具有除第一個(默認)值之外的其他值,但可以填充三個或兩個三個或所有文本框中的一個,以使表單有效。

在一個這樣的場景我有一個6行,如果語句儘量使測試容易閱讀:

if ((!String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString()) 
    && !String.IsNullOrEmpty(TextBoxA.Text) 
    && !String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString()))   
    || 
    (!String.IsNullOrEmpty(TextBoxB.Text) 
    || !String.IsNullOrEmpty(TextBoxC.Text))) 
{ 
    //Do Some Validation 
} 

我有2個問題:

  1. 如若這種類型如果的不惜一切代價避免聲明?

  2. 用另一種方法包裝這個測試會更好嗎? (這將是一個不錯的選擇,因爲此驗證將發生在多個場景中)

感謝您的輸入!

+3

它打敗其冷凝成一行。 – BoltClock 2011-01-07 16:47:57

+2

可能是題外話:我通常更喜歡`TextBoxA.Text.Trim()`來確保輸入的空白​​不計算在內。 – 2011-01-07 16:49:33

回答

10

在這種情況下,我發現將if語句中的某些邏輯移出一些更有意義的布爾值可能會有所幫助。例如。

bool comboBoxASelected = !String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString()); 
bool comboBSelected = !String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString()); 
bool textBoxAHasContent = !String.IsNullOrEmpty(TextBoxA.Text); 
bool textBoxBHasContent = !String.IsNullOrEmpty(TextBoxB.Text); 
bool textBoxCHasContent = !String.IsNullOrEmpty(TextBoxC.Text); 

bool primaryInformationEntered = comboBoxASelected && textBoxAHasContent && comboBSelected; 
bool alternativeInformationEntered = textBoxBHasContent || textBoxCHasContent; 

if (primaryInformationEntered || alternativeInformationEntered) 
{ 
    //Do Some Validation 
} 

顯然,命名組合框和文本框以反映其實際內容。當有人不得不在邏輯上花費幾個月的時間,他們會感謝你。

4
  • a)不必不惜一切代價避免。代碼起作用。但它肯定是混亂的,令人困惑的,我認爲可能難以維持。
  • b)是的。給它一個相關的名字,以便代碼讀者知道那裏發生了什麼。
2

我個人不會遇到像這樣的代碼的大問題。 (你最後一組圓括號看起來沒有必要。)

通常,我想讓我的if語句更簡單。但是你的所有條件都很簡單。如果你真的需要測試那麼多測試,那麼我會保持它的樣子。

1

這是不是很可讀是的。但是你可以縮短:

ComboBoxA.SelectedValue.ToString()!=DEFAULT_COMBO_A_CHOICE 

我相信DEFAULT_COMBO_A_CHOICE是字符串的ToString SI superflous已經:

!String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString() 

也可以書面。

也parenthese周圍

(!String.IsNullOrEmpty(TextBoxB.Text) 
|| !String.IsNullOrEmpty(TextBoxC.Text)) 

是沒有必要的。

1

應該避免IMO這樣的條件(儘管不是所有成本)。他們很難閱讀維護。

有這樣做

嘗試和組根據他們所代表的行爲條件的幾種方法。例如

if (OrderDetailsSelected() && ShippingAddressProvided()) 
{ 

這樣您還可以避免您的表單中條件的重複。

其次,你可以使用Boolean Algebra簡化表達和

使用Extract Method重構移動條件下,這是很難的函數來讀取,以避免重複,使他們更具可讀性。

例如,條件

String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString()) 

可以被提取到一個函數

private bool IsDefaultA() { return ... }