Упражнение. Создание кода с помощью методов

Завершено

Методы полезны для организации кода, повторного использования кода и эффективного решения проблем. Вы можете подумать о методе, как черное поле, которое принимает входные данные, выполняет именованную задачу и возвращает выходные данные. С помощью этого предположения можно быстро структурировать программы, просто именуя задачи как методы, а затем заполняя логику после того, как вы определили все необходимые задачи.

При использовании обычного языка для описания шагов в коде без строгого применения правил синтаксиса используется псевдокод. Объединение методов и псевдокода — отличный способ быстро управлять любой сложной задачей программирования.

Использование методов для структуры кода

Предположим, вы кандидат в интервью по программированию. Интервьюер хочет, чтобы вы написали программу, которая проверяет, является ли IPv4-адрес допустимым или недопустимым. Вы получите следующие правила:

  • Допустимый IPv4-адрес состоит из четырех чисел, разделенных точками
  • Каждое число не должно содержать начальные нули
  • Каждое число должно быть от 0 до 255

1.1.1.1 и 255.255.255.255 являются примерами допустимых IP-адресов.

IPv4-адрес предоставляется в виде строки. Можно предположить, что он состоит только из цифр и точек (в строке нет букв).

Как вы подходите к этой задаче?

Примечание.

Даже если вы не знакомы с IP-адресами, не волнуйтесь! Чтобы завершить код в этом упражнении, выполните действия.

Сломать проблему

В этой задаче вы определите шаги, необходимые для решения проблемы. Если вы внимательно посмотрите на правила, вы можете понять, что это только три шага, чтобы определить, является ли IPv4-адрес допустимым.

  1. В редакторе Visual Studio Code удалите существующий код из предыдущих упражнений.

  2. Введите следующий псевдокод в редактор:

    /*
    if ipAddress consists of 4 numbers
    and
    if each ipAddress number has no leading zeroes
    and
    if each ipAddress number is in range 0 - 255
    
    then ipAddress is valid
    
    else ipAddress is invalid
    */
    

    Псевдокод — отличный способ начать решение любой проблемы. Используя этот блок комментариев, вы преодолеете разрыв между правилами запроса и кодом программы, уточняя основные задачи, которые будут выполняться в коде. Псевдокод не должен быть функциональным или соответствовать правилам синтаксиса, однако это должно быть четкое объяснение того, что будет делать код. Теперь давайте превратим это в реальный код!

  3. Введите новую пустую строку кода, а затем введите следующий код в редакторе:

    if (ValidateLength() && ValidateZeroes() && ValidateRange()) 
    {
        Console.WriteLine($"ip is a valid IPv4 address");
    } 
    else 
    {
        Console.WriteLine($"ip is an invalid IPv4 address");
    }
    

    На этом шаге вы преобразуете if инструкции из псевдокода в вызываемые методы и выводите результаты. Не беспокойтесь о определении методов еще; Можно предположить, что каждый метод выполняет задачу с его именем. Вы исправите ошибки компиляции и создадите логику метода в ближайшее время, но сосредоточитесь на большом рисунке. Когда вы начинаете работать над новой программой, фокусируя внимание на общем дизайне, вы можете оставаться упорядоченным и разрабатывать приложение быстрее.

  4. Введите новую пустую строку кода под существующим кодом, а затем введите следующий код в редакторе:

    void ValidateLength() {}
    void ValidateZeroes() {}
    void ValidateRange() {}
    

    Обратите внимание, что использование методов заполнителя позволило быстро приблизиться к проблеме и структурировать код для разработки решения. Теперь, когда у вас есть структурированный план, вы можете продолжить решение проблемы, заполнив фрагмент кода по фрагменту.

Разработка решения

Теперь, когда у вас есть все методы заполнителя, необходимые для решения проблемы, можно начать сосредоточиться на деталях решения. Помните, что входной формат IPv4-адреса будет строкой, состоящей из цифр, разделенных точками. Давайте приступим!

  1. В начале программы создайте переменные для хранения состояний ввода и проверки:

    string ipv4Input = "107.31.1.5";
    bool validLength = false;
    bool validZeroes = false;
    bool validRange = false;
    
  2. Обновите код решения, чтобы использовать переменные проверки следующим образом:

    ValidateLength(); 
    ValidateZeroes(); 
    ValidateRange();
    
    if (validLength && validZeroes && validRange) 
    {
        Console.WriteLine($"ip is a valid IPv4 address");
    } 
    else
    {
        Console.WriteLine($"ip is an invalid IPv4 address");
    }
    
  3. Выполните следующие действия, чтобы обновить метод ValidateLength.

    void ValidateLength() 
    {
        string[] address = ipv4Input.Split(".");
        validLength = address.Length == 4;
    };
    

    Первое правило указывает, что адрес IPv4 должен иметь четыре числа. Поэтому в этом коде вы используете для string.Split разделения цифр и убедитесь, что их четыре.

  4. Выполните следующие действия, чтобы обновить метод ValidateZeroes.

    void ValidateZeroes() 
    {
        string[] address = ipv4Input.Split(".");
    
        foreach (string number in address) 
        {
            if (number.Length > 1 && number.StartsWith("0")) 
            {
                validZeroes = false;
            }
        }
    
        validZeroes = true;
    }
    

    Рассмотрим, как правило преобразуется в код.

    Второе правило указывает, что числа в адресе IPv4 не должны содержать начальные нули. Поэтому методу необходимо проверить числа для ведущих ноль при принятии 0 в качестве допустимого числа. Если все числа имеют допустимые нули, validZeroes должно быть равно trueи false в противном случае. Таким образом, в этом коде проверяется, что каждое число с несколькими цифрами не начинается с нуля.

    При внимательном просмотре вы заметите, что validZeroes установлено true значение после foreach завершения цикла. Однако необходимо задать validZeroes значение true только в том случае, если начальные нули не найдены. Эту ошибку можно исправить, задав параметр validZeroes = true перед запуском foreach цикла. Однако эту ошибку можно исправить с помощью инструкции return .

  5. Обновите код следующим образом:

    foreach (string number in address) 
    {
        if (number.Length > 1 && number.StartsWith("0")) 
        {
            validZeroes = false;
            return;
        }
    }
    

    Оператор return завершает выполнение метода и возвращает управление вызывающему методу. Добавление инструкции return после завершения метода после validZeroes = false обнаружения первого недопустимого нуля. Если недопустимый ноль не найден, метод завершится после установки значения validZeroestrue. Давайте перейдем к следующему методу.

  6. Выполните следующие действия, чтобы обновить метод ValidateRange.

    void ValidateRange() 
    {
        string[] address = ipv4Input.Split(".");
    
        foreach (string number in address) 
        {
            int value = int.Parse(number);
            if (value < 0 || value > 255) 
            {
                validRange = false;
                return;
            }
        }
        validRange = true;
    }
    

    Третье правило указывает, что каждое число в IPv4-адресе должно быть от 0 до 255. Поэтому в этом коде убедитесь, что каждое число меньше 255, а если нет, завершите выполнение после параметра validRangefalse. Так как входная строка содержит только цифры и точки, вам не нужно проверять отрицательные числа.

    Однако может возникнуть случай, когда цифры между точками отсутствуют. Например, "255...255". В этом случае string.Split(".") возвращает пустые записи, вызывая int.Parse сбой. Это можно предотвратить, указав StringSplitOptions.

  7. Внесите в код следующие изменения.

    string[] address = ipv4Input.Split(".", StringSplitOptions.RemoveEmptyEntries);
    

    Использование StringSplitOptions.RemoveEmptyEntries пустых записей из массива address и предотвращение попыток синтаксического анализа пустых строк.

Завершение решения

Теперь, когда все методы завершены для проверки IP-адреса, пришло время вернуться к первоначальному решению. В этой задаче вы добавите дополнительные входные значения и подготовитесь к тестированию кода.

  1. Найдите следующий код, который вы написали ранее в программе:

    string ipv4Input = "107.31.1.5";
    
  2. Обновите код следующим образом:

    string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};
    

    При разработке решения важно протестировать код с различными входными вариантами. В этом коде вы предоставляете достойный диапазон значений тестов. Теперь, когда вы обновили входные данные теста, необходимо обновить код, чтобы использовать новые значения. Так как значения находятся в массиве, необходимо обновить код для проверки каждого из них с помощью цикла.

  3. Внесите в код следующие изменения.

    foreach (string ip in ipv4Input) 
    {
        ValidateLength(); 
        ValidateZeroes(); 
        ValidateRange();
    
        if (validLength && validZeroes && validRange) 
        {
            Console.WriteLine($"{ip} is a valid IPv4 address");
        } 
        else 
        {
            Console.WriteLine($"{ip} is an invalid IPv4 address");
        }
    }
    

    Наконец, необходимо исправить входные данные каждого метода, так как вы обновили ipv4Input из строки в массив. Так как каждый метод использует string.Split, можно объявить переменную для хранения результата string.Split и использовать ее в каждом методе.

  4. Добавьте переменную для хранения текущего IPv4-адреса, на который будет ссылаться каждый метод:

    string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};
    string[] address;
    bool validLength = false;
    bool validZeroes = false;
    bool validRange = false;
    
  5. Инициализируйте address использование string.Split следующим образом:

    foreach (string ip in ipv4Input) 
    {
        address = ip.Split(".", StringSplitOptions.RemoveEmptyEntries);
    
  6. Удалите ссылки string.Split на каждый из методов проверки, чтобы вместо этого они использовали глобальную address переменную. Например:

    void ValidateLength() 
    {
        validLength = address.Length == 4;
    };
    

Проверка работы

В этой задаче вы запустите приложение из интегрированного терминала и убедитесь, что код работает правильно. Итак, приступим.

  1. Сравните код со следующими способами, чтобы убедиться, что это правильно:

    string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};
    string[] address;
    bool validLength = false;
    bool validZeroes = false;
    bool validRange = false;
    
    foreach (string ip in ipv4Input) 
    {
        address = ip.Split(".", StringSplitOptions.RemoveEmptyEntries);
    
        ValidateLength(); 
        ValidateZeroes(); 
        ValidateRange();
    
        if (validLength && validZeroes && validRange) 
        {
            Console.WriteLine($"{ip} is a valid IPv4 address");
        } 
        else 
        {
            Console.WriteLine($"{ip} is an invalid IPv4 address");
        }
    }
    
    void ValidateLength() 
    {
        validLength = address.Length == 4;
    };
    
    void ValidateZeroes() 
    {
        foreach (string number in address) 
        {
            if (number.Length > 1 && number.StartsWith("0")) 
            {
                validZeroes = false;
                return;
            }
        }
    
        validZeroes = true;
    }
    
    void ValidateRange() 
    {
        foreach (string number in address) 
        {
            int value = int.Parse(number);
            if (value < 0 || value > 255) 
            {
                validRange = false;
                return;
            }
        }
        validRange = true;
    }
    
  2. Сохраните работу с помощью ctrl + S или с помощью меню "Файл Visual Studio Code".

  3. При необходимости откройте панель интегрированного терминала Visual Studio Code.

    На панели обозревателя откройте терминал в папке TestProject, щелкните правой кнопкой мыши TestProject и выберите "Открыть в интегрированном терминале".

  4. В командной строке терминала введите dotnet run

  5. Убедитесь, что код создает следующие выходные данные:

    107.31.1.5 is a valid IPv4 address
    255.0.0.255 is a valid IPv4 address
    555..0.555 is an invalid IPv4 address
    255...255 is an invalid IPv4 address
    

    Если код отображает различные результаты, необходимо просмотреть код, чтобы найти ошибку и внести обновления. Запустите код еще раз, чтобы узнать, устранена ли проблема. Продолжайте обновлять и запускать код, пока код не выдает ожидаемые результаты.

Кратко

Вот что вы узнали об использовании методов до сих пор:

  • Методы можно использовать для быстрой структуры приложений
  • Ключевое return слово можно использовать для завершения выполнения метода
  • Каждый шаг проблемы часто можно преобразовать в собственный метод.
  • Использование методов для решения небольших проблем для создания решения