En programación de computadoras , parámetros con nombre , argumentos de parámetro con nombre , argumentos con nombre o argumentos de palabras clave se refieren al soporte de un lenguaje de computadora para llamadas a funciones para asociar claramente cada argumento con un parámetro determinado dentro de la llamada a función.
Una llamada a función que utiliza parámetros con nombre se diferencia de una llamada a función normal en que los argumentos se pasan asociando cada uno con un nombre de parámetro, en lugar de proporcionar una lista ordenada de argumentos.
Por ejemplo, considere esta llamada a un método Java o C# que no utiliza parámetros con nombre:
ventana . addNewControl ( "Título" , 20 , 50 , 100 , 50 , verdadero );
Usando parámetros con nombre en Python , la llamada se puede escribir como:
ventana . addNewControl ( título = "Título" , xPosition = 20 , yPosition = 50 , ancho = 100 , alto = 50 , dibujoAhora = Verdadero )
Usando parámetros con nombre en PHP , la llamada se puede escribir como:
$ ventana -> addNewControl ( título : "Título" , xPosition : 20 , yPosition : 50 , ancho : 100 , alto : 50 , dibujoAhora : Verdadero );
La versión con argumentos posicionales es más implícita. Las versiones que nombran parámetros son más explícitas. Dependiendo de las circunstancias, un programador puede encontrar que uno u otro es más fácil de leer.
Los parámetros con nombre se admiten explícitamente en muchos idiomas. Una selección no exhaustiva de ejemplos incluye Ada , [1] C# 4.0+ , [2] Ceylon [ cita requerida ] , ColdFusion Markup Language (CFML) [ cita requerida ] , Common Lisp , [3] Fortran [ cita requerida ] , IDL [ cita requerida ] , Kotlin , [4] Mathematica [ cita requerida ] , PL/SQL [ cita requerida ] , PowerShell [ cita requerida ] , Python , [5] R , [6] PHP , [7] Ruby , [8] Scala , [9] Smalltalk [ cita necesaria ] , Swift [10] y Visual Basic . [11] Objective-C no tiene parámetros con nombre (aunque partes del nombre del método pueden parecer parámetros con nombre). [12]
En C++ , puede lograr parámetros con nombre utilizando inicializadores designados desde C++20 , [13] así:
estructura A { int a {}, int b {} }; void foo ( Una barra ) { std :: cout << barra . una << barra . b ; } foo ({ . a = 1 , . b = 3 });
En los lenguajes que no admiten parámetros con nombre, el orden de los argumentos en una llamada a función es necesariamente fijo, ya que es la única forma en que el lenguaje puede identificar qué argumento se utilizará para qué parámetro.
Con parámetros con nombre, normalmente es posible proporcionar los argumentos en cualquier orden, ya que el nombre del parámetro adjunto a cada argumento identifica su propósito. Esto reduce la connascencia entre partes del programa. Algunos idiomas admiten parámetros con nombre, pero aún requieren que los argumentos se proporcionen en un orden específico.
Los parámetros con nombre se utilizan a menudo junto con parámetros opcionales. Sin parámetros con nombre, los parámetros opcionales solo pueden aparecer al final de la lista de parámetros, ya que no hay otra forma de determinar qué valores se han omitido. Sin embargo, en los lenguajes que admiten parámetros opcionales con nombre, los programas pueden proporcionar cualquier subconjunto de los parámetros disponibles y los nombres se utilizan para determinar qué valores se han proporcionado.
Una complicación adicional surge en lenguajes como OCaml que soportan tanto parámetros con nombre opcionales como aplicaciones parciales . En general, es imposible distinguir entre una función aplicada parcialmente y una función a la que se le ha proporcionado un subconjunto de parámetros. OCaml resuelve esta ambigüedad al requerir un argumento posicional después de todos los argumentos de parámetros con nombre opcionales: su presencia o ausencia se usa para decidir si la función se ha aplicado total o parcialmente. Si todos los parámetros son opcionales, el implementador puede resolver el problema agregando un parámetro posicional ficticio de tipo unidad .
En MediaWiki , los códigos (variables) {{{1}}}
, {{{2}}}
en las plantillas, etc., serán reemplazados por el primer, segundo, etc. parámetro sin nombre (o el valor de un parámetro llamado 1
,, 2
etc.); estos se conocen como parámetros posicionales .
En lenguajes que no admiten parámetros con nombre, algunos de los mismos beneficios se pueden lograr de otras maneras.
Su valor como documentación se puede replicar mediante información sobre herramientas en entornos de desarrollo integrados (IDE) para lenguajes como Java , o con comentarios (en C ):
MyFunctionCall ( 20 , /* coordenada x */ 50 , /* coordenada y */ 100 , /* ancho */ 5 , /* alto */ TRUE /* ¿dibujando ahora? */ );
No se comprueba la exactitud de dichos comentarios y el orden de los argumentos sigue siendo importante.
Se puede eliminar la restricción del orden de los argumentos y la capacidad de dejar algunos valores sin especificar pasando un registro o una matriz asociativa .
Por ejemplo, en JavaScript , estas dos llamadas son equivalentes:
MyFunctionCall ({ xPosition : 20 , yPosition : 50 , ancho : 100 , alto : 5 , dibujoAhora : verdadero });
MyFunctionCall ({ ancho : 100 , alto : 5 , posición x : 20 , posición y : 50 , dibujoAhora : verdadero });
Comparar con C99: [14]
struct MyParam { int xPosition ; int yPosición ; ancho interno ; altura interna ; dibujo de carbón sin firmarAhora ; }; … Parámetros MyParam = { . xPosición = 20 , . Posición y = 50 , . ancho = 100 , . altura = 5 , . dibujandoAhora = VERDADERO }; MyFunctionCall ( y parámetros );
En Perl y Ruby anterior a 2.0 existe una convención similar (generalmente llamada hash o hash de opciones [15] ), con soporte especial para omitir los delimitadores dentro de las llamadas a funciones. Como ejemplo, la nueva función Net::FTP del módulo principal acepta un hash de argumentos opcionales. [dieciséis]
En los lenguajes de programación orientados a objetos , es posible utilizar el encadenamiento de métodos para simular parámetros con nombre, como una forma de interfaz fluida . Cada argumento de parámetro con nombre se reemplaza con un método en un objeto de "argumentos" que modifica y luego devuelve el objeto. En C++, esto se denomina modismo de parámetro con nombre . [17] El objeto puede luego pasarse a una función que utilice los argumentos que contiene.
El encadenamiento de métodos se utiliza a menudo junto con el patrón del constructor como una forma de anular los valores predeterminados proporcionados por la clase del constructor.