En informática , un espacio de nombres es un conjunto de signos ( nombres ) que se utilizan para identificar y hacer referencia a objetos de diversos tipos. Un espacio de nombres garantiza que todos los objetos de un conjunto determinado tengan nombres únicos para que puedan identificarse fácilmente .
Los espacios de nombres suelen estructurarse como jerarquías para permitir la reutilización de nombres en diferentes contextos. Como analogía, considere un sistema de nombres para personas en el que cada persona tiene un nombre de pila, así como un apellido compartido con sus parientes. Si los nombres de pila de los miembros de la familia son únicos solo dentro de cada familia, entonces cada persona puede identificarse de forma única mediante la combinación del nombre de pila y el apellido; solo hay una Jane Doe, aunque puede haber muchas Janes. Dentro del espacio de nombres de la familia Doe, solo "Jane" es suficiente para designar inequívocamente a esta persona, mientras que dentro del espacio de nombres "global" de todas las personas, se debe utilizar el nombre completo.
Ejemplos destacados de espacios de nombres incluyen sistemas de archivos , que asignan nombres a los archivos. [1] Algunos lenguajes de programación organizan sus variables y subrutinas en espacios de nombres. [2] [3] [4] Las redes de computadoras y los sistemas distribuidos asignan nombres a recursos, como computadoras , impresoras , sitios web y archivos remotos. Los sistemas operativos pueden particionar los recursos del núcleo mediante espacios de nombres aislados para admitir contenedores de virtualización .
De manera similar, los sistemas de archivos jerárquicos organizan los archivos en directorios. Cada directorio es un espacio de nombres independiente, de modo que los directorios "cartas" y "facturas" pueden contener un archivo "para_jane".
En programación informática , los espacios de nombres se emplean normalmente con el fin de agrupar símbolos e identificadores en torno a una funcionalidad particular y para evitar colisiones de nombres entre múltiples identificadores que comparten el mismo nombre.
En redes , el Sistema de nombres de dominio organiza los sitios web (y otros recursos) en espacios de nombres jerárquicos .
Los nombres de los elementos los define el desarrollador, lo que suele generar conflictos cuando se intentan mezclar documentos XML de distintas aplicaciones XML.
Este XML contiene información de la tabla HTML :
<table> <tr> <td> Manzanas </td> <td> Naranjas </td> </tr> </table>
Este XML contiene información sobre una mesa (es decir, un mueble):
<table> <name> Mesa de centro de caoba </name> <width> 80 </width> <length> 120 </length> </table>
Si se añadieran estos fragmentos XML, se produciría un conflicto de nombres. Ambos contienen un <table>...</table>
elemento, pero los elementos tienen contenido y significado diferentes.
Un analizador XML no sabrá cómo manejar estas diferencias.
Los conflictos de nombres en XML se pueden evitar fácilmente utilizando un prefijo de nombre.
El siguiente XML distingue entre la información sobre la tabla HTML y los muebles prefijando "h" y "f" al comienzo de los elementos.
<h:table> <h:tr> <h:td> Manzanas </h:td> <h:td> Naranjas </h:td> </h:tr> </h:table> <f:table> <f:name> Mesa de centro de caoba </f:name> <f:width> 80 </f:width> <f:length> 120 </f:length> </f:table>
Un nombre en un espacio de nombres consta de un nombre de espacio de nombres y un nombre local. [5] [6] El nombre del espacio de nombres generalmente se aplica como prefijo al nombre local.
En forma aumentada de Backus-Naur :
nombre = < nombre del espacio de nombres > separador < nombre local >
Cuando se utilizan nombres locales por sí solos, se utiliza la resolución de nombres para decidir a qué nombre en particular (si hay alguno) se alude con algún nombre local en particular.
La delegación de responsabilidades entre las partes es importante en aplicaciones del mundo real, como la estructura de la World Wide Web. Los espacios de nombres permiten la delegación de la asignación de identificadores a múltiples organizaciones emisoras de nombres, manteniendo al mismo tiempo la unicidad global. [8] Una autoridad de registro central registra los nombres de espacios de nombres asignados . Cada nombre de espacio de nombres se asigna a una organización que posteriormente es responsable de la asignación de nombres en su espacio de nombres asignado. Esta organización puede ser una organización emisora de nombres que asigna los nombres por sí misma, u otra autoridad de registro que delega a su vez partes de su espacio de nombres a diferentes organizaciones.
Un esquema de nombres que permite la subdelegación de espacios de nombres a terceros es un espacio de nombres jerárquico .
Una jerarquía es recursiva si la sintaxis de los nombres de los espacios de nombres es la misma para cada subdelegación. Un ejemplo de una jerarquía recursiva es el sistema de nombres de dominio .
Un ejemplo de una jerarquía no recursiva es el Nombre Uniforme de Recurso que representa un número de Autoridad de Números Asignados de Internet (IANA).
Un nombre de espacio de nombres puede brindar contexto ( alcance en informática) a un nombre, y a veces los términos se usan indistintamente. Sin embargo, el contexto de un nombre también puede estar dado por otros factores, como la ubicación donde aparece o la sintaxis del nombre.
En muchos lenguajes de programación, el espacio de nombres es un contexto para sus identificadores . En un sistema operativo, un ejemplo de espacio de nombres es un directorio. Cada nombre de un directorio identifica de forma única un archivo o subdirectorio. [9]
Por regla general, los nombres de un espacio de nombres no pueden tener más de un significado; es decir, no es posible que un mismo nombre tenga significados diferentes en el mismo espacio de nombres. Un espacio de nombres también se denomina contexto , porque un mismo nombre en distintos espacios de nombres puede tener significados diferentes, cada uno de ellos apropiado para su espacio de nombres.
A continuación se presentan otras características de los espacios de nombres:
Además de su uso técnico en lenguaje abstracto, como se describió anteriormente, algunos lenguajes tienen una palabra clave específica que se utiliza para el control explícito del espacio de nombres, entre otros usos. A continuación, se muestra un ejemplo de un espacio de nombres en C++:
#include <flujo de datos> // Así es como se lleva un nombre al ámbito actual. En este caso, se trata de llevarlos al ámbito global. using std :: cout ; using std :: endl ; espacio de nombres box1 { int box_side = 4 ; } espacio de nombres box2 { int box_side = 12 ; } int main () { int box_side = 42 ; cout << box1 :: box_side << endl ; // Salidas 4. cout << box2 :: box_side << endl ; // Salidas 12. cout << box_side << endl ; // Salidas 42. }
Un espacio de nombres en informática (a veces también llamado ámbito de nombres ) es un contenedor o entorno abstracto creado para contener una agrupación lógica de identificadores o símbolos únicos (es decir, nombres). Un identificador definido en un espacio de nombres está asociado únicamente con ese espacio de nombres. El mismo identificador puede definirse independientemente en múltiples espacios de nombres. Es decir, un identificador definido en un espacio de nombres puede tener o no el mismo significado que el mismo identificador definido en otro espacio de nombres. Los lenguajes que admiten espacios de nombres especifican las reglas que determinan a qué espacio de nombres pertenece un identificador (no su definición). [10]
Este concepto se puede ilustrar con una analogía. Imaginemos que dos empresas, X e Y, asignan números de identificación a sus empleados. X no debería tener dos empleados con el mismo número de identificación, y lo mismo ocurre con Y; pero no es un problema que se utilice el mismo número de identificación en ambas empresas. Por ejemplo, si Bill trabaja para la empresa X y Jane trabaja para la empresa Y, entonces no es un problema que cada uno de ellos sea el empleado n.º 123. En esta analogía, el número de identificación es el identificador y la empresa actúa como el espacio de nombres. No causa problemas que el mismo identificador identifique a una persona diferente en cada espacio de nombres.
En programas o documentos informáticos de gran tamaño es habitual tener cientos o miles de identificadores. Los espacios de nombres (o una técnica similar, véase Emulación de espacios de nombres) proporcionan un mecanismo para ocultar los identificadores locales. Proporcionan un medio para agrupar identificadores relacionados lógicamente en espacios de nombres correspondientes, lo que hace que el sistema sea más modular .
Los dispositivos de almacenamiento de datos y muchos lenguajes de programación modernos admiten espacios de nombres. Los dispositivos de almacenamiento utilizan directorios (o carpetas) como espacios de nombres. Esto permite almacenar en el dispositivo dos archivos con el mismo nombre, siempre que se almacenen en directorios diferentes. En algunos lenguajes de programación (por ejemplo, C++ , Python ), los identificadores que nombran los espacios de nombres están asociados a un espacio de nombres que los contiene. Por lo tanto, en estos lenguajes los espacios de nombres pueden anidarse, formando un árbol de espacios de nombres . En la raíz de este árbol se encuentra el espacio de nombres global sin nombre .
Es posible utilizar estructuras anónimas como espacios de nombres en C desde C99 .
// ayudante.c static int _add ( int a , int b ) { return a + b ; } const struct { double pi ; int ( * add ) ( int , int ); } ayudante = { 3.14 , _add }; // ayudante.h const struct { double pi ; int ( * add ) ( int , int ); } ayudante ; // principal.c #include <stdio.h> #include "helper.h" int main (){ printf ( "3 + 2 = %d \n " , helper . add ( 3 , 2 )); printf ( "pi es %f \n " , helper . pi ); }
En C++ , un espacio de nombres se define con un bloque de espacio de nombres. [11]
espacio de nombres abc { int bar ; }
Dentro de este bloque, los identificadores se pueden utilizar exactamente como se declaran. Fuera de este bloque, el especificador de espacio de nombres debe tener un prefijo. Por ejemplo, fuera de namespace abc
, bar
se debe escribir abc::bar
para poder acceder a él. C++ incluye otra construcción que hace innecesaria esta verbosidad. Al agregar la línea
utilizando el espacio de nombres abc ;
Para un fragmento de código, el prefijo abc::
ya no es necesario.
Los identificadores que no se declaran explícitamente dentro de un espacio de nombres se consideran parte del espacio de nombres global.
entero foo ;
Estos identificadores se pueden utilizar exactamente como se declaran o, dado que el espacio de nombres global no tiene nombre, ::
se puede añadir un prefijo al especificador del espacio de nombres. Por ejemplo, foo
también se puede escribir ::foo
.
La resolución de espacios de nombres en C++ es jerárquica. Esto significa que dentro del espacio de nombres hipotético food::soup
, el identificador chicken
hace referencia a food::soup::chicken
. Si food::soup::chicken
no existe , hace referencia a food::chicken
. Si no existe food::soup::chicken
ni food::chicken
, chicken
hace referencia a ::chicken
, un identificador en el espacio de nombres global.
Los espacios de nombres en C++ se utilizan con mayor frecuencia para evitar colisiones de nombres . Aunque los espacios de nombres se utilizan ampliamente en el código reciente de C++, la mayoría del código más antiguo no utiliza esta función porque no existía en las primeras versiones del lenguaje. Por ejemplo, toda la biblioteca estándar de C++ está definida dentro de namespace std
, pero antes de la estandarización muchos componentes estaban originalmente en el espacio de nombres global. Un programador puede insertar la using
directiva para eludir los requisitos de resolución de espacios de nombres y obtener compatibilidad con versiones anteriores con código más antiguo que espera que todos los identificadores estén en el espacio de nombres global. Sin embargo, el uso de la using
directiva por razones distintas a la compatibilidad con versiones anteriores (por ejemplo, conveniencia) se considera contrario a las buenas prácticas de código.
En Java , la idea de un espacio de nombres está incorporada en los paquetes de Java . Todo el código pertenece a un paquete, aunque no es necesario nombrarlo explícitamente. Se puede acceder al código de otros paquetes anteponiendo el nombre del paquete antes del identificador apropiado, por ejemplo, class String
en se puede hacer referencia a (esto se conoce como el nombre de clase completo ). Al igual que C++, Java ofrece una construcción que hace innecesario escribir el nombre del paquete ( ). Sin embargo, ciertas funciones (como la reflexión ) requieren que el programador use el nombre completo.package java.lang
java.lang.String
import
A diferencia de C++, los espacios de nombres en Java no son jerárquicos en lo que respecta a la sintaxis del lenguaje. Sin embargo, los paquetes se nombran de manera jerárquica. Por ejemplo, todos los paquetes que comienzan con java
son parte de la plataforma Java : el paquete java.lang
contiene clases fundamentales para el lenguaje y java.lang.reflect
contiene clases fundamentales relacionadas específicamente con la reflexión.
En Java (y Ada , C# y otros), los espacios de nombres y los paquetes expresan categorías semánticas de código. Por ejemplo, en C#, namespace System
contiene código proporcionado por el sistema ( .NET Framework ). La especificidad de estas categorías y la profundidad de las jerarquías difieren de un lenguaje a otro.
Los ámbitos de funciones y clases pueden verse como espacios de nombres implícitos que están inextricablemente vinculados con la visibilidad, la accesibilidad y la vida útil de los objetos .
Los espacios de nombres se utilizan mucho en el lenguaje C#. Todas las clases de .NET Framework están organizadas en espacios de nombres, para que se puedan utilizar con más claridad y evitar el caos. Además, los programadores utilizan mucho los espacios de nombres personalizados, tanto para organizar su trabajo como para evitar conflictos de nombres . Al hacer referencia a una clase, se debe especificar su nombre completo, es decir, el espacio de nombres seguido del nombre de la clase,
Sistema . Consola . WriteLine ( "¡Hola mundo!" ); int i = Sistema . Convert . ToInt32 ( "123" );
o agregar una declaración using . Esto elimina la necesidad de mencionar el nombre completo de todas las clases en ese espacio de nombres.
usando Sistema ; Consola . WriteLine ( "¡Hola mundo!" ); int i = Convert . ToInt32 ( "123" );
En los ejemplos anteriores, System es un espacio de nombres y Console y Convert son clases definidas dentro de System .
En Python , los espacios de nombres se definen por los módulos individuales y, dado que los módulos pueden estar contenidos en paquetes jerárquicos, los espacios de nombres también son jerárquicos. [12] [13] En general, cuando se importa un módulo, los nombres definidos en el módulo se definen a través del espacio de nombres de ese módulo y se accede a ellos desde los módulos que lo llaman utilizando el nombre completo.
# supongamos que modulea define dos funciones: func1() y func2() y una clase: Class1 import ModuleaMóduloa . func1 () Móduloa . func2 () a = Móduloa . clase1 ()
La from ... import ...
declaración se puede utilizar para insertar los nombres relevantes directamente en el espacio de nombres del módulo que llama, y se puede acceder a esos nombres desde el módulo que llama sin el nombre calificado:
# supongamos que Modulea define dos funciones: func1() y func2() y una clase: Class1 from Modulea import func1func1 () func2 () # esto fallará como un nombre indefinido, al igual que el nombre completo Modulea.func2() a = Class1 () # esto fallará como un nombre indefinido, al igual que el nombre completo Modulea.Class1()
Dado que esto importa nombres directamente (sin calificación), puede sobrescribir nombres existentes sin advertencias.
Una forma especial de la declaración es from ... import *
la que importa todos los nombres definidos en el paquete nombrado directamente en el espacio de nombres del módulo que realiza la llamada. El uso de esta forma de importación, aunque es compatible con el lenguaje, generalmente no se recomienda ya que contamina el espacio de nombres del módulo que realiza la llamada y hará que los nombres ya definidos se sobrescriban en caso de conflictos de nombres. [14]
Python también admite, import x as y
como forma de proporcionar un alias o nombre alternativo para que lo utilice el módulo que llama:
importar numpy como npa = np . arango ( 1000 )
En XML , la especificación de espacios de nombres XML permite que los nombres de elementos y atributos en un documento XML sean únicos, de manera similar a la función de los espacios de nombres en los lenguajes de programación. Mediante el uso de espacios de nombres XML, los documentos XML pueden contener nombres de elementos o atributos de más de un vocabulario XML.
Los espacios de nombres se introdujeron en PHP a partir de la versión 5.3. Se pueden evitar los conflictos de nombres de clases, funciones y variables. En PHP , un espacio de nombres se define con un bloque de espacio de nombres.
# Archivo phpstar/foobar.phpespacio de nombres phpstar ;clase FooBar { función pública foo () : void { echo 'Hola mundo, desde la función foo' ; } función pública bar () : void { echo 'Hola mundo, desde la función bar' ; } }
Podemos hacer referencia a un espacio de nombres PHP de las siguientes formas diferentes:
# Archivo index.php# Incluir el archivo include "phpstar/foobar.php" ;# Opción 1: antefijar directamente el nombre de la clase con el espacio de nombres $obj_foobar = new \phpstar\FooBar ();# Opción 2: importar el espacio de nombres use phpstar\FooBar ; $obj_foobar = new FooBar ();# Opción 2a: importar y crear un alias del espacio de nombres use phpstar\FooBar como FB ; $obj_foobar = new FB ();# Accede a las propiedades y métodos de forma regular $obj_foobar -> foo (); $obj_foobar -> bar ();
En los lenguajes de programación que carecen de compatibilidad con espacios de nombres, estos pueden emularse hasta cierto punto mediante una convención de nombres de identificadores . Por ejemplo, las bibliotecas de C como libpng suelen utilizar un prefijo fijo para todas las funciones y variables que forman parte de su interfaz expuesta. Libpng expone identificadores como:
png_crear_escritura_estructurapng_obtener_firmafila de lectura pngconjunto png no válido
Esta convención de nombres proporciona una garantía razonable de que los identificadores son únicos y, por lo tanto, se pueden usar en programas más grandes sin colisiones de nombres . [15] Asimismo, muchos paquetes escritos originalmente en Fortran (por ejemplo, BLAS , LAPACK ) reservan las primeras letras del nombre de una función para indicar a qué grupo pertenece.
Esta técnica tiene varios inconvenientes:
DGEMM
indica que opera con números de doble precisión ("D") y matrices generales ("GE"), y solo los dos últimos caracteres muestran lo que realmente hace: multiplicación matriz-matriz (la "MM").Hay varias ventajas:
La construcción principal establecida por un sistema de archivos es un espacio de nombres de directorio jerárquico, que es el repositorio lógico de los archivos.
Un espacio de nombres no es más que un grupo de conjuntos, clases o tipos. Un espacio de nombres actúa como un contenedor (como una carpeta de disco) para clases organizadas en grupos, generalmente en función de su funcionalidad.
La sintaxis de
espacios de nombres de C# permite que los espacios de nombres se aniden.
¿Qué son los espacios de nombres? En su definición más amplia, los espacios de nombres son una forma de encapsular elementos. Esto puede verse como un concepto abstracto en muchos lugares. Por ejemplo, en cualquier sistema operativo, los directorios sirven para agrupar archivos relacionados y actúan como un espacio de nombres para los archivos dentro de ellos.
Un paquete es una agrupación de tipos relacionados que proporciona protección de acceso y administración del espacio de nombres. Tenga en cuenta que los tipos se refieren a
clases
,
interfaces
,
enumeraciones
y tipos de anotación. Las enumeraciones y los tipos de anotación son tipos especiales de clases e interfaces, respectivamente, por lo que en esta lección a menudo se hace referencia a los tipos simplemente como clases e interfaces.[ Se necesita una mejor fuente ]
Por ejemplo, [en
Windows
], para acceder a las clases y miembros de entrada-salida (E/S) integrados, utilice el espacio de nombres System.IO. O bien, para acceder a las clases y miembros relacionados con la Web, utilice el espacio de nombres System.Web.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)