2010-01-13 5 views
2

Je cherchais des idées sur l'amélioration du code ci-dessousrefactorisation conseils/idées nécessaires

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(); 
    } 
} 

Merci d'avance pour toute aide

Répondre

4

j'écrire une méthode simple pour récupérer et valider les entrées utilisateur:

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

Cela permettrait à votre code à refactorisé comme suit:

... 

    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

Merci! Cela semble beaucoup plus agréable que les multiples boucles while. = D – AlteredConcept

+0

C'est aussi beaucoup mieux que le mien. – mnuzzo

0

Vous pouvez essayer de prendre le tout en boucles et de les mettre chacun dans leur propre fonctions qui renvoient le chemin de fichier valide et les entrées et lancent des exceptions si elles sont interceptées. Par exemple:

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 
} 

et l'appeler à partir de la fonction principale. D'autres choses que vous pouvez faire pour réduire les erreurs si vous devez ajouter du code est de mettre des accolades, {, autour du code dans vos instructions If. Bien que ne pas les avoir est syntaxiquement légal, il gardera une erreur de surgir plus tard. J'ai été mordu par une erreur comme ça dans le passé.

EDIT: La réitération de cette exception est telle que le bloc Try-Catch original peut rester en place. En outre, j'ai appris que "lancer ex" perd la trace de la pile mais simplement "jeter" la garde. J'ai corrigé ce problème.

EDIT 2: Encore une chose à laquelle j'ai pensé, essayez d'attraper des exceptions spécifiques et d'émettre une erreur spécifique expliquant ce qui n'a pas fonctionné pour l'utilisateur afin qu'il puisse mieux comprendre le problème. La plupart des utilisateurs ne comprennent pas une trace de pile à moins que la sortie de la trace de la pile soit requise.

Aussi, s'il vous plaît excuser toutes les petites erreurs de syntaxe, je suis plus familier avec Java que C#.

+0

-1 pour 'catch (Exception ex) {throw ex;} 'qui perdra la trace de la pile. Juste ne pas attraper l'exception si vous n'allez pas résoudre le problème. –

+1

En effet 'throw 'vaut mieux que' throw ex', mais le bloc try/catch est toujours inutile si vous ne faites rien dans le bloc de catch ... Laissez simplement l'exception grimper dans la pile et être attrapé par le prochain try/catch block –

+0

Oy, ma familiarité Java me mord à nouveau. Dans Java, vous devez spécifier quand une exception va être levée. Je vais le laisser car c'est toujours un code valide et quelque chose d'autre peut être mis là s'ils le veulent. – mnuzzo