03.05.2023
5 хвилин читання

Що таке сигнатура в програмуванні: термінологія і приклади

Сигнатура означає підпис, англійською signature. У програмуванні сигнатура дає змогу ідентифікувати функцію, клас, метод або інтерфейс серед багатьох інших. Що таке сигнатура, як вона застосовується в різних мовах і для чого корисна, читайте в цій статті.

Що таке сигнатура в програмуванні

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

Під час оголошення функції, сигнатура може містити таку інформацію:

  • ім’я функції;
  • типи та кількість параметрів.

Наприклад, сигнатура простої функції додавання на JavaScript може мати такий вигляд:

////javascript

function add(x, y) {

return x + y;

}

////

Ця сигнатура містить ім’я функції “add”, два параметри, “x” і “y”, і значення, що повертається, – суму двох параметрів.

Сигнатура функції на C++ може мати такий вигляд:

////c++

void swap(int* a, int* b) {

int temp = *a;

*a = *b;

*b = temp;

}

////

Сигнатура містить ім’я функції “swap”, яка міняє місцями два покажчики, “a” і “b”, і міняє місцями значення об’єктів, на які вказують ці покажчики.

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

Типи сигнатур у програмуванні

У програмуванні існують кілька типів сигнатур.

Сигнатура функції

Сигнатура містить інформацію про те, які аргументи приймає функція і яке значення вона повертає. Наприклад, наведена вище JavaScript-функція “add” приймає два аргументи “x” і “y” і повертає їхню суму. Це очевидно з сигнатури.

Сигнатура класу

Сигнатура класу містить інформацію про конструктор, методи та властивості класу. Наприклад, у C++ клас “Stack” повідомляє:

////c++

class Stack {

public:

Stack();

~Stack();

void push(int x);

int pop();

private:

int *arr;

};

////

У ній зазначено, що у класу є конструктор “Stack()”, деструктор “~Stack()”, методи push(int x) і pop(). Так само зазначено, що у класу є приватне поле “arr”.

Сигнатура методу

Сигнатура методу містить інформацію про те, які аргументи приймає метод і яке значення він повертає. Наприклад, у методу “swap” у Java сигнатура повідомляє:

////java

int swap(int a, int b) {

int temp = a;

a = b;

b = temp;

}

////

Тут зазначено, що метод swap приймає два аргументи int a і int b і повертає їх же, помінявши місцями.

Сигнатура інтерфейсу

Сигнатура інтерфейсу містить інформацію про методи та властивості класів, пов’язаних із взаємодією інтерфейсу. Наприклад, у Java сигнатура інтерфейсу “Comparable” повідомляє:

////java

public interface Comparable {

int compareTo(Object obj);

}

////

Тут повідомляється, що зазначений клас має застосувати метод compareTo.

Різні типи сигнатур потрібні розробникам, щоб розуміти структуру та поведінку об’єктів і методів та уникати помилок і непослідовностей у коді.

Сигнатура в різних мовах програмування

У мові С++ сигнатура методу або класу визначає його тип і кількість параметрів, що передаються в метод під час виклику. Сигнатура методу або класу в С++ містить:

  • ім’я методу/класу;
  • список імен параметрів;
  • список типів параметрів;
  • список ключових слів доступності (public, private, protected, friend);
  • список ключових слів спадщини (public, private, protected);
  • список ключових слів параметрів (in, out, constant).

Приклад сигнатури методу:

////c

int add(int a, int b) {

  return a+b;

}

////

У цій сигнатурі методу є ім’я методу add, а також два параметри int a і int b. Також є ключове слово int наприкінці, яке вказує на тип даних int, що повертається. Ключове слово in вказує на те, що параметри не можуть бути змінені всередині методу, а параметри out і constant вказують на те, що параметри можуть бути змінені як всередині, так і зовні методу. Ключове слово private вказує на те, що метод може бути викликаний тільки з класу, в якому він був оголошений.

Сигнатура в мові Java

У мові Java сигнатура містить таку інформацію:

  • ім’я методу, конструктора або поля;
  • список типів параметрів, який вказує на тип даних, які метод, конструктор або поле приймає як параметри;
  • список типів значення, що повертається, який вказує на тип даних, який метод, конструктор або поле повертає;
  • модифікатори доступу (public, private, protected, static, final, volatile тощо), які вказують на доступність методу, конструктора або поля;
  • ключові слова (abstract, static, final) для успадкування.

Приклад сигнатури методу:

////java

int sum(int a, int b) {

  return a+b;

}

////

У цій сигнатурі методу є ім’я методу sum, а також два параметри int a і int b. Також є ключове слово int наприкінці, яке вказує на тип даних int, що повертається.

Особливості застосування сигнатури в JavaScript

JavaScript не є мовою суворої типізації. Типізація в ній динамічна, вільна від обмежень типів. Саме тому в JavaScript сигнатури особливо важливі. У коді вони можуть виглядати як стрілки над функціями із зазначенням типів.

Курс JavaScript Start – це чудова можливість вивчити одну з найбільш затребуваних мов програмування у вашому темпі та у зручний час. Уже записані лекції дозволять вам гнучко планувати свій час і навчатися в зручному для вас темпі. На курсі ви опануєте всі основи мови Javascript, а також навчитеся створювати інтерактивні веб-додатки та сайти. Приєднуйтесь до JavaScript Start і почніть свій шлях в освоєнні JS.

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

Один із можливих прикладів використання сигнатури:

// length :: String → Number

const length = s => s.length;

У цьому прикладі цікаво те, що перед стрілкою записано вхідний тип length, а після стрілки – тип s.length, що повертається. Якщо освоїти навичку читання таких сигнатур, це зробить роботу з кодом на JavaScript помітно простішою.

Замість висновку

Уміння розуміти signature корисне як у JavaScript, так і в інших функціональних мовах. І якщо нам потрібно запозичити будь-яку чисту функцію, ми можемо лише звернутися до її signature, щоб зрозуміти, з якою ділянкою коду нам треба працювати.

FAQ
Навіщо використовувати сигнатури в програмуванні?

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

Як правильно написати сигнатуру функції?

Сигнатура функції повинна містити ім'я функції, тип значення, що повертається, і типи параметрів. Наприклад, def my_function(param1: int, param2: str) -> bool:

Які інструменти та мови програмування підтримують використання сигнатур?

Багато мов програмування, такі як Python, TypeScript, Java, C# і Kotlin, підтримують використання сигнатур. Я працював з Python і Java і використовував сигнатури в обох мовах.

Чи може використання сигнатур призвести до збільшення обсягу коду?

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

Як сигнатури пов'язані з тестуванням коду?

Використання сигнатур може спростити тестування коду, оскільки вони допомагають визначити очікуваний тип значення, що повертається, і типи параметрів. Я використовував сигнатури разом із фреймворками тестування, такими як Jest і Pytest, щоб створювати тести для функцій.

Які інструменти та ресурси допоможуть мені покращити свої навички написання сигнатур?

Існує безліч онлайн-курсів і ресурсів для вивчення сигнатур у програмуванні. Я рекомендую менторинг на FoxmindED, а також офіційну документацію мов програмування, які ви використовуєте. Також корисно вивчити код інших розробників і практикуватися в написанні сигнатур на практиці.

Напишіть у коментарях, що ще ви хочете знати про сигнатуру!

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів