Сигнатура означає підпис, англійською 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, щоб зрозуміти, з якою ділянкою коду нам треба працювати.
Напишіть у коментарях, що ще ви хочете знати про сигнатуру!