Упражнение. Создание кода с помощью методов
Методы полезны для организации кода, повторного использования кода и эффективного решения проблем. Вы можете подумать о методе, как черное поле, которое принимает входные данные, выполняет именованную задачу и возвращает выходные данные. С помощью этого предположения можно быстро структурировать программы, просто именуя задачи как методы, а затем заполняя логику после того, как вы определили все необходимые задачи.
При использовании обычного языка для описания шагов в коде без строгого применения правил синтаксиса используется псевдокод. Объединение методов и псевдокода — отличный способ быстро управлять любой сложной задачей программирования.
Использование методов для структуры кода
Предположим, вы кандидат в интервью по программированию. Интервьюер хочет, чтобы вы написали программу, которая проверяет, является ли IPv4-адрес допустимым или недопустимым. Вы получите следующие правила:
- Допустимый IPv4-адрес состоит из четырех чисел, разделенных точками
- Каждое число не должно содержать начальные нули
- Каждое число должно быть от 0 до 255
1.1.1.1 и 255.255.255.255 являются примерами допустимых IP-адресов.
IPv4-адрес предоставляется в виде строки. Можно предположить, что он состоит только из цифр и точек (в строке нет букв).
Как вы подходите к этой задаче?
Примечание.
Даже если вы не знакомы с IP-адресами, не волнуйтесь! Чтобы завершить код в этом упражнении, выполните действия.
Сломать проблему
В этой задаче вы определите шаги, необходимые для решения проблемы. Если вы внимательно посмотрите на правила, вы можете понять, что это только три шага, чтобы определить, является ли IPv4-адрес допустимым.
В редакторе Visual Studio Code удалите существующий код из предыдущих упражнений.
Введите следующий псевдокод в редактор:
/* 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 */Псевдокод — отличный способ начать решение любой проблемы. Используя этот блок комментариев, вы преодолеете разрыв между правилами запроса и кодом программы, уточняя основные задачи, которые будут выполняться в коде. Псевдокод не должен быть функциональным или соответствовать правилам синтаксиса, однако это должно быть четкое объяснение того, что будет делать код. Теперь давайте превратим это в реальный код!
Введите новую пустую строку кода, а затем введите следующий код в редакторе:
if (ValidateLength() && ValidateZeroes() && ValidateRange()) { Console.WriteLine($"ip is a valid IPv4 address"); } else { Console.WriteLine($"ip is an invalid IPv4 address"); }На этом шаге вы преобразуете
ifинструкции из псевдокода в вызываемые методы и выводите результаты. Не беспокойтесь о определении методов еще; Можно предположить, что каждый метод выполняет задачу с его именем. Вы исправите ошибки компиляции и создадите логику метода в ближайшее время, но сосредоточитесь на большом рисунке. Когда вы начинаете работать над новой программой, фокусируя внимание на общем дизайне, вы можете оставаться упорядоченным и разрабатывать приложение быстрее.Введите новую пустую строку кода под существующим кодом, а затем введите следующий код в редакторе:
void ValidateLength() {} void ValidateZeroes() {} void ValidateRange() {}Обратите внимание, что использование методов заполнителя позволило быстро приблизиться к проблеме и структурировать код для разработки решения. Теперь, когда у вас есть структурированный план, вы можете продолжить решение проблемы, заполнив фрагмент кода по фрагменту.
Разработка решения
Теперь, когда у вас есть все методы заполнителя, необходимые для решения проблемы, можно начать сосредоточиться на деталях решения. Помните, что входной формат IPv4-адреса будет строкой, состоящей из цифр, разделенных точками. Давайте приступим!
В начале программы создайте переменные для хранения состояний ввода и проверки:
string ipv4Input = "107.31.1.5"; bool validLength = false; bool validZeroes = false; bool validRange = false;Обновите код решения, чтобы использовать переменные проверки следующим образом:
ValidateLength(); ValidateZeroes(); ValidateRange(); if (validLength && validZeroes && validRange) { Console.WriteLine($"ip is a valid IPv4 address"); } else { Console.WriteLine($"ip is an invalid IPv4 address"); }Выполните следующие действия, чтобы обновить метод
ValidateLength.void ValidateLength() { string[] address = ipv4Input.Split("."); validLength = address.Length == 4; };Первое правило указывает, что адрес IPv4 должен иметь четыре числа. Поэтому в этом коде вы используете для
string.Splitразделения цифр и убедитесь, что их четыре.Выполните следующие действия, чтобы обновить метод
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 .Обновите код следующим образом:
foreach (string number in address) { if (number.Length > 1 && number.StartsWith("0")) { validZeroes = false; return; } }Оператор return завершает выполнение метода и возвращает управление вызывающему методу. Добавление инструкции
returnпосле завершения метода послеvalidZeroes = falseобнаружения первого недопустимого нуля. Если недопустимый ноль не найден, метод завершится после установки значенияvalidZeroestrue. Давайте перейдем к следующему методу.Выполните следующие действия, чтобы обновить метод
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.Внесите в код следующие изменения.
string[] address = ipv4Input.Split(".", StringSplitOptions.RemoveEmptyEntries);Использование
StringSplitOptions.RemoveEmptyEntriesпустых записей из массиваaddressи предотвращение попыток синтаксического анализа пустых строк.
Завершение решения
Теперь, когда все методы завершены для проверки IP-адреса, пришло время вернуться к первоначальному решению. В этой задаче вы добавите дополнительные входные значения и подготовитесь к тестированию кода.
Найдите следующий код, который вы написали ранее в программе:
string ipv4Input = "107.31.1.5";Обновите код следующим образом:
string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};При разработке решения важно протестировать код с различными входными вариантами. В этом коде вы предоставляете достойный диапазон значений тестов. Теперь, когда вы обновили входные данные теста, необходимо обновить код, чтобы использовать новые значения. Так как значения находятся в массиве, необходимо обновить код для проверки каждого из них с помощью цикла.
Внесите в код следующие изменения.
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и использовать ее в каждом методе.Добавьте переменную для хранения текущего 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;Инициализируйте
addressиспользованиеstring.Splitследующим образом:foreach (string ip in ipv4Input) { address = ip.Split(".", StringSplitOptions.RemoveEmptyEntries);Удалите ссылки
string.Splitна каждый из методов проверки, чтобы вместо этого они использовали глобальнуюaddressпеременную. Например:void ValidateLength() { validLength = address.Length == 4; };
Проверка работы
В этой задаче вы запустите приложение из интегрированного терминала и убедитесь, что код работает правильно. Итак, приступим.
Сравните код со следующими способами, чтобы убедиться, что это правильно:
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; }Сохраните работу с помощью ctrl + S или с помощью меню "Файл Visual Studio Code".
При необходимости откройте панель интегрированного терминала Visual Studio Code.
На панели обозревателя откройте терминал в папке TestProject, щелкните правой кнопкой мыши TestProject и выберите "Открыть в интегрированном терминале".
В командной строке терминала введите dotnet run
Убедитесь, что код создает следующие выходные данные:
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слово можно использовать для завершения выполнения метода - Каждый шаг проблемы часто можно преобразовать в собственный метод.
- Использование методов для решения небольших проблем для создания решения