Обработка данных может состоять из достаточно большого количества шагов, которые нужно выполнить. Возьмем для примера такую задачу: На основе введенного пользователем названия статьи сформировать адрес страницы в интернете. Такая задача часто возникает при публикации статей в блогах. Подобные адреса выглядят так: https://ru.hexlet.io/blog/posts/iz-vahtovika-v-programmirovanie. Последняя часть здесь iz-vahtovika-v-programmirovanie создана автоматически кодом, который мы написали на Хекслете. Кстати у нее есть специальное название – это слаг.
Какие шаги нужно выполнить чтобы получить подобную строку? Вот лишь некоторые из них:
Часть шагов тут требует новых для нас знаний, поэтому мы их опустим. Остальные шаги будут выглядеть примерно так:
// Название введенное пользователем. Для простоты на английском
var name = " How match is the fish? ";
name = name.Trim(); // вырезаем концевые пробелы
name = name.Replace("?", ""); // Удаляем вопрос
name = name.Replace(" ", "-"); // Заменяем пробелы на дефис
name = name.ToLower(); // в нижний регистр
Console.WriteLine(name); // => "how-match-is-the-fish"
Если внимательно посмотреть на этот код, то можно заметить общий шаблон. Метод возвращает данные, которые мы присваиваем переменные и дальше, по цепочке, обрабатываем. Этот шаблон можно упростить, убрав промежуточное перезаписывание переменной:
var name = " How match is the fish? ";
name = name.Trim().Replace("?", "").Replace(" ", "-").ToLower();
Console.WriteLine(name); // => "how-match-is-the-fish"
Благодаря тому, что каждый метод возвращает новую строку, мы можем продолжать обрабатывать ее вызывая методы подряд. Если цепочка методов становится слишком длинной, то ее можно разбить на несколько строк:
name = name.Trim()
.Replace("?", "")
.Replace(" ", "-")
.ToLower();
Несмотря на удобство этого механизма, им не стоит злоупотреблять. Иногда промежуточные переменные могут упростить понимание кода.
Напишите код, который берет данные из переменной name
и выполняет капитализацию, в программировании так называют операцию, которая делает заглавной первую букву в слове, а все остальные переводит в нижний регистр. Например: heXlet => Hexlet.
Для извлечения частей слова, воспользуйтесь методом Substring()
:
// 1 параметр – индекс, 2 – длина извлекаемой подстроки
"hexlet".Substring(0, 1); // "h"
// По умолчанию до конца строки
"hexlet".Substring(1); // "exlet"
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#load "/src/Init.csx"
2#load "/src/RedirectOutput.csx"
3#load "Exercise.csx"
4
5;
6using PowerAssert;
7
8var output = capturedConsoleOutput.ToString().Trim();
9Console.SetOut(originalStdOut);
10Console.Write(capturedConsoleOutput);
11
12PAssert.IsTrue(() => output == "Hexlet");
13
Решение учителя откроется через: