Как называется «спецификация» функции / метода?

21

Я почти уверен, что есть специальное имя для «спецификации» функции / метода. Это слово относится к

  • сколько аргументов нужно
  • порядок аргументов
  • какие аргументы являются необязательными

Есть ли название для этого?

Каллум
источник
2
Есть несколько разных видов «спекуляций». Вы упоминаете тип аргумента, порядок и необходимость. Взятые вместе с возвращаемым типом, это называется сигнатурой типа. Считаете ли вы название функции частью спецификации? Как насчет пространства имён, такого как класс, пакет, модуль и т. Д.? Это спецификация для программистов или машин? Смотри мой ответ.
kdbanman
4
Я удивлен, что у этого вопроса есть четыре близких голоса - это ИМХО совершенно законный вопрос, и вполне ответственный (фактически, на него уже ответили).
Слёске
@callum, пожалуйста, отредактируйте свой вопрос, чтобы он был менее двусмысленным, чтобы его можно было не помешать. Вас интересует конкретный язык? Спецификация машины или спецификация программиста? Спецификация для вызова или спецификация для реализации?
kdbanman
1
@kdbanman Я просто пытался вспомнить слово «подпись». Это не двусмысленно. Это не зависит от языка. Это было дано ответ. Все нормально.
Каллум
@callum, я так и думал. Спасибо за ответ.
kdbanman

Ответы:

47

Обычно это называется сигнатурой типа .

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

Килиан Фот
источник
6
Обычно? Я привык к «прототипу». По-видимому, это сигнатура типа плюс имя - en.wikipedia.org/wiki/Function_prototype
ShadSterling,
14
@Polyergic, подпись является более общей, чем прототип (и в этом случае более правильной): прототип объявляет подпись. В частности, «прототип» подразумевает объявление без реализации, как в объявлении метода Java или C # в объявлении interface, или объявление функции C / C ++ в заголовочном файле (буквально называемый a prototype).
kdbanman
12
Кроме того, arity является менее часто используемым термином только для количества аргументов.
Себи
^ О, это интересно! Я должен помнить об этом, когда я балуюсь JS, так как у меня есть только количество аргументов, а не типы.
underscore_d
23

TL; DR Вы, вероятно, говорите о сигнатуре функции (или сигнатуре метода), частью которой является сигнатура типа.

Но на самом деле все зависит от того, что вы считаете функцией «спец». Я интерпретирую это как «всю информацию, необходимую программисту для вызова функции». Это включает имя функции, тип параметра, порядок и необходимость, возможно, тип возвращаемого значения и, возможно, даже пространство имен этой функции.

Но то, требуются ли все эти вещи (или даже четко определены), зависит от языка / среды, которую вы используете. Кроме того, если вы измените определение на «всю информацию, необходимую для того, чтобы машина вызывала функцию», спецификация, скорее всего, будет другой 1 .

Строго говоря, сигнатура функции (или метода) не является единообразным термином, 2, 3 даже на одном языке. 4, 5, 6, 7 Но это почти наверняка слово, которое вы ищете, потому что оно будет понято почти любым программистом.


  1. C ++ Spec Draft n337, определение 1.3.17, подпись не включает тип возвращаемого значения, поскольку нет необходимости разрешать функцию.

  1. «подпись» не включает информацию о пространстве имен
  2. «подпись» включает в себя исключения и модификаторы, как public, staticи т. д.

  1. C ++ «подписи» не включают тип возвращаемого значения
  2. C ++ «подпись» делать включает тип возврата.
  3. Сигнатуры C ++ не включают возвращаемый тип, если только функция не является специализацией шаблона.
  4. «Сигнатуры» C ++ включают информацию о пространстве имен (области) и «прочее» ...

kdbanman
источник
Я бы также включил хотя бы то, что делает метод, когда говорит о его «спецификации». В зависимости от фокуса дня я могу включить или не включить любую дополнительную информацию, необходимую для реализации метода.
CVn
@ MichaelKjörling, это действительные проблемы, но это довольно существенные отклонения от того, что большинство программистов назвали бы «подписью». То, что делает функция, должно быть включено в имя функции, поэтому она косвенно является частью сигнатуры. Несмотря на это, я не думаю, что намерение или реализация функции - это то, что задумал спрашивающий. Я отредактирую соответственно, если окажется, что он сделал.
kdbanman
Подпись да, «спец» нет. (FWIW, я думаю, что ваш ответ довольно хорош и процитирован.)
CVn
Спасибо за ответ. Я не думаю, что ответ такой четкий, как «спец» нет. Это зависит от того, что подразумевается под спецификацией - конечно, можно придумать разумное определение спецификации, которое включает поведение функций и рекомендации по реализации. Вы можете сделать это в своем собственном ответе. Но, как я уже сказал, я не думаю, что это то, что задумал аскер.
kdbanman
1
Утверждено, потому что, хотя нет language-agnostic, примеры C ++ (A) относятся ко мне и (B) иллюстрируют путаницу, которая так часто окружает человеческую терминологию
underscore_d
0

Я считаю, что термин "контракт". Он определяет интерфейс и то, что ожидается от абонента и вызываемого абонента; однако он также охватывает такие вещи, как допустимые значения параметров, что не так, как многие языки позволяют определять с помощью определения функции или класса, поэтому термин «контракт» может иметь более широкий смысл, чем вы имели в виду. Я видел это в нескольких объектно-ориентированных и специфических для Java книгах по программированию. Я не уверен, что это специфично для Java, но я не понимаю, зачем это нужно. Подпись - это другой часто используемый термин, но мне стало нравиться «контракт».

Эндрю
источник
Это лучший ответ, если вопрос на самом деле является названием для «спецификации» функции / метода. Сама подпись ничего не говорит о том, что на самом деле делает метод, допустимом диапазоне параметров, нефункциональных
ограничениях