2010-01-13 51 views
2

我一直在尋找改善以下代碼重構的意見/想法需要

static void Main(string[] args) 
{ 
    bool validInput1 = false; 
    string input1 = string.Empty; 
    bool validInput2 = false; 
    string input2 = string.Empty; 

    bool validFilePath = false; 
    string filePath = string.Empty; 


    try 
    { 
     Console.WriteLine("Import process started."); 

     while (!validFilePath) 
     { 
      Console.Write("Please enter the full path to the file you would like to import: "); 
      filePath = Console.ReadLine().Replace("\"",""); 
      if (File.Exists(filePath)) 
       validFilePath = true; 
     } 

     while (!validInput1) 
     { 
      Console.Write("Enter a valid eventID the import file: "); 
      input1 = Console.ReadLine(); 
      if (ValidEventID(input1.Trim().Length)) 
       validInput1 = true; 
     } 

     while (!validInput2) 
     { 
      Console.Write("Enter a valid import type code: "); 
      input2 = Console.ReadLine(); 
      if (input2.Trim().ToUpper() == "EX" || input2.Trim().ToUpper() == "EL") 
       validInput2 = true; 
     } 


     var records = Utilities.ParseCSV(filePath); 
     var import = new Import 
     { 
      EventId = input1, 
      ImportType = input2 
     }; 


     import.ImportEventDates(records); 

     Console.WriteLine("Import process completed."); 
     Console.ReadLine(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Error encountered"); 
     Console.WriteLine(ex.ToString()); 
     Console.ReadLine(); 
    } 
} 

預先感謝任何幫助

回答

4

我會寫一個簡單的方法來檢索和驗證用戶輸入:

public static string PromptUntilValid(string promptText, Func<string, bool> validationPredicate) 
{ 
    string input; 
    do 
    { 
     Console.Write(promptText); 
     input = Console.ReadLine(); 
    } while (!validationPredicate(input)) 
    return input; 
} 

這將允許你的代碼進行重構如下:

... 

    filePath = PromptUntilValid(
     "Please enter the full path to the file you would like to import: ", 
     s => File.Exists(s)); 

    input1 = PromptUntilValid(
     "Enter a valid eventID the import file: ", 
     s => ValidEventID(s.Trim().Length)); 

    input2 = PromptUntilValid(
     "Enter a valid import type code: ", 
     s => s.Trim().ToUpper() == "EX" || s.Trim().ToUpper() == "EL"); 

    ... 
+0

謝謝!這確實看起來比多個while循環更好。 = D – AlteredConcept 2010-01-13 00:51:14

+0

這也比我的好多了。 – mnuzzo 2010-01-13 00:54:46

0

你可以嘗試服用while循環並把它們每一個都有自己的想法這些函數返回有效的文件路徑,並在被捕獲時輸入並拋出異常。例如:

public string FindValidFilepath() 
{ 
    string filePath = string.Empty 
    try{ 
     while (!validFilePath) 
     { 
      Console.Write("Please enter the full path to the file you would like to import: "); 
      filePath = Console.ReadLine().Replace("\"",""); 
      if (File.Exists(filePath)) 
       validFilePath = true; 
     } 
    } catch (Exception ex) { 
     throw; 
    } 
    return filePath 
} 

並從Main函數調用它。如果你需要添加代碼,你可以做的其他事情會減少錯誤,就是在你的If語句中放置大括號{{,圍繞代碼。雖然沒有它們在語法上是合法的,但它會在稍後彈出一個錯誤。我一直被這樣的錯誤所困擾。

編輯:重新拋出此異常是爲了使原始Try-Catch塊可以保持原位。另外,我已經瞭解到「throw ex」會丟失堆棧跟蹤,但只是「throw」會保留它。我已經糾正了這個問題。

編輯2:我想到的還有一件事,嘗試捕獲特定的異常並輸出特定的錯誤,以解釋用戶出錯的原因,以便他們更好地理解問題。大多數用戶不理解堆棧跟蹤,除非輸出堆棧跟蹤是必需的。

另外,請原諒任何小的語法錯誤,我比Java更熟悉Java而不是C#。

+0

-1'趕上(異常前){throw ex;}'這會丟失堆棧跟蹤。如果你不打算解決這個問題,就不要抓住例外。 – 2010-01-13 00:45:12

+1

確實'throw'比'throw ex'更好,但是如果你在catch塊中沒有做任何事情,try/catch塊仍然是無用的......只要讓異常冒出堆棧並被下一個抓住嘗試/ catch塊 – 2010-01-13 01:02:14

+0

Oy,我的Java熟悉再次咬我。在Java中,您必須指定何時拋出異常。我會離開它,因爲它仍然是有效的代碼,如果他們想要的話可​​以把其他東西放在那裏。 – mnuzzo 2010-01-13 01:07:40