Введение

Инструмент редакторов для программирования, написания сценариев и разметки.

Сворачивание или разворачивание кода или текста, реже голофрастирование, — это функция некоторых графических пользовательских интерфейсов, позволяющая пользователю выборочно скрывать ("сворачивать") или отображать ("разворачивать") части документа. Это позволяет пользователю управлять большими объемами текста, просматривая только те разделы, которые в данный момент представляют интерес. Обычно используется с документами, имеющими естественную древовидную структуру, состоящую из вложенных элементов. Другие названия для этой функции включают раскрытие и свертывание, скрытие кода и создание структуры. В Microsoft Word эта функция называется "сворачиваемое оглавление". Многие пользовательские интерфейсы предоставляют элементы управления раскрытия для сворачивания кода на боковой панели, обозначенные, например, треугольником, направленным вбок (если свернуто) или вниз (если развернуто), или квадратными скобками [ ] для свернутого (развернутого) текста и [+] для разворачиваемого (свернутого) текста. Сворачивание кода встречается в текстовых редакторах, редакторах исходного кода и интегрированных средах разработки (IDE). Структура сворачивания обычно соответствует синтаксическому дереву программы, определяемому языком программирования. Она также может определяться уровнями отступов или задаваться явно с помощью маркера внутри кода (сохраняемого как часть исходного кода) или вне кода. Сворачивание текста — это аналогичная функция, используемая для обычного текста, где вложенные элементы состоят из абзацев, разделов или уровней структуры. Программы, предлагающие эту функцию, включают редакторы сворачивания, редакторы структуры и некоторые текстовые процессоры. Сворачивание данных встречается в некоторых шестнадцатеричных редакторах и используется для структурирования двоичного файла или скрытия недоступных разделов данных. Сворачивание также часто используется при сравнении данных для выбора одной версии или другой, или только различий.

История

Самый ранний известный пример сворачивания кода в редакторе представлен в NLS. Вероятно, первым широко доступным редактором со сворачиванием был редактор Structured Programming Facility (SPF) 1974 года для мэйнфреймов IBM 370, который мог скрывать строки на основе их отступов. Он отображался на символьно-адресных терминалах 3270. Это было особенно полезно для многословных языков, таких как COBOL. Впоследствии он развился в Interactive System Productivity Facility (ISPF).

Использование

Сворачивание кода используется в различных сценариях, в основном для организации кода или скрытия менее важной информации, чтобы можно было сосредоточиться на более существенной. Ниже приведены распространенные примеры.

Очертание

В своей основе, приложения используют свертывание кода для структурирования исходного кода, сворачивая каждый блок до одной строки. Это могут быть блоки верхнего уровня, такие как функции и классы, вложенные блоки, например, вложенные функции и методы, или все блоки, в особенности блоки управления потоком выполнения. Это позволяет получить общее представление о коде, легко перемещаться по нему и изменять его структуру, а также углубляться в детали по мере необходимости, не отвлекаясь на посторонний код. С точки зрения просмотра, это позволяет быстро увидеть список всех функций (без их содержимого), а с точки зрения навигации – заменяет долгий просмотр или поиск нужной функции прямым переходом к следующей.

Комментарии по сокращению

Комментарии — это форма метаданных, читаемых человеком, и длинные комментарии могут прерывать ход чтения кода. Это может происходить как из-за длинного комментария к небольшому фрагменту кода, например, абзаца, объясняющего одну строку, так и из-за комментариев, предназначенных для генераторов документации, таких как Javadoc или XML Documentation. Сворачивание кода позволяет использовать длинные комментарии, но отображать их только по требованию. Если длинный комментарий содержит краткое описание, например, в docstring'ах Python, это описание может оставаться видимым даже при сворачивании раздела кода, обеспечивая возможность просмотра краткой информации или полной версии.

Показание структуры или сэндвич-кода в структурированном программировании

Структурное программирование состоит из вложенных блоков кода, и длинные блоки кода – такие как длинные операторы `switch` – могут затруднять восприятие общей структуры. Сворачивание кода позволяет увидеть общую структуру и развернуть её до нужного уровня детализации. Более того, в некоторых случаях, особенно в строго структурированном программировании (с единственной точкой выхода из функции), существуют шаблоны кода, которые сложно заметить при просмотре развернутого кода. Например, при управлении ресурсами в структурном программировании обычно сначала получают ресурс, затем следует блок кода, использующий этот ресурс, и в конце ресурс освобождается. Связь между получением и освобождением ресурса трудно увидеть, если между ними находится большой блок кода, но легко заметить, если этот промежуточный блок свернут. Аналогично, в условном коде, таком как `if-then-else`, вторичные блоки могут быть удалены от оператора условия.

Код группировки

Группы свёртки могут использоваться для группировки кода, как явной – подобно блокам комментариев, разделяющим модуль на секции или членов класса на связанные группы, – так и неявной, например, автоматической группировкой членов класса по уровню доступа.

Скрытие устаревшего кода

Устаревший код — или любой код, который разработчик не хочет просматривать или изменять в данный момент — может быть свернут, чтобы программисты могли сосредоточиться на рассматриваемом коде.

Конвенции

Для поддержки сворачивания кода текстовый редактор должен предоставлять механизм для определения "точек сворачивания" внутри текстового файла. Некоторые текстовые редакторы предоставляют этот механизм автоматически, а другие – настройки по умолчанию, которые пользователь может либо переопределить, либо дополнить. Существуют различные механизмы, которые можно грубо разделить на автоматические и ручные – требуют ли они какой-либо спецификации от программиста? Точки сворачивания обычно определяются одним или несколькими из следующих механизмов. Каждый из них имеет свои преимущества и недостатки, и в конечном счете разработчикам, создающим программное обеспечение для текстовых редакторов, решать, какие из них реализовать. Текстовые редакторы, поддерживающие несколько механизмов сворачивания, обычно позволяют пользователю выбрать наиболее подходящий для редактируемого файла.

Синтаксис зависит

Синтаксически зависимые точки сворачивания – это те, которые определяют начало и конец областей сворачивания на основе содержимого редактируемого файла. Точки сворачивания, основанные на синтаксисе, обычно определяются вокруг любых или всех стандартных элементов синтаксиса используемого языка разметки или программирования. Они предпочтительны благодаря автоматической работе и соответствию структуре кода, однако их реализация может потребовать значительных усилий, а вычисление – времени при редактировании файла.

На основе вмятин

Складывающие точки, основанные на отступах, обычно определяются положением и последовательностью непечатаемых пробелов, таких как табуляции и пробелы, в тексте. Это чаще всего используется как простая форма сворачивания на основе синтаксиса, поскольку отступ почти всегда отражает уровень вложенности в стилях отступов для структурированных языков программирования. Эта конвенция особенно подходит для синтаксисов, имеющих правило отступа, поэтому структура в значительной степени соответствует отступам. Примеры включают Python и текстовые файлы, в которых отступ является обязательным правилом. Однако даже в этих случаях структура не всегда точно соответствует отступам, например, при переносе строк, и поэтому предпочтительнее сворачивание, зависящее от синтаксиса.

Токен-базирующая

Точки свертки, основанные на токенах, задаются с помощью специальных разделителей, которые не имеют другой цели в тексте, кроме как обозначения границ точек свертки. Этот подход можно сравнить со сверткой на основе отступов, где используются печатные символы вместо пробельных. Наиболее распространенными токенами-разделителями являются { для начала свернутого блока и } для его окончания. Другим заметным токеном является #region (директивы C#) и, соответственно, #Region (директивы Visual Basic), используемые в редакторе Microsoft Visual Studio. Они синтаксически рассматриваются как директивы компилятора, хотя не влияют на процесс компиляции. Как ручной метод, свертка на основе токенов позволяет произвольно группировать код по любым критериям, например, "функции, относящиеся к определенной задаче", которые невозможно определить с помощью синтаксического анализа. Свертка на основе токенов требует передачи сигналов "в полосе", при этом токены свертки фактически являются структурированными комментариями и, в отличие от других методов, присутствуют в исходном коде и видны другим программистам. Это позволяет обмениваться ими, но также требует их использования (или сохранения) всеми программистами, работающими с данным файлом, что может приводить к разногласиям и усложнять поддержку кода.

Указанные пользователем

Складывание, определяемое пользователем, позволяет пользователю сворачивать фрагменты текста, используя универсальный метод выделения, но без изменения исходного кода (внешним способом), а указывается исключительно в редакторе. Например, программист может выделить несколько строк текста и указать, что они должны быть свернуты. Свернутый текст может быть безымянным или именованным, и эта информация может сохраняться между сеансами редактирования или удаляться. В отличие от сворачивания на основе токенов, это не изменяет исходный текст – таким образом, изменения не распространяются на другие редакторы файла и не видны в коде.