Сніпет

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Сніпет (фрагмент коду, англ. snippet — фрагмент, уривок) в практиці програмування — невеликий фрагмент початкового коду або тексту, придатний для повторного використання. Сніпети не є заміною процедур, функцій або інших подібних понять структурного програмування. Вони зазвичай використовуються для більш легкого читання коду функцій, які без їх використання виглядають занадто перевантаженими деталями, або для усунення повторення окремої частини ділянки коду.

Керування сніпетами (англ. snippet management) — функціональність деяких редакторів коду і середовищ розробки. Воно дозволяє користувачеві зберігати сніпети для подальшого використання в процесі розробки коду в редакторі.

Огляд

[ред. | ред. код]

Сніпети в пошукових системах

[ред. | ред. код]
Сніпет у пошуковій системі Google, після синього заголовку

Термін сніпет іноді використовується для невеликих уривків тексту зі знайденої пошуковою машиною сторінки сайту, що використовуються як опис посилання в результатах пошуку. Зазвичай, вони містять контекст, в якому зустрілося ключове слово в тексті на сторінці. Як сніпети також може виводитися текст з мета-тегами «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
}

Можливості програмних сніпетів

[ред. | ред. код]

Підтримка додатками можливостей скриптових сніпетів сильно розрізняється. Нижче описуються функції, які зазвичай присутні в системах, що підтримують програмовані сніпети.

Статичний текст (plain text)

[ред. | ред. код]

Хоча підтримка незмінного тексту є базовою функціональністю, реалізованої навіть у програмах, що підтримують лише статичні сніпети, програмовані сніпети використовуються також і для роботи з таким текстом.

Однією загальною проблемою, однак, є те, що система, що підтримує програмовані сніпети, часто повинна мати можливість розрізняти, що є статичним текстом, а що — програмними командами. Додатковим ускладненням такого розрізнення є те, що додатки, які підтримують програмні сніпети, майже завжди включають підтримку декількох мов програмування або через підсвічування синтаксису, або через виконання вбудованих команд.

З цих та інших причин, виділення статичного тексту з програмного сніпету майже завжди пов'язано з необхідністю уникнути труднощів з синтаксичним аналізом та ідентифікацією роздільників.

Константи та змінні

[ред. | ред. код]

Програмовані сніпети часто надають користувачеві можливість вказати простір імен або область дії існуючих змінних, в яких він може потім обрати різні константи та змінні для формування тексту сніпету. Це може бути адреса електронної пошти користувача, що працює в системі, поточний системний час або дата, результат роботи функції.

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

Інтерпретований код

[ред. | ред. код]

Скриптові сніпети можуть містити код на кількох мовах програмування. Це можуть бути як самостійні мови програмування, так і мова, специфічна для програми, в рамках якої він використовується. [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тактактак

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. Наприклад 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 (Фрагменти для ознайомлення)

Посилання

[ред. | ред. код]