stringtranslate.com

Espacio de nombres

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 .

Conflictos de nombres

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.

Solución mediante prefijo

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>     

Sistema de nombres

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.

Ejemplos

Delegación

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.

Jerarquía

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).

Espacio de nombres versus ámbito

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 lenguajes de programación

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. }                        

Consideraciones informáticas

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 .

Uso en idiomas comunes

do

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 ); }      
C++

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, barse debe escribir abc::barpara 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, footambié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 chickenhace referencia a food::soup::chicken. Si food::soup::chickenno existe , hace referencia a food::chicken. Si no existe food::soup::chickenni food::chicken, chickenhace 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 usingdirectiva 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 usingdirectiva por razones distintas a la compatibilidad con versiones anteriores (por ejemplo, conveniencia) se considera contrario a las buenas prácticas de código.

Java

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 Stringen 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.langjava.lang.Stringimport

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 javason parte de la plataforma Java : el paquete java.langcontiene clases fundamentales para el lenguaje y java.lang.reflectcontiene 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 Systemcontiene 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 .

DO#

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 .

Diagrama UML con una clase Consola y una clase Convert.

Pitón

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 ycomo forma de proporcionar un alias o nombre alternativo para que lo utilice el módulo que llama:

importar  numpy  como  npa  =  np . arango ( 1000 )
Espacio de nombres XML

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.

PHP

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 ();

Diagrama UML del paquete phpstar con la clase FooBar.

Emulación de espacios de nombres

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:

Hay varias ventajas:

Véase también

Referencias

  1. ^ Adya, Atul; Bolosky, William; Castro, Miguel; Cermak, Gerald; Chaiken, Ronnie; Douceur, John; Howell, Jon; Lorch, Jacob; Theimer, Marvin; Wattenhofer, Roger (2002). FARSITE: almacenamiento federado, disponible y confiable para un entorno incompletamente confiable (PDF) . Proc. USENIX Symp. on Operating Systems Design and Implementation. Archivado desde el original (PDF) el 28 de julio de 2010. 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.
  2. ^ "Preguntas frecuentes de C#: ¿Qué es un espacio de nombres?". C# Online Net. Archivado desde el original el 20 de octubre de 2013. Consultado el 23 de febrero de 2010. 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.
  3. ^ "Una descripción general de los espacios de nombres en PHP". Manual de PHP . ¿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.
  4. ^ "Creación y uso de paquetes". Documentación de Java . Oracle. 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 ]
  5. ^ XML Core Working Group (8 de diciembre de 2009). «Namespaces in XML 1.0 (Third Edition)» (Espacios de nombres en XML 1.0 (tercera edición)). W3C . Consultado el 30 de marzo de 2012 .
  6. ^ Moats, Ryan (mayo de 1997). "Sintaxis". Sintaxis URN. IETF . pág. 1. sec. 2. doi : 10.17487/RFC2141 . RFC 2141 . Consultado el 30 de marzo de 2012 .
  7. ^ Stephen J. Gowdy. "Lista de identificaciones de USB". 2013.
  8. ^ Sollins & Masinter (diciembre de 1994). "Requisitos para capacidades funcionales". Requisitos funcionales para nombres de recursos uniformes. IETF . pág. 3. sec. 2. doi : 10.17487/RFC1731 . RFC 1731 . Consultado el 30 de marzo de 2012 .
  9. ^ "Preguntas frecuentes de C#: ¿Qué es un espacio de nombres?". C# Online Net . Archivado desde el original el 20 de octubre de 2013. Consultado el 23 de febrero de 2010. 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.
  10. ^ "Un espacio de nombres es "una agrupación lógica de los nombres utilizados dentro de un programa."". Webopedia.com. 10 de abril de 2002. Consultado el 26 de julio de 2011 .
  11. ^ "Los espacios de nombres permiten agrupar entidades como clases, objetos y funciones bajo un nombre". Cplusplus.com . Consultado el 26 de julio de 2011 .
  12. ^ "6. Módulos". El tutorial de Python . Python Software Foundation . Consultado el 25 de octubre de 2010 .
  13. ^ "Ámbitos y espacios de nombres de Python". Docs.python.org . Consultado el 26 de julio de 2011 .
  14. ^ https://docs.python.org/3/tutorial/modules.html "en general, la práctica de importar * desde un módulo o paquete está mal vista"
  15. ^ Danny Kalev. "Por qué odio los espacios de nombres". Archivado desde el original el 9 de julio de 2016.{{cite web}}: CS1 maint: bot: original URL status unknown (link)