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