Сворачивание кода или текста , или реже голофразирование , [1] — это функция некоторых графических пользовательских интерфейсов , которая позволяет пользователю выборочно скрывать («сворачивать») или отображать («разворачивать») части документа. Это позволяет пользователю управлять большими объемами текста, просматривая только те подразделы, которые в данный момент представляют интерес. Обычно она используется с документами, имеющими естественную древовидную структуру , состоящую из вложенных элементов. Другие названия этих функций включают развертывание и сворачивание , скрытие кода и структурирование . В Microsoft Word эта функция называется «сворачиваемым структурированием».
Многие пользовательские интерфейсы предоставляют виджеты раскрытия для сворачивания кода на боковой панели, обозначенные, например, треугольником, указывающим вбок (в свернутом виде) или вниз (в развернутом виде), или полем [-]
для сворачиваемого (развернутого) текста и [+]
полем для развертываемого (свернутого) текста.
Сворачивание кода встречается в текстовых редакторах , редакторах исходного кода и IDE . Структура сворачивания обычно следует синтаксическому дереву программы, определенному компьютерным языком . Она также может быть определена уровнями отступов или указана явно с помощью внутриполосного маркера (сохраненного как часть исходного кода) или внеполосного.
Сворачивание текста — это похожая функция, используемая в обычном тексте, где вложенные элементы состоят из абзацев, разделов или уровней структуры . Программы, предлагающие это, включают редакторы сворачивания , планировщики и некоторые текстовые процессоры .
Сворачивание данных встречается в некоторых шестнадцатеричных редакторах и используется для структурирования двоичного файла или скрытия недоступных разделов данных. [2]
Сворачивание также часто используется при сравнении данных , чтобы выбрать ту или иную версию или только различия.
Самый ранний известный пример сворачивания кода в редакторе — NLS . [3] Вероятно, первым широко доступным редактором сворачивания был редактор Structured Programming Facility (SPF) 1974 года для мэйнфреймов IBM 370 , который мог скрывать строки на основе их отступов. Он отображался на терминалах 3270 с символьным отображением. [4] Он был очень полезен для пространных языков, таких как COBOL . Он превратился в Interactive System Productivity Facility ( ISPF ).
Сворачивание кода имеет различные шаблоны использования, в первую очередь, организация кода или сокрытие менее полезной информации, чтобы можно было сосредоточиться на более важной информации. Ниже приведены общие шаблоны. [5]
В основном приложения используют сворачивание кода для структурирования исходного кода, сворачивая каждый блок в одну строку. Это могут быть только блоки верхнего уровня, такие как функции и классы, вложенные блоки, такие как вложенные функции и методы, или все блоки, особенно блоки потока управления. Это позволяет получить обзор кода, легко перемещаясь и перестраивая его, и углубляться в более подробные сведения по мере необходимости, не отвлекаясь на другой код. С точки зрения просмотра это позволяет быстро увидеть список всех функций (без их тел), в то время как с точки зрения навигации это заменяет обширное пролистывание длинных функций — или поиск цели — на прямой переход к следующей функции.
Некоторые языки или библиотеки требуют обширного шаблонного кода . Это приводит к чрезвычайно длинному коду, который может скрыть суть. Кроме того, существенный код может быть потерян в шаблонном коде.
Например, в Java для одного закрытого поля с геттером и сеттером требуется не менее 3 строк, если каждая находится на отдельной строке:
private String name = null ; public String getName ( ) { return name ; } public void setName ( String name ) { this.name = name ; }
Это расширяется до 10 строк с обычными переносами строк функций и интервалами между функциями (включая завершающий символ новой строки):
Имя частной строки = null ; public String getName () { return name ; } public void setName ( имя строки ) { this.name = имя ; }
Документация с Javadoc расширяет это до 20 строк:
/** * Свойство <code>name</code> доступно для чтения/записи. */ private String name = null ; /** * Геттер для свойства <code>name</code> */ public String getName () { return name ; } /** * Сеттер для свойства <code>name</code>. * @param name */ public void setName ( String name ) { this . name = name ; }
Если таких полей много, результатом могут легко стать сотни строк кода с очень небольшим количеством «интересного» контента — сворачивание кода может сократить это до одной строки на поле или даже до одной строки для всех полей. Кроме того, если все стандартные поля сворачиваются, но нестандартные поля (где геттер или сеттер не просто возвращает или присваивает частное поле) не сворачиваются, становится легче увидеть содержательный код.
Метаданные могут быть длинными и, как правило, менее важны, чем данные, которые они описывают. Сворачивание метаданных позволяет в первую очередь сосредоточиться на данных, а не на метаданных. Например, длинный список атрибутов в C# можно вручную свернуть следующим образом: [6]
#region Атрибуты [Browsable(false)] [MergableProperty(false)] [DefaultValue(null)] [PersistenceMode(PersistenceMode.InnerProperty)] [TemplateContainer(typeof(MyType))] [TemplateInstance(TemplateInstance.Single)] #endregion public ITemplate ContentTemplate { get ; set ; }
Результирующий код выглядит так:
Атрибуты public ITemplate ContentTemplate { get ; set ; }
Комментарии — это форма метаданных, которые может читать человек, а длинные комментарии могут нарушить поток кода. Это может быть как длинный комментарий для короткого раздела кода, например, абзац для пояснения одной строки, так и комментарии для генераторов документации , например, Javadoc или XML Documentation. Сворачивание кода позволяет иметь длинные комментарии, но отображать их только при необходимости. В случаях, когда длинный комментарий имеет одну строку резюме, например, строки документации Python, резюме все равно может отображаться, когда раздел свернут, что позволяет просматривать резюме/подробный вид.
Структурное программирование состоит из вложенных блоков кода, а длинные блоки кода, такие как длинные операторы switch, могут скрывать общую структуру. Свертывание кода позволяет увидеть общую структуру и расширить ее до определенного уровня. Кроме того, в некоторых случаях, особенно в строгом структурном программировании (выход из одной функции), существуют шаблоны кода, которые трудно увидеть при просмотре развернутого кода. Например, в управлении ресурсами в структурном программировании обычно получают ресурс, за которым следует блок кода, использующий ресурс, и заканчивают освобождением ресурса. Спаривание получения/освобождения трудно увидеть, если между ними находится длинный блок кода, но легко увидеть, если промежуточный блок свернутый. Аналогично, в условном коде, таком как if...then...else
, вторичные блоки могут находиться далеко от условного оператора.
Группы свертки можно использовать для группировки кода либо путем явной группировки — аналогично блокам комментариев, разделяющим модуль на разделы, или членов класса на связанные группы, — либо неявно, например, путем автоматической группировки членов класса по уровню доступа.
Устаревший код (или любой код, который разработчик не хочет просматривать или изменять в определенный момент времени) можно свернуть, чтобы программисты могли сосредоточиться на рассматриваемом коде.
Для поддержки сворачивания кода текстовый редактор должен предоставлять механизм для определения «точек сворачивания» в текстовом файле. Некоторые текстовые редакторы предоставляют этот механизм автоматически, в то время как другие предоставляют значения по умолчанию, которые пользователь может либо переопределить, либо дополнить.
Существуют различные механизмы, грубо разделенные на автоматические и ручные — требуют ли они какой-либо спецификации от программиста? Точки сгибания обычно определяются одним или несколькими из следующих механизмов. Каждый из них имеет свои собственные преимущества и трудности, и, по сути, разработчикам, создающим программное обеспечение текстового редактора, остается решать, какой из них реализовать. Текстовые редакторы, которые обеспечивают поддержку нескольких механизмов сгибания, обычно позволяют пользователю выбирать, какой из них наиболее подходит для редактируемого файла.
Точки сворачивания, зависящие от синтаксиса, — это те, которые полагаются на содержимое редактируемого файла, чтобы указать, где должны начинаться и заканчиваться конкретные области сворачивания. Точки сворачивания, основанные на синтаксисе, обычно определяются вокруг любой или всех стандартных подфункций используемого языка разметки или языка программирования . Они желательны, поскольку являются автоматическими и согласуются со структурой кода, но могут потребовать значительной работы для реализации и времени для вычисления при редактировании файла.
Точки сворачивания на основе отступа обычно определяются положением и последовательностью непечатаемых пробелов, таких как табуляции и пробелы, в тексте. Чаще всего это используется как простая форма сворачивания на основе синтаксиса, поскольку отступ почти всегда отражает уровень вложенности в стилях отступа для структурированных языков программирования.
Это соглашение особенно подходит для синтаксисов, которые имеют правило off-side , поэтому структура в значительной степени согласуется с отступом. Примерами служат Python и текстовые файлы, которые требуют отступа как правила сами по себе. Однако даже в этих случаях структура не совсем согласуется с отступом, например, в продолжении строки , и поэтому предпочтительнее свертывание, зависящее от синтаксиса.
Точки сгиба на основе токенов указываются с помощью специальных разделителей , которые не служат никакой другой цели в тексте, кроме как для обозначения границ точек сгиба. Это соглашение можно сравнить с точками сгиба на основе отступов, где вместо пробелов используются печатные символы. Наиболее распространенные токены-разделители используются {{{
для начала сложенного раздела и }}}
для его завершения.
Другой примечательный токен — #region
(директивы C#), соответственно #Region
(директивы Visual Basic), используемые в редакторе кода Microsoft Visual Studio . Синтаксически они рассматриваются как директивы компилятора , хотя и не влияют на компиляцию.
В качестве ручного метода сворачивание на основе токенов позволяет по своему усмотрению группировать код на основе произвольных критериев, таких как «функции, связанные с заданной задачей», которые не могут быть выведены из синтаксического анализа.
Сворачивание на основе токенов требует внутриполосной сигнализации, при этом токены сворачивания по сути являются структурированными комментариями и, в отличие от других методов, присутствуют в исходном коде и видны другим программистам. Это позволяет их совместно использовать, но также требует их использования (или сохранения) всеми программистами, работающими над определенным файлом, и может вызвать трение и бремя обслуживания.
Пользовательское сворачивание позволяет пользователю сворачивать разделы текста, используя общий метод выбора, но без изменения исходного кода (вне диапазона), вместо этого указываясь только в редакторе. Например, программист может выбрать некоторые строки текста и указать, что их следует свернуть. Свернутый текст может быть анонимным или именованным, и это может быть сохранено между сеансами редактирования или отброшено. В отличие от сворачивания на основе токенов, это не изменяет исходный текст — таким образом, он не передается другим редакторам файла и не виден в коде.
Следующий документ содержит складные жетоны ( {{{ ... }}}
):
Заголовок 1 {{{ Тело }}} Заголовок 2 {{{ Тело }}} Заголовок 3 {{{ Тело }}}
При загрузке в редактор сворачивания будет показана структура контура:
Заголовок 1 {{{ ... Заголовок 2 {{{ ... Заголовок 3 {{{ ...
Обычно при нажатии на {{{
метки появляется соответствующий основной текст.
Одним из первых редакторов сворачивания был STET , редактор, написанный для операционной системы VM/CMS в 1977 году Майком Коулишоу . STET — это текстовый редактор (для документации, программ и т. д.), который сворачивает файлы на основе блоков строк; любой блок строк можно свернуть и заменить строкой имени (которая, в свою очередь, может быть частью блока, который затем сам может быть свёрнут).
Складной редактор появился в среде разработки Occam примерно в 1983 году и назывался Inmos Transputer Development System (TDS) [7] , [8] . Редактор «f» (в списке ниже), вероятно, является наиболее сохранившимся наследием этой работы.
Исторически компьютер Macintosh имел ряд редакторов исходного кода , которые «сворачивали» части кода с помощью « треугольников раскрытия ». Продукт UserLand Software Frontier — это среда сценариев, которая имеет такую возможность. [9]
Сворачивание обеспечивается многими современными текстовыми редакторами, а сворачивание на основе синтаксиса или семантики теперь является компонентом многих сред разработки программного обеспечения . Редакторы включают в себя:
set-selective-display
функцию в Emacs для скрытия строк на основе уровня отступа, как предлагается в примечании по универсальному сворачиванию кода.senator-fold-tag
командой для синтаксисов, поддерживаемых semantic (компонент CEDET), а также doc-mode для комментариев JavaDoc или Doxygen , командой TeX-fold-mode , библиотекой nxml-outln в соответствующих языковых режимах и, возможно, в других режимах для определенных синтаксисов. Иногда для имитации сворачивания на основе синтаксиса используется стандартный второстепенный режим simple outline , ср. его использование в исходном коде Emacs Lisp с правильным отступом, его использование (см. ближе к концу страницы) для HTML с правильным отступом. Несколько механизмов сворачивания объединены интерфейсом fold-dwim . См. также CategoryHideStuff.sgml-fold-element
hide-region-hide
.set_selective_display
можно использовать для скрытия строк с отступом больше указанного значения.{{cite book}}
: CS1 maint: числовые имена: список авторов ( ссылка ){{cite web}}
: CS1 maint: постскриптум ( ссылка )fe
.