Сніпет
Сніпет (фрагмент коду, англ. snippet — фрагмент, уривок) в практиці програмування — невеликий фрагмент початкового коду або тексту, придатний для повторного використання. Сніпети не є заміною процедур, функцій або інших подібних понять структурного програмування. Вони зазвичай використовуються для більш легкого читання коду функцій, які без їх використання виглядають занадто перевантаженими деталями, або для усунення повторення окремої частини ділянки коду.
Керування сніпетами (англ. snippet management) — функціональність деяких редакторів коду і середовищ розробки. Воно дозволяє користувачеві зберігати сніпети для подальшого використання в процесі розробки коду в редакторі.
Термін сніпет іноді використовується для невеликих уривків тексту зі знайденої пошуковою машиною сторінки сайту, що використовуються як опис посилання в результатах пошуку. Зазвичай, вони містять контекст, в якому зустрілося ключове слово в тексті на сторінці. Як сніпети також може виводитися текст з мета-тегами «Description». Більш детально див. сторінка видачі результатів пошуку.
Переглянувши сніпет, можна приблизно зрозуміти, чи відповідає сторінка саме вашому запиту, навіть не відкриваючи саму сторінку.
Функція керування сніпетами в текстових редакторах популярна серед розробників програмного забезпечення і тих, кому постійно потрібне введення повторюваного тексту. Ця потреба пояснюється тим, що фрагмент тексту який вводиться не змінюється, або змінюється дуже мало.
Текстові редактори, що включають таку функціональність, зазвичай мають механізм, який дозволяє керувати набором сніпетів (каталогом) аналогічно тому, як редактори або операційні системи дозволяють керувати документами або файлами. Цей механізм включає такі операції, як перегляд, створення, редагування, видалення, сортування, фільтрація, групування та перейменування сніпетів в репозиторії, каталозі або базі даних.
Інтегровані середовища розробки (IDE) містять вбудовані засоби для введення конструкцій мови. Наприклад, в Microsoft Visual Studio, Borland Developer Studio, для цього необхідно ввести ключове слово та натиснути певну клавішну комбінацію. В IDE Geany існує спеціальний файл snippets.conf (шлях до файлу: /home/user/.config/geany) дозволяє створювати свої сніпети. Інші програми, такі як Macromedia Dreamweaver і Zend Studio, дозволяють використовувати сніпети у вебпрограмуванні.
Функціональність сніпетів, додаткова до описаної вище, може бути використана для класифікації сніпетів за ступінем їх «інтерактивності» (модифікованості, налаштуванності) [джерело не вказане 4328 днів].
З цієї точки зору сніпети поділяються на:
- статичні (англ. plain-text);
- інтерактивні або динамічні;
- скриптові.
Статичні сніпети складаються головним чином з незмінного тексту, який користувач може вибрати для вставки в поточний документ. Користувач не може задати ніяких додаткових параметрів, крім, положення курсору де необхідно вставити текст. Статичні сніпети нагадують прості макроси в мовах програмування.
Динамічні сніпети складаються з незмінного тексту та динамічних елементів. Користувач може задати як значення цих динамічних елементів, так і їх положення в незмінному тексті в процесі вибору та вставки сніпету. Прикладами динамічних елементів є змінні, що приймають значення поточної дати або системного часу, або введення користувача через графічний інтерфейс. Динамічні сніпети мають багато спільного з макрокомандами та шаблонами (template).
Скриптові сніпети складаються з коду на програмній макромові або скриптовій мові. Скриптові сніпети дають користувачеві максимальну гнучкість, звичайно в рамках можливостей, що надаються програмною мовою, її популярності для користувача та поширеності.
Можливості команд скрипту розрізняються і залежать від програми, що використовує сніпети (хост-додатки[що?]). Вони можуть включати виконання команд командного інтерпретатора, висновок діалогових вікон та інші способи взаємодії користувача з операційною системою та компонентами хост-додатків.
Розглянемо процес заміни значень для двох змінних, X та У. Якщо припустити слабку типізацію та не піклуватись про зіткнення імен, це представлено кодом:
temp = x x = y y = temp
Коли сніпет вставляється, програмісту буде запропоновано обрати значення двох параметрів. Припускаючи, що вони є типу foo
та bar
, які фактично є назвами змінних, які необхідно змінити, це показує код:
temp = foo foo = bar bar = temp
Якщо сніпет згодом зміниться, потрібно використовувати __temp
замість temp
, він не буде змінювати код, який вже був вставлений, але буде використовувати в наступних вставках сніпету.
Такий сніпет може бути представлений у вигляді:
temp = $1 $1 = $2 $2 = temp
У мові C, альтернативою сніпету є використання макросів. Макрос для обміну двох цілих чисел може бути визначений як:
#define SWAP_INT(x, y) \
{int temp; temp = x; x = y; y = temp;}
або більш правильно:
#define SWAP(type, x, y) \
do { \
type temp; temp = x; x = y; y = temp; \
} while(0)
Зверніть увагу, що використання блоку видимості в С означає, що змінна temp
перекриває будь-яку іншу змінну з таким ім'ям, і дозволяє уникнути конфліктів імен; за відсутності таких механізмів, надавати ім'я таким змінним, як __temp
необхідно. Крім того, конструкція do ... while(0)
використовується, щоб дозволити макросу бути вбудованим у будь-який конструктор. Ці побоювання виникають з макросами, тому що вони потенційно можуть бути використані в будь-якому місці, і, так як вони не розширені, поточний синтаксис незрозумілий на місці включення.
Це дозволило б використовувати:
#define SWAP(type, x, y) \
do { \
type temp; temp = x; x = y; y = temp; \
} while(0)
void bubble_sort(int list[], int size)
{
// ...
SWAP(int, list[i], list[i+1]);
// ...
}
Слід зазначити, що макровизначення і ім'я будуть включені у файл, і повинні бути оброблені до компіляції програми. Крім того, функція може бути використана; тому що він повинен замінити змінні, параметри повинні бути передані за посиланням, за допомогою покажчиків:
void swap_int(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void bubble_sort(int list[], int size)
{
// ...
swap_int(&(list[i]), &(list[i+1]));
// ...
}
У цьому випадку, використання макрокоманди або функції додає значні накладні витрати на просте завдання обміну двох змінних, і, як правило, замість того, щоб записати у вигляді такого коду:
void bubble_sort(int list[], int size)
{
// ...
if (list[i] > list[i+1]) {
int temp = list[i];
list[i] = list[i+1];
list[i+1] = temp;
}
// ...
}
Код обміну змінних може бути отриманий у наступному сніпеті:
{
$1 temp = $2
$2 = $3
$3 = temp
}
Підтримка додатками можливостей скриптових сніпетів сильно розрізняється. Нижче описуються функції, які зазвичай присутні в системах, що підтримують програмовані сніпети.
Хоча підтримка незмінного тексту є базовою функціональністю, реалізованої навіть у програмах, що підтримують лише статичні сніпети, програмовані сніпети використовуються також і для роботи з таким текстом.
Однією загальною проблемою, однак, є те, що система, що підтримує програмовані сніпети, часто повинна мати можливість розрізняти, що є статичним текстом, а що — програмними командами. Додатковим ускладненням такого розрізнення є те, що додатки, які підтримують програмні сніпети, майже завжди включають підтримку декількох мов програмування або через підсвічування синтаксису, або через виконання вбудованих команд.
З цих та інших причин, виділення статичного тексту з програмного сніпету майже завжди пов'язано з необхідністю уникнути труднощів з синтаксичним аналізом та ідентифікацією роздільників.
Програмовані сніпети часто надають користувачеві можливість вказати простір імен або область дії існуючих змінних, в яких він може потім обрати різні константи та змінні для формування тексту сніпету. Це може бути адреса електронної пошти користувача, що працює в системі, поточний системний час або дата, результат роботи функції.
Скриптові сніпети часто асоціюються з файлами, над якими йде робота. Тому змінні в сніпеті можуть включати значення змінних середовища та аргументи, що визначають ім'я файлу, позицію курсора в ньому, що містить файл, каталог та інші величини, що належать редагованому файлу.
Скриптові сніпети можуть містити код на кількох мовах програмування. Це можуть бути як самостійні мови програмування, так і мова, специфічна для програми, в рамках якої він використовується. [1]
Скриптові сніпети зазвичай включають можливість для підстановки значення, введеного користувачем. Це значення не визначене до моменту, коли сніпет вставляється або активується будь-яким чином під час редагування. Деякі програми визначають спеціальну мову розмітки, яка дозволяє редактору визначити межі шаблону в введеному тексті.
Інші додатки використовують графічний інтерфейс користувача та модальні вікна, які дозволяють користувачеві ввести одне або кілька значень для підстановки на місце шаблонів.
Зазвичай шаблони виділяються за допомогою спеціальних символів або послідовностей символів, що відокремлюють їх від решти тексту сніпету. Деякі системи дозволяють давати назви (ідентифікатори) шаблонам. Ідентифікатори можуть бути корисні для підтримки функцій повторення або модифікації шаблону.
Такий приклад тексту сніпету використовує ідентифікатори first_name
,
last_name
та item
:
Hello {%first_name%} {%last_name%}, Your shipment of {%item%} is now ready to pick up. Thanks {%first_name%}!
Повторення дозволяє користувачеві використовувати значення, побудоване шаблоном, в тексті сніпету кілька разів. У попередньому прикладі ідентифікатор шаблону first_name
є прикладом такого використання.
Ця функціональність дозволяє вказати, що значення, побудоване шаблоном, повинно модифікуватися при використанні в різних частинах тексту сніпету. Наприклад, користувач може вказати що, шаблон, що замінюється на назву документа та повторюваний в сніпеті кілька разів, виводиться перший раз великими літерами, а у всіх інших випадках — малими.
Нижче наводиться неповний перелік додатків, що підтримують сніпети. Додаткові відомості наводяться в статті про текстові редактори.
Сніпети | Статичні | Динамічні | Скриптові |
Textmate | так | так | так |
Textpad | так | немає | немає |
Emacs | так | так | так |
Sublime Text | так | так | так |
IntelliJ IDEA | так | так | так |
- ↑ Наприклад YaSnippet [Архівовано 8 лютого 2014 у Wayback Machine.] для текстового редактора Emacs.
- Kim, Miryung; Bergman, Lawrence; Lau, Tessa; Notkin, David (2004). An ethnographic study of copy and paste programming practices in OOPL (PDF). Proceedings: 2004 International Symposium on Empirical Software Engineering, ISESE 2004: 19–20 August 2004, Redondo Beach, California. Los Alamitos, CA: IEEE. с. 83—92. ISBN 978-0-7695-2165-7. OCLC 326620442. Архів оригіналу (PDF) за 19 жовтня 2016. Процитовано 24 серпня 2020.
For each C&P instance, we also noted the relationship between a copied code snippet and code elsewhere in the code base.
- Boost.Asio C++ Network Programming. Anggoro Wisnu / Packt Publishing, 2015. — 200 p. — ISBN 978-1-78528-307-9 (Фрагменти для ознайомлення)
- Шаблони (сніпети) для Sass [Архівовано 8 серпня 2020 у Wayback Machine.] 2014
- Collection of useful Code snippets [Архівовано 17 серпня 2020 у Wayback Machine.] (including code for Python, PHP, SQL and Bash)
- Creating Standalone Snippets with Snippet Compiler