2017-07-31 10 views
0

この文をリファクタリングして条件を少なくするための最良の方法は何でしょうか?イムSomoneのは、私はコードを減らすために裸のminumum条件を使用する方法がある場合は文を少なくするためのコードをリファクタリングする

try 
{ 
    var errorProviders = new List<ErrorProvider>() { epEmail, epAlternative, epMobile, epTown, epLandline, epHouseName, epForeName, epSurname, epPostcode, epCountry, epHouseName, epLocality, epCounty }; 

    foreach (Control c in panel1.Controls) 
    { 
     if (c is SpellBox || c is TextBox) 
     { 
      if (!string.IsNullOrWhiteSpace(txt_ForeName.Text) | !string.IsNullOrWhiteSpace(txt_SurName.Text)) 
      { 
       if (cmb_Title.SelectedIndex != -1) 
       { 
        if (cmb_PrefConTime.SelectedIndex != -1) 
        { 
         if (isPhoneNumber()) 
         { 
          if (errorProviders.Any(e => e.GetError(c).Length > 0)) 
          { 
           return false; 
          } 
         } 
         else 
         { 
          epPrefConNumber.SetError(cmb_PrefConNumber, "Error"); 
          return false; 
         } 
        } 
        else 
        { 
         epPrefConTime.SetError(cmb_PrefConTime, "Error in: prefered contact time feild"); 
         return false; 
        } 
       } 
       else 
       { 
        epTitle.SetError(cmb_Title, "Title"); 
        return false; 
       } 
      } 
      else 
      { 
       epBothNames.SetError(txt_SurName, "Error:"); 
       epBothNames.SetError(txt_ForeName, "Error:"); 
       return false; 
      } 
     } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString())+ "Error has occurred, Please cancel and try again!"); 
} 
return true; 

非常にgratefullだろう正しい方向に私を指すことができれば、同じ機能を持つことなく、この文をクリーンアップするreallt strucggling?

+0

私の主な関心事は、実際には、条件内の深い単一の場所で 'c'を使用することだけです。一度ではなく、いつもそれらのすべてを評価するのはなぜですか? (私はまた、 "行の書式設定後のコード"に対して強く勧めたいが、それは別の問題だ...) –

+0

@JonSkeet実際には3回使用される。 foreachの直下で初めて使用されています。 –

+0

@MaxPlay:申し訳ありません、はい - foreachではなく、そのトップレベル内にあることを意味しました。私の悪い。 (しかし、型のテストと 'Any(e => e.GetError(c)) 'の呼び出しの間には' c'は含まれません)。 –

答えて

1

これらの条件をすべて確認する必要がある場合は、これらの条件をすべてチェックする必要があります。私の意見では、最も重大な問題は、ループ内のコントロールとはまったく関係のない深いネスティングと検証フィールドです。 if条件を逆にして早期に返すことで、ネスティングを修正できます。残りの部分については、無関係な検証をループ外に移動してください。

try 
{ 
    var errorProviders = new List<ErrorProvider>() { epEmail, epAlternative, epMobile, epTown, epLandline, epHouseName, epForeName, epSurname, epPostcode, epCountry, epHouseName, epLocality, epCounty }; 

    if (string.IsNullOrWhiteSpace(txt_ForeName.Text) && string.IsNullOrWhiteSpace(txt_SurName.Text)) 
    { 
     epBothNames.SetError(txt_SurName, "Error:"); 
     epBothNames.SetError(txt_ForeName, "Error:"); 
     return false; 
    } 

    if (cmb_Title.SelectedIndex == -1) 
    { 
     epTitle.SetError(cmb_Title, "Title"); 
     return false; 
    } 

    if (cmb_PrefConTime.SelectedIndex == -1) 
    { 
     epPrefConTime.SetError(cmb_PrefConTime, "Error in: prefered contact time feild"); 
     return false; 
    } 

    if (!isPhoneNumber()) 
    { 
     epPrefConNumber.SetError(cmb_PrefConNumber, "Error"); 
     return false; 
    } 

    foreach (Control c in panel1.Controls.Where(x => x is SpellBox || x is TextBox)) 
    { 
     if (!errorProviders.Any(e => e.GetError(c).Length > 0)) 
     { 
      return false; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString())+ "Error has occurred, Please cancel and try again!"); 
} 
return true; 
+0

あなたの答えがありがとう、ありがとう、私はループ内ですべての検証をする必要はありませんでした。最初にタイプをチェックしなければならないと思った。私はおそらくちょうどforeachを使用してパネル自体をチェックすることもできないと思っていた –

関連する問題