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, consideremos un sistema de denominación de personas en el que cada persona tiene un nombre de pila, así como un apellido compartido con sus parientes. Si los nombres de los miembros de la familia son únicos sólo dentro de cada familia, entonces cada persona puede identificarse de forma única mediante la combinación de nombre y apellido; sólo hay una Jane Doe, aunque puede haber muchas Janes. Dentro del espacio de nombres de la familia Doe, basta con "Jane" 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 informáticas y los sistemas distribuidos asignan nombres a recursos, como computadoras , impresoras , sitios web y archivos remotos. Los sistemas operativos pueden particionar los recursos del kernel mediante espacios de nombres aislados para admitir contenedores de virtualización .
De manera similar, los sistemas de archivos jerárquicos organizan archivos en directorios. Cada directorio es un espacio de nombres independiente, de modo que los directorios "cartas" y "facturas" pueden contener un archivo "to_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 sitios web (y otros recursos) en espacios de nombres jerárquicos .
Los nombres de los elementos los define el desarrollador. Esto suele generar un conflicto al intentar mezclar documentos XML de diferentes 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> <ancho> 80 </ancho> <largo> 120 </largo> </table>
Si estos fragmentos XML se sumaran, habría un conflicto de nombres. Ambos contienen un <table>...</table>
elemento, pero los elementos tienen diferente contenido y significado.
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 información sobre la tabla HTML y los muebles anteponiendo "h" y "f" al principio 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 del nombre local.
En forma aumentada de Backus-Naur :
nombre = < nombre del espacio de nombres > separador < nombre local >
Cuando los nombres locales se utilizan solos, se utiliza la resolución de nombres para decidir a qué nombre en particular (si corresponde) alude 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 delegar 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 ellos mismos, u otra autoridad de registro que delega 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 jerarquía recursiva es el sistema de nombres de dominio .
Un ejemplo de jerarquía no recursiva es el Nombre de recurso uniforme que representa un número de la Autoridad de números asignados de Internet (IANA).
El nombre de un espacio de nombres puede proporcionar contexto ( alcance en informática) a un nombre y, en ocasiones, los términos se utilizan indistintamente. Sin embargo, el contexto de un nombre también puede venir proporcionado por otros factores, como la ubicación donde aparece o la sintaxis del nombre.
Para 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 en un directorio identifica de forma única un archivo o subdirectorio. [9]
Como regla general, los nombres en un espacio de nombres no pueden tener más de un significado; es decir, diferentes significados no pueden compartir el mismo nombre en el mismo espacio de nombres. Un espacio de nombres también se llama contexto , porque el mismo nombre en diferentes espacios de nombres puede tener diferentes significados, cada uno apropiado para su espacio de nombres.
A continuación se muestran otras características de los espacios de nombres:
Además del uso técnico del lenguaje abstracto descrito 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++:
#incluir <iostream> // Así es como se introduce un nombre en el ámbito actual. En este caso, // se trata de llevarlos al alcance global. usando std :: cout ; usando std :: endl ; cuadro de espacio de nombres1 { int box_side = 4 ; } espacio de nombres box2 { int box_side = 12 ; } int principal () { int box_side = 42 ; cout << caja1 :: lado_caja << 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 nombre ) 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 se puede definir de forma independiente en varios 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. Imagine que dos empresas, X e Y, asignan cada una números de identificación a sus empleados. X no debe tener dos empleados con el mismo número de identificación, y lo mismo ocurre con Y; pero no supone ningún 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 para cada uno de ellos ser el empleado número 123. En esta analogía, el número de identificación es el identificador y la empresa actúa como espacio de nombres. No causa problemas que un 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, consulte Emulación de espacios de nombres) proporcionan un mecanismo para ocultar identificadores locales. Proporcionan un medio para agrupar identificadores lógicamente relacionados en espacios de nombres correspondientes, haciendo así 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 dos archivos con el mismo nombre en el dispositivo siempre que estén almacenados en directorios diferentes. En algunos lenguajes de programación (por ejemplo, C++ , Python ), los identificadores que nombran espacios de nombres están asociados con un espacio de nombres adjunto. Así, en estos lenguajes los espacios de nombres se pueden anidar, 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 .
// helper.c static int _add ( int a , int b ) { return a + b ; } estructura constante { doble pi ; int ( * añadir ) ( int , int ); } ayudante = { 3.14 , _add }; // ayudante.h const estructura { doble pi ; int ( * añadir ) ( int , int ); } ayudante ; // main.c #include <stdio.h> #incluye "ayudante.h" int main (){ printf ( "3 + 2 = %d \n " , ayudante . add ( 3 , 2 )); printf ( " pi es %f \n " , ayudante.pi ) ; }
En C++ , un espacio de nombres se define con un bloque de espacio de nombres. [11]
espacio de nombres abc { int barra ; }
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. C++ incluye otra construcción que hace innecesaria esta verbosidad. Al agregar la línea
usando el espacio de nombres abc ;
a 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 en el espacio de nombres global.
intfoo ;
Estos identificadores se pueden usar exactamente como se declaran o, dado que el espacio de nombres global no tiene nombre, el especificador del espacio de nombres ::
puede tener un prefijo. Por ejemplo, foo
también se puede escribir ::foo
.
La resolución del espacio 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, entonces se refiere a food::chicken
. Si ni food::soup::chicken
existe food::chicken
, chicken
se refiere 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 C++ reciente, la mayoría del código 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++ se define en 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 evitar los requisitos de resolución del espacio de nombres y obtener compatibilidad con códigos antiguos que esperan que todos los identificadores estén en el espacio de nombres global. Sin embargo, se considera que el uso de la using
directiva por razones distintas a la compatibilidad con versiones anteriores (por ejemplo, conveniencia) va en contra de las buenas prácticas de código.
En Java , la idea de un espacio de nombres está incorporada en los paquetes Java . Todo el código pertenece a un paquete, aunque no es necesario nombrar explícitamente ese paquete. Se accede al código de otros paquetes anteponiendo el nombre del paquete antes del identificador apropiado, por ejemplo, se puede hacer referencia a ( class String
esto se conoce como 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 utilice 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 forma jerárquica. Por ejemplo, todos los paquetes que comienzan con java
son parte de la plataforma Java : el paquete java.lang
contiene clases básicas para el lenguaje y java.lang.reflect
clases principales relacionadas específicamente con la reflexión.
En Java (y Ada , C# y otros), los espacios de nombres/paquetes expresan categorías semánticas de código. Por ejemplo, en C#, namespace System
contiene código proporcionado por el sistema ( .NET Framework ). Qué tan específicas son estas categorías y qué tan profundas son las jerarquías difieren de un idioma a otro.
Los ámbitos de función y clase pueden verse como espacios de nombres implícitos que están inextricablemente vinculados con la visibilidad, la accesibilidad y la vida útil del objeto .
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 usarse con mayor claridad y evitar el caos. Además, los programadores utilizan ampliamente los espacios de nombres personalizados, tanto para organizar su trabajo como para evitar colisiones de nombres . Al hacer referencia a una clase, se debe especificar su nombre completo, que significa espacio de nombres seguido del nombre de la clase,
Sistema . Consola . WriteLine ( "¡Hola mundo!" ); int i = Sistema . Convertir . ToInt32 ( "123" );
o agregue una declaración de uso . 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 = Convertir . 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 están definidos 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 llaman utilizando el nombre completo.
# Suponemos que modulea define dos funciones: func1() y func2() y una clase: Class1 import ModuleaMóduloa . func1 () Móduloa . func2 () a = Móduloa . Clase 1 ()
La from ... import ...
declaración se puede utilizar para insertar los nombres relevantes directamente en el espacio de nombres del módulo de llamada, y se puede acceder a esos nombres desde el módulo de llamada sin el nombre calificado:
# Suponemos que Modulea define dos funciones: func1() y func2() y una clase: Class1 de 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 llama. Generalmente se desaconseja el uso de esta forma de importación, aunque es compatible con el idioma, ya que contamina el espacio de nombres del módulo de llamada y provocará 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 de llamada:
importar numpy como npa = np . organizar ( 1000 )
En XML , la especificación del espacio de nombres XML permite que los nombres de elementos y atributos en un documento XML sean únicos, similar a la función de los espacios de nombres en los lenguajes de programación. Al utilizar 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 desde la versión 5.3 en adelante. Se puede evitar la colisión 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, de la función foo' ; } barra de funciones públicas () : void { echo 'Hola mundo, desde la barra de funciones' ; } }
Podemos hacer referencia a un espacio de nombres PHP de las siguientes maneras:
# Archivo index.php# Incluir el archivo "phpstar/foobar.php" ;# Opción 1: prefijar 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 = nueva FooBar ();# Opción 2a: importar y alias el espacio de nombres, usar phpstar\FooBar como FB ; $obj_foobar = nuevo FB ();# Acceda a las propiedades y métodos de forma normal $obj_foobar -> foo (); $obj_foobar -> barra ();
En los lenguajes de programación que carecen de soporte para espacios de nombres, los espacios de nombres se pueden emular hasta cierto punto mediante una convención de nomenclatura de identificadores . Por ejemplo, las bibliotecas 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_create_write_structpng_get_signaturepng_read_rowpng_set_invalid
Esta convención de nomenclatura proporciona una seguridad razonable de que los identificadores son únicos y, por lo tanto, pueden usarse 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 por matriz ( el "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 depósito lógico de archivos.
Un espacio de nombres no es más que un grupo de ensamblajes, clases o tipos. Un espacio de nombres actúa como un contenedor, como una carpeta de disco, para clases organizadas en grupos generalmente según su funcionalidad.
La sintaxis
del espacio de nombres de C#
permite anidar los espacios de nombres.
¿Qué son los espacios de nombres? En la 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 que contienen.
Un paquete es una agrupación de tipos relacionados que brindan protección de acceso y administración de espacio de nombres. Tenga en cuenta que tipos se refiere a
clases
,
interfaces
,
enumeraciones
y tipos de anotaciones. Los tipos de enumeraciones y anotaciones 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 integrados de entrada y salida (E/S), utilice el espacio de nombres System.IO. O, para acceder a clases y miembros relacionados con la Web, utilice el espacio de nombres System.Web.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)