En informática , una firma de tipo o anotación de tipo define las entradas y salidas de una función , subrutina o método . Una firma de tipo incluye el número, los tipos y el orden de los argumentos de la función . Un uso importante de la firma de tipo es la resolución de sobrecarga de funciones , donde se selecciona una definición particular de la función que se va a llamar entre varias formas sobrecargadas.
Ejemplos
C/C++
En C y C++ , la firma de tipo se declara mediante lo que comúnmente se conoce como prototipo de función . En C/C++, una declaración de función refleja su uso ; por ejemplo, un puntero a función con la firma se llamaría como:(int)(char,double)
char c ; double d ; int retVal = ( * fPtr )( c , d );Erlang
En Erlang , las firmas de tipo pueden declararse opcionalmente, como: [ 1 ]
- especificación function_name ( type1 (), type2 (), ...) -> out_type ().Por ejemplo:
- especificación is_even ( número ()) -> booleano ().Haskell
En Haskell, una firma de tipo generalmente tiene la siguiente forma:
functionName :: arg1Type -> arg2Type -> ... -> argNTypeNótese que el tipo del resultado puede considerarse como todo lo que sigue al primer argumento proporcionado. Esto es consecuencia del currying , que es posible gracias al soporte de Haskell para funciones de primera clase ; esta función requiere dos entradas, donde se proporciona un argumento y la función se "curryiza" para producir una función para el argumento no proporcionado. Por lo tanto, llamar a , donde , produce una nueva función que puede llamarse para producir .fxf::a->b->cf2::b->cf2bc
Las especificaciones de tipo reales pueden consistir en un tipo real, como , o una variable de tipoInteger general que se utiliza en funciones polimórficas paramétricas , como , o , o . Así que podemos escribir algo como: abanyTypefunctionName::a->a->...->a
Dado que Haskell admite funciones de orden superior , las funciones se pueden pasar como argumentos. Esto se escribe de la siguiente manera: functionName::(a->a)->a
Esta función recibe como entrada una función con una firma de tipo y devuelve datos de tipo out.a->aa
Java
En la máquina virtual de Java , las firmas de tipo internas se utilizan para identificar métodos y clases a nivel del código de la máquina virtual.
Ejemplo: El método se representa en código de bytes como .StringString.substring(int,int)Ljava/lang/String.substring(II)Ljava/lang/String;
La firma del mainmétodo se ve así: [ 2 ]
public static void main ( String [] args );Y en el código de bytes desensamblado, toma la forma deLsome/package/Main/main:([Ljava/lang/String;)V
La firma del método main()contiene tres modificadores:
publicindica que el método puede ser llamado por cualquier objeto.main()staticindica que el método es un método de clase.main()voidindica que el método no tiene valor de retorno.main()
Firma
La firma de una función consta del prototipo de la función. Especifica información general sobre la función, como el nombre, el ámbito y los parámetros. Muchos lenguajes de programación utilizan la modificación de nombres (name mangling) para transmitir información semántica adicional de los compiladores a los enlazadores. Además de esta modificación, la firma de una función contiene información adicional (almacenada internamente por la mayoría de los compiladores) que no está disponible de inmediato, pero a la que se puede acceder. [ 3 ]
Comprender la noción de firma de función es un concepto importante para todos los estudios de informática.
- Las técnicas modernas de orientación a objetos utilizan interfaces , que son esencialmente plantillas creadas a partir de firmas de funciones.
- C++ utiliza la sobrecarga de funciones con diversas firmas.
La práctica de la herencia múltiple requiere considerar las firmas de las funciones para evitar resultados impredecibles. La teoría de la informática, y en particular el concepto de polimorfismo , hacen un amplio uso del concepto de firma de función.
En el lenguaje de programación C , una firma es aproximadamente equivalente a la definición de su prototipo .
En la familia de lenguajes de programación ML , "signature" se utiliza como palabra clave para referirse a una construcción del sistema de módulos que desempeña el papel de una interfaz .
Firma del método
En la programación informática , especialmente en la programación orientada a objetos , un método se identifica comúnmente por su firma de método única , que generalmente incluye el nombre del método y el número, tipos y orden de sus parámetros . [ 4 ] Una firma de método es el tipo más pequeño de un método.
Ejemplos
do
En C, la firma del método es el nombre del método y el número y tipo de sus parámetros, pero es posible tener parámetros variádicos , aunque estos no son seguros en cuanto a tipos.
int printf ( const char * fmt , ...);La manipulación de estos parámetros se puede realizar utilizando las rutinas del archivo de cabecera de la biblioteca estándar <stdarg.h>.
C++
En C++, además de que el tipo de retorno de la función al estilo C aparezca antes, el tipo de retorno también puede aparecer después de la lista de parámetros, lo que se conoce como tipo de retorno final . La diferencia es solo sintáctica; en ambos casos, la firma resultante es idéntica.
Si se utilizan plantillas variádicas :
void hacerAlgo ( auto && ... args );Nota: es equivalente a .voiddoSomething(auto...args);template<typename...Ts>voiddoSomething(Ts...args);
DO#
De forma similar a la sintaxis de C, las firmas de métodos en C# se componen de un nombre y el número y tipo de sus parámetros, donde el último parámetro puede ser una matriz de valores: [ 5 ]
void Add ( out int sum , params int [] value ); [...] Add ( out sum , 3 , 5 , 7 , 11 , - 1 ); // sum == 25Java
En Java , la firma de un método se compone de su nombre y el número, tipo y orden de sus parámetros. Los tipos de retorno y las excepciones lanzadas no se consideran parte de la firma del método, al igual que los nombres de los parámetros; el compilador los ignora para verificar la unicidad del método.
Las firmas de los métodos ayudan a distinguir los métodos sobrecargados (métodos con el mismo nombre) en una clase. Los tipos de retorno no se incluyen en la sobrecarga. Solo se deben usar las firmas de los métodos para distinguir los métodos sobrecargados. [ 6 ]
Por ejemplo, los dos métodos siguientes tienen firmas diferentes:
void hacerAlgo ( String [] x ); // hacerAlgo(String[]) void hacerAlgo ( String x ); // hacerAlgo(String)Los dos métodos siguientes tienen la misma firma:
int hacerAlgo ( int x ); // hacerAlgo(int) void hacerAlgo ( int y ) throws Exception ; // hacerAlgo(int)En Java, los parámetros variádicos se representan con puntos suspensivos en el último parámetro. Estos se comportan de forma idéntica a un array, pero en el código de bytes de la JVM el método se marca como variádico.
void hacerAlgo ( String ... x ); // equivalente a hacerAlgo(String[])Julia
En Julia , las firmas de las funciones adoptan la siguiente forma:
comisión ( venta :: Int , tasa :: Float64 ) :: Float64Los tipos de los argumentos se utilizan para el despacho múltiple . El tipo de retorno se valida cuando la función devuelve un valor, y se genera una excepción en tiempo de ejecución si el tipo del valor no coincide con el tipo especificado.
Se permiten y se recomiendan los tipos abstractos para implementar comportamientos generales comunes a todos los subtipos. Por lo tanto, la función anterior se puede reescribir de la siguiente manera. En este caso, la función puede aceptar cualquier subtipo Integer y Real, según corresponda.
comisión ( venta :: Entero , tasa :: Real ) :: RealLos tipos son completamente opcionales en los argumentos de las funciones. Cuando no se especifican, equivalen a usar el tipo Any, que es el supertipo de todos los tipos. Es habitual especificar los tipos de argumentos, pero no el tipo de retorno.
Objetivo-C
En el lenguaje de programación Objective-C , las firmas de los métodos para un objeto se declaran en el archivo de cabecera de la interfaz . Por ejemplo,
- ( id ) initWithInt: ( int ) valor ;define un método initWithIntque devuelve un objeto general (un id) y toma un argumento entero. Objective-C solo requiere que un tipo en una firma sea explícito cuando el tipo no es id; esta firma es equivalente:
- initWithInt: ( int ) valor ;Óxido
En Rust , las firmas de las funciones adoptan la siguiente forma:
fn comisión ( venta : u32 , tasa : f64 ) -> f64 ;Véase también
- Argumento de una función : entrada para una función matemática.
Referencias
- ↑ "Guía del usuario del manual de referencia de Erlang, versión 13.1.4" . erlang.org . 7.5 Especificaciones para funciones. Archivado del original el 27 de enero de 2023. Consultado el 27 de abril de 2023 .
- ↑ "Firma (funciones) - Glosario de MDN Web Docs: Definiciones de términos relacionados con la web | MDN" . developer.mozilla.org . 8 de junio de 2023. Consultado el 5 de julio de 2024 .
- ↑ "Referencia de C++: Términos de programación" . Consultado el 3 de diciembre de 2013 .
- ↑ Paul Leahy. "Firma de método" . Guía de About.com . Consultado el 31 de mayo de 2011. La
firma de un método forma parte de su declaración. Es la combinación del nombre del método y la lista de parámetros.
- ↑ Mössenböck, Hanspeter (25 de marzo de 2002). "C# avanzado: número variable de parámetros" (PDF) . Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pag. 52 . Consultado el 3 de agosto de 2011 .
- ↑ "Capítulo 4. El formato de archivo de clase" . docs.oracle.com . Consultado el 17 de octubre de 2021 .
- teoría de tipos
- Subrutinas