Рефакторинг нужен совет / идеи - PullRequest
2 голосов
/ 13 января 2010

Я искал идеи по улучшению следующего кода

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

Заранее спасибо за любую помощь

Ответы [ 2 ]

4 голосов
/ 13 января 2010

Я бы написал простой метод для извлечения и проверки ввода пользователя:

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 голосов
/ 13 января 2010

Вы можете попытаться взять циклы 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
}

и вызовите его из главной функции. Другие вещи, которые вы можете сделать, которые уменьшат количество ошибок, если вам нужно добавить код, - это поставить фигурные скобки, {, вокруг кода внутри ваших операторов If. Хотя их отсутствие синтаксически допустимо, это предотвратит появление ошибки позже. Я был укушен такой ошибкой в ​​прошлом.

РЕДАКТИРОВАТЬ: повторное выбрасывание этого исключения так, чтобы оригинальный блок Try-Catch мог остаться на месте. Кроме того, я узнал, что «throw ex» теряет трассировку стека, но просто «throw» сохраняет ее. Я исправил эту проблему.

РЕДАКТИРОВАТЬ 2: Еще одна вещь, о которой я подумал: попробуйте перехватить определенные исключения и вывести конкретную ошибку, объясняющую, что пошло не так для пользователя, чтобы он мог лучше понять проблему. Большинство пользователей не понимают трассировку стека, если не требуется вывод трассировки стека.

Кроме того, прошу прощения за любые небольшие синтаксические ошибки, я больше знаком с Java, чем с C #.

...