0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Генерация строк в циклах - задача, часто возникающая на практике. Разберем на примере функции, которая генерирует список дел. Функция принимает на вход массив дел и возвращает строку, представляющую итоговый список. Немного усложним задачу, добавив к списку заголовок и напоминание:</p>
1
<p>Генерация строк в циклах - задача, часто возникающая на практике. Разберем на примере функции, которая генерирует список дел. Функция принимает на вход массив дел и возвращает строку, представляющую итоговый список. Немного усложним задачу, добавив к списку заголовок и напоминание:</p>
2
<p>Как можно решить эту задачу в лоб:</p>
2
<p>Как можно решить эту задачу в лоб:</p>
3
<ol><li>Создать переменную result и записать в нее Список дел на сегодня:</li>
3
<ol><li>Создать переменную result и записать в нее Список дел на сегодня:</li>
4
<li>Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент начинающийся с перевода строки и *</li>
4
<li>Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент начинающийся с перевода строки и *</li>
5
<li>Добавить в конце напоминание и вернуть result из функции</li>
5
<li>Добавить в конце напоминание и вернуть result из функции</li>
6
</ol><p>Такой способ вполне рабочий, но для большинства языков программирования максимально неэффективный. Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. Подобная ситуация повторяется на каждой итерации. Причем строка становится все больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность. Конечно, для большинства приложений данная проблема неактуальна из-за малого объема прогоняемых данных, но более эффективный подход не сложнее в реализации и обладает рядом плюсов. Поэтому стоит сразу приучить себя работать правильно.</p>
6
</ol><p>Такой способ вполне рабочий, но для большинства языков программирования максимально неэффективный. Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. Подобная ситуация повторяется на каждой итерации. Причем строка становится все больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность. Конечно, для большинства приложений данная проблема неактуальна из-за малого объема прогоняемых данных, но более эффективный подход не сложнее в реализации и обладает рядом плюсов. Поэтому стоит сразу приучить себя работать правильно.</p>
7
<p>Правильно, в случае с динамическими языками - формировать массив, который затем с помощью метода join() можно превратить в строку:</p>
7
<p>Правильно, в случае с динамическими языками - формировать массив, который затем с помощью метода join() можно превратить в строку:</p>
8
<p>Размер кода практически не изменился, но способ формирования результата стал другим. Вместо строки, сначала собирается массив, который затем превращается в строку с помощью метода<a>join()</a>. У такого подхода есть и дополнительные плюсы:</p>
8
<p>Размер кода практически не изменился, но способ формирования результата стал другим. Вместо строки, сначала собирается массив, который затем превращается в строку с помощью метода<a>join()</a>. У такого подхода есть и дополнительные плюсы:</p>
9
<ul><li>Такой код проще отлаживать. Данные, представленные массивом, легче вычленять визуально и программно</li>
9
<ul><li>Такой код проще отлаживать. Данные, представленные массивом, легче вычленять визуально и программно</li>
10
<li>Массив - это структура, с ним можно производить дополнительные манипуляции. С готовой строкой уже ничего особо не сделать</li>
10
<li>Массив - это структура, с ним можно производить дополнительные манипуляции. С готовой строкой уже ничего особо не сделать</li>
11
</ul><p>Регулируя разделитель, строки можно объединять разными способами. Например, через запятую с пробелом:</p>
11
</ul><p>Регулируя разделитель, строки можно объединять разными способами. Например, через запятую с пробелом:</p>
12
<p>Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки '\n':</p>
12
<p>Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки '\n':</p>
13
<p>Последний пример особенно важен. Новички часто допускают ошибку и добавляют перевод строки в момент формирования массива, а не в join(). Посмотрите на пример с нашей функцией buildHTMLList():</p>
13
<p>Последний пример особенно важен. Новички часто допускают ошибку и добавляют перевод строки в момент формирования массива, а не в join(). Посмотрите на пример с нашей функцией buildHTMLList():</p>
14
14