Сигнатура означає підпис, англійською 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.
Різні типи сигнатур потрібні розробникам, щоб розуміти структуру та поведінку об’єктів і методів та уникати помилок і непослідовностей у коді.
У мові С++ сигнатура методу або класу визначає його тип і кількість параметрів, що передаються в метод під час виклику. Сигнатура методу або класу в С++ містить:
Приклад сигнатури методу:
////c
int add(int a, int b) {
return a+b;
}
////
У цій сигнатурі методу є ім’я методу add, а також два параметри int a і int b. Також є ключове слово int
наприкінці, яке вказує на тип даних int, що повертається. Ключове слово in
вказує на те, що параметри не можуть бути змінені всередині методу, а параметри out
і constant
вказують на те, що параметри можуть бути змінені як всередині, так і зовні методу. Ключове слово private
вказує на те, що метод може бути викликаний тільки з класу, в якому він був оголошений.
У мові Java сигнатура містить таку інформацію:
Приклад сигнатури методу:
////java
int sum(int a, int b) {
return a+b;
}
////
У цій сигнатурі методу є ім’я методу sum, а також два параметри int a і int b. Також є ключове слово int
наприкінці, яке вказує на тип даних int, що повертається.
JavaScript не є мовою суворої типізації. Типізація в ній динамічна, вільна від обмежень типів. Саме тому в JavaScript сигнатури особливо важливі. У коді вони можуть виглядати як стрілки над функціями із зазначенням типів.
Курс JavaScript Start – це чудова можливість вивчити одну з найбільш затребуваних мов програмування у вашому темпі та у зручний час. Уже записані лекції дозволять вам гнучко планувати свій час і навчатися в зручному для вас темпі. На курсі ви опануєте всі основи мови Javascript, а також навчитеся створювати інтерактивні веб-додатки та сайти. Приєднуйтесь до JavaScript Start і почніть свій шлях в освоєнні JS.
Компілятор у JavaScript може самостійно вивести тип для будь-якого виразу, використовуючи систему Хіндлі-Міленар. Але іноді, особливо у випадках використання параметричного поліморфізму, виникають складнощі з визначенням типу виразу. Тому тип виразу рекомендується вказувати в сигнатурі, що дає змогу відстежувати роботу функції.
Один із можливих прикладів використання сигнатури:
// length :: String → Number
const length = s => s.length;
У цьому прикладі цікаво те, що перед стрілкою записано вхідний тип length, а після стрілки – тип s.length, що повертається. Якщо освоїти навичку читання таких сигнатур, це зробить роботу з кодом на JavaScript помітно простішою.
Уміння розуміти signature корисне як у JavaScript, так і в інших функціональних мовах. І якщо нам потрібно запозичити будь-яку чисту функцію, ми можемо лише звернутися до її signature, щоб зрозуміти, з якою ділянкою коду нам треба працювати.
Використання сигнатур дає змогу зменшити кількість помилок і полегшити підтримку коду. Я зіткнувся з ситуаціями, коли відсутність сигнатур призводила до непередбачуваних помилок і ускладнювала налагодження коду.
Сигнатура функції повинна містити ім'я функції, тип значення, що повертається, і типи параметрів. Наприклад, def my_function(param1: int, param2: str) -> bool:
Багато мов програмування, такі як Python, TypeScript, Java, C# і Kotlin, підтримують використання сигнатур. Я працював з Python і Java і використовував сигнатури в обох мовах.
Так, використання сигнатур може призвести до збільшення обсягу коду, але це може скоротити кількість помилок і спростити підтримку коду. Спираючись на особистий досвід, я помітив, що використання сигнатур може зробити код більш читабельним і зрозумілим для інших розробників.
Використання сигнатур може спростити тестування коду, оскільки вони допомагають визначити очікуваний тип значення, що повертається, і типи параметрів. Я використовував сигнатури разом із фреймворками тестування, такими як Jest і Pytest, щоб створювати тести для функцій.
Існує безліч онлайн-курсів і ресурсів для вивчення сигнатур у програмуванні. Я рекомендую менторинг на FoxmindED, а також офіційну документацію мов програмування, які ви використовуєте. Також корисно вивчити код інших розробників і практикуватися в написанні сигнатур на практиці.
Напишіть у коментарях, що ще ви хочете знати про сигнатуру!