C#: Цепочки вызовов методов
Обработка данных может состоять из достаточно большого количества шагов, которые нужно выполнить. Возьмем для примера такую задачу: На основе введенного пользователем названия статьи сформировать адрес страницы в интернете. Такая задача часто возникает при публикации статей в блогах. Подобные адреса выглядят так: 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"
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.