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"
