Вправа – код збірки з методами
Методи корисні для упорядкування коду, повторного використання коду та ефективного вирішення проблем. Ви можете подумати про такий спосіб, як чорна скринька, яка приймає ввід, виконує іменовані завдання та повертає результати. Завдяки цьому припущенню ви можете швидко структурувати програми, просто назвавши завдання методами, а потім заповнивши логіку, визначивши всі необхідні завдання.
Коли ви використовуєте звичайну мову, щоб описати кроки в коді, не дотримуючись правил синтаксису, ви використовуєте "псевдокод". Поєднання методів і псевдокоду – це чудовий спосіб швидко працювати в будь-якому складному програмному завданні.
Використання методів для структури коду
Припустімо, що ви кандидат в інтерв'ю з кодуванням. Інтерв'юер хоче, щоб ви написали програму, яка перевіряє, чи є адреса IPv4 дійсною або неприпустимою. Ви маєте наведені нижче правила.
- Припустима адреса IPv4 складається з чотирьох чисел, розділених крапками
- Кожне число не має містити нулі на початку
- Кожне число має бути в діапазоні від 0 до 255
1.1.1.1 і 255.255.255.255 – приклади припустимих IP-адрес.
Адреса IPv4 надається як рядок. Можна припустити, що вона складається лише з цифр і точок (у наданому рядку немає букв).
Як підійти до цього завдання?
Примітка
Навіть якщо ви не знайомі з IP-адресами, не хвилюйтеся! Ви все ще можете виконати код у цій вправі, виконавши кроки.
Розбити проблему
У цьому завданні визначте кроки, необхідні для вирішення проблеми. Якщо ви уважно подивитеся на правила, ви можете зрозуміти, що потрібно виконати лише три кроки, щоб визначити, чи дійсна адреса IPv4.
У редакторі коду Visual Studio видаліть будь-який наявний код із попередніх вправ.
Введіть у редактор такий псевдокод:
/* 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. Проте потрібноvalidZeroestrue, лише якщо не знайдено нулів на початку. Цю помилку можна виправити, установившиvalidZeroes = trueперед запуском циклуforeach. Однак цю помилку також можна виправити за допомогою зворотного оператора.Оновіть код до таких параметрів:
foreach (string number in address) { if (number.Length > 1 && number.StartsWith("0")) { validZeroes = false; 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.
За потреби відкрийте інтегровану панель терміналів Коду Visual Studio.
На панелі EXPLORER, щоб відкрити термінал у розташуванні папки 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можна використовувати для припинення виконання методу - Кожен крок проблеми часто можна перекласти по-своєму
- Використання методів для вирішення невеликих проблем для створення рішення