En informática , un espacio de nombres es un conjunto de símbolos ( nombres ) que se utilizan para identificar y referirse a objetos de distintos tipos. Un espacio de nombres garantiza que todos los objetos de un conjunto dado 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. A modo de analogía, consideremos un sistema de nombres donde cada persona tiene un nombre de pila y 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 unívoca mediante la combinación de su nombre de pila y apellido; solo existe 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, debe utilizarse el nombre completo.
Ejemplos destacados de espacios de nombres incluyen los 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 ordenadores , 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 a nivel del sistema operativo .
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 "letters" e "invoices" pueden contener ambos un archivo llamado "to_jane".
En programación informática , los espacios de nombres se utilizan normalmente para agrupar símbolos e identificadores en torno a una tarea determinada y para evitar conflictos de nombres entre varios identificadores que comparten el mismo nombre.
En redes informáticas , el Sistema de Nombres de Dominio (DNS ) 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. Esto suele generar conflictos al intentar combinar documentos XML de diferentes aplicaciones XML.
Este XML contiene información de tabla HTML :
<table> <tr> <td> Bueno </td> <td> Malo </td> </tr> </table>Este XML contiene información sobre una mesa (es decir, un mueble):
<table> <name> Mesa de centro de caoba </name> <width> 30 </width> <length> 120 </length> </table>Si se combinaran estos fragmentos XML, se produciría un conflicto de nombres. Ambos contienen un elemento, pero los elementos tienen contenido y significado diferentes.<table>...</table>
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 código XML distingue entre la información sobre la tabla HTML y los muebles mediante el prefijo "h" y "f" al principio de los elementos.
<h:table> <h:tr> <h:td> Bueno </h:td> <h:td> Malo </h:td> </h:tr> </h:table><f:table> <f:name> Mesa de centro de caoba </f:name> <f:width> 30 </f:width> <f:length> 120 </f:length> </f:table>Sistema de nomenclatura
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 se suele aplicar 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 de forma aislada, se emplea la resolución de nombres para decidir a qué nombre en particular (si corresponde) alude un nombre local determinado.
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 delegar la asignación de identificadores a múltiples organizaciones emisoras de nombres, manteniendo la unicidad global. [ 8 ] Una autoridad de registro central registra los nombres de espacio 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 partes de su espacio de nombres a diferentes organizaciones.
Jerarquía
Un esquema de nomenclatura 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 (DNS) .
Un ejemplo de jerarquía no recursiva es el Nombre Uniforme de Recursos que representa un número de la Autoridad de Números Asignados de Internet (IANA).
Espacio de nombres versus ámbito
El nombre de un espacio de nombres puede proporcionar contexto ( ámbito en informática) a un nombre, y a veces ambos términos se usan indistintamente. Sin embargo, el contexto de un nombre también puede estar determinado por otros factores, como la ubicación donde aparece o la sintaxis del nombre.
En lenguajes de programación
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 ]
Por 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 denomina contexto , ya que el mismo nombre en diferentes espacios de nombres puede tener distintos significados, cada uno apropiado para su espacio de nombres.
A continuación se presentan otras características de los espacios de nombres:
- Los nombres en el espacio de nombres pueden representar objetos, así como conceptos , ya sea que el espacio de nombres sea un idioma natural o étnico , un idioma construido , la terminología técnica de una profesión, un dialecto , un sociolecto o un idioma artificial (por ejemplo, un lenguaje de programación ).
- En el lenguaje de programación Java , los identificadores que aparecen en los espacios de nombres tienen un nombre corto (local) y un nombre largo "calificado" único para su uso fuera del espacio de nombres.
- Algunos compiladores (para lenguajes como C++ ) combinan espacios de nombres y nombres para uso interno en el compilador en un proceso llamado "name mangling" (manipulación 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 de espacios de nombres, entre otros usos. A continuación se muestra un ejemplo de un espacio de nombres en C++:
importar std ;// Así es como se introduce un nombre en el ámbito actual. En este caso, // se está introduciendo en el ámbito global. using std :: println ;espacio de nombres caja1 { constexpr int BOX_SIDE = 4 ; }espacio de nombres box2 { constexpr int BOX_SIDE = 12 ; }int main () { constexpr int BOX_SIDE = 42 ; println ( "{}" , box1 :: BOX_SIDE ); // Imprime 4. println ( "{}" , box2 :: BOX_SIDE ); // Imprime 12. println ( "{}" , BOX_SIDE ); // Imprime 42. }Consideraciones de informática
En informática, un espacio de nombres (a veces también llamado ámbito de nombres ) es un contenedor o entorno abstracto creado para albergar 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 de forma independiente en varios espacios de nombres. Es decir, un identificador definido en un espacio de nombres puede o no tener 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; sin embargo, no hay problema en que se utilice el mismo número de identificación en ambas empresas. Por ejemplo, si Bill trabaja para la empresa X y Jane para la empresa Y, no hay problema en que cada uno 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 hay problema en que el mismo identificador identifique a una persona diferente en cada espacio de nombres.
En programas o documentos informáticos extensos, es común encontrar cientos o miles de identificadores. Los espacios de nombres (o una técnica similar; véase «Emulando espacios de nombres ») proporcionan un mecanismo para ocultar los identificadores locales. Permiten agrupar identificadores lógicamente relacionados 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 dos archivos con el mismo nombre en el dispositivo 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 su vez con un espacio de nombres contenedor. 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 lenguas comunes
do
En C , aunque el lenguaje no tiene formalmente espacios de nombres (aunque se emulan con frecuencia ), se puede pensar que los identificadores habitan diferentes espacios de nombres; estos son los identificadores ordinarios, las etiquetas ( struct/ union/ enum), los nombres de miembros y las etiquetas. Por ejemplo, el nombre Foopuede reutilizarse en estos cuatro contextos:
#include <stdio.h>// en el espacio de nombres de etiquetas struct Foo { int Foo ; // en el espacio de nombres de miembros };// nombre de la función y parámetro (identificadores ordinarios) struct Foo Foo ( int Foo ) { struct Foo result = { . Foo = Foo }; if ( Foo < 0 ) { goto Foo ; // en el espacio de nombres de la etiqueta }devolver resultado ; Foo : resultado.Foo = 0 ; devolver resultado ; }int main () { // crea una estructura Foo, llamada Foo, // usando la función Foo() struct Foo Foo = Foo ( 42 ); printf ( "%d \n " , Foo . Foo ); }Además, es posible utilizar estructuras anónimas como espacios de nombres en C desde C99 .
Matemáticas.h :
#pragma una vezconst struct { double PI ; double ( * sin )( double ); } Math ;Matemáticas.c :
#include <math.h>static double _sin ( double arg ) { return sin ( arg ); }const struct { double PI ; double ( * sin )( double ); } Math = { M_PI , _sin };Main.c :
#include <stdio.h> #include "Math.h"int main () { printf ( "sin(0) = %d \n " , Math . sin ( 0 )); printf ( "pi es %f \n " , Math . 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 usar exactamente como se declaran. Fuera de este bloque, se debe anteponer el especificador de espacio de nombres. Por ejemplo, fuera de , se debe escribir para poder acceder a . C++ incluye otra construcción que hace innecesaria esta verbosidad. Al agregar la líneanamespaceabcbarabc::bar
usando el espacio de nombres abc ;En 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 pertenecientes al espacio de nombres global.
entero foo ;Estos identificadores se pueden usar exactamente como se declaran o, dado que el espacio de nombres global no tiene nombre, ::se puede anteponer el 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 hipotético espacio de nombres food::soup, el identificador Chickense refiere a food::soup::Chicken. Si food::soup::Chickenno existe, se refiere a food::Chicken. Si no existen food::soup::Chickenni ni , se refiere a , un identificador en el espacio de nombres global.food::ChickenChicken::Chicken
Los espacios de nombres en C++ se utilizan principalmente para evitar conflictos de nombres . Aunque se usan ampliamente en el código C++ reciente, la mayoría del código antiguo no utiliza esta funcionalidad porque no existía en las primeras versiones del lenguaje. Por ejemplo, toda la biblioteca estándar de C++ se define dentro de , pero antes de la estandarización muchos componentes estaban originalmente en el espacio de nombres global. La instrucción se puede usar para importar un símbolo al ámbito actual.namespacestdusing
El uso de las usingdeclaraciones en los encabezados por razones distintas a la retrocompatibilidad (por ejemplo, conveniencia) se considera contrario a las buenas prácticas de codificación, ya que esas usingdeclaraciones se propagan a todas las unidades de traducción que incluyen el encabezado. Sin embargo, los módulos no exportan usingdeclaraciones a menos que estén marcadas explícitamente export, lo que hace que usinglas declaraciones sean más seguras de usar. Por ejemplo, se puede importar un módulo wikipedia.project.utilcon un espacio de nombres coincidente wikipedia::project::utily luego usar usingdeclaraciones en símbolos de ese espacio de nombres para simplificar espacios de nombres verbosos. A diferencia de otros lenguajes como Java o Rust, los módulos, los espacios de nombres y la estructura de archivos fuente de C++ no necesariamente coinciden, aunque es convención que coincidan para mayor claridad (por ejemplo, el módulo foo.bar.baz.Quxcoincide con la clase con espacio de nombres foo::bar::baz::Quxy reside en el archivo foo/bar/baz/Qux.cppm ).
usingDebe utilizarse para simplificar los espacios de nombres anidados y extensos cuando se utilizan unidades de traducción modulares.
exportar módulo wikipedia . proyecto . Aplicación ;importar std ;import wikipedia . project . fs ; import wikipedia . project . util ;using wikipedia :: project :: fs :: File ; using wikipedia :: project :: util :: ConfigLoader ; using wikipedia :: project :: util :: logging :: Logger ; using wikipedia :: project :: util :: logging :: LoggerFactory ;exportar espacio de nombres wikipedia :: proyecto {clase App { private : Logger logger ; // campos y métodos privados public : App () : logger { LoggerFactory :: getLogger ( "Main" ) } { ConfigLoader cl ( File ( "config/config_file.txt" )); logger.log ( "Iniciando la aplicación..." ); // resto del código } };}C++11 introduce los espacios de nombres en línea , de modo que sus miembros se tratan como si también fueran miembros del espacio de nombres que los contiene. Se declara escribiendo . Es similar a una instrucción implícita, lo que significa que los símbolos de calificación son opcionales.inlinenamespaceusingnamespace
La propiedad inline es transitiva. Si un espacio de nombres acontiene un espacio de nombres inline b, que a su vez contiene otro espacio de nombres inline c, entonces cse puede acceder a los miembros de como si fueran miembros de ao b.
Un caso de uso principal para los espacios de nombres en línea es la compatibilidad ABI y el control de versiones. Al colocar diferentes versiones de una API dentro de espacios de nombres en línea distintos (por ejemplo, v1, v2), y luego convertir la versión deseada en línea, los desarrolladores de bibliotecas pueden gestionar la compatibilidad ABI. Cuando se lanza una nueva versión, la palabra clave inline se puede mover al espacio de nombres de la nueva versión, lo que permite a los usuarios enlazar automáticamente con la nueva versión y, al mismo tiempo, acceder a versiones anteriores mediante una calificación explícita.
espacio de nombres mylib :: utils { espacio de nombres v1 { [[ deprecated ( "Use mylib::utils::v2::func() instead" )]] void func () { // Implementación antigua } }// v2 es la versión actualmente activa inline namespace v2 { void func () { // Nueva implementación } } }int main () { // Llama implícitamente a mylib::utils::v2::func() mylib :: utils :: func ();// Llama explícitamente a mylib::utils::v2::func() mylib :: utils :: v2 :: func ();// Llama explícitamente a mylib::utils::v1::func() mylib :: utils :: v1 :: func ();devolver 0 ; }DO#
Los espacios de nombres se utilizan ampliamente en el lenguaje C#. Todas las clases del framework .NET están organizadas en espacios de nombres para facilitar su uso y evitar el caos. Además, los programadores utilizan con frecuencia espacios de nombres personalizados para organizar su trabajo y evitar conflictos de nombres . Al hacer referencia a una clase, se puede especificar su nombre completo, es decir, su espacio de nombres seguido del nombre de la clase:
System.Console.WriteLine ( " ¡ Hola mundo! " ) ; int i = System.Convert.ToInt32 ( " 123 " ) ;o bien, agregue una usingdeclaración. Esto elimina la necesidad de mencionar el nombre completo de todas las clases en ese espacio de nombres.
usando el sistema ;Console.WriteLine ( " ¡ Hola Mundo!" ) ; int i = Convert.ToInt32 ( " 123" ) ;En los ejemplos anteriores, Systemes un espacio de nombres, y Consoley Convertson clases definidas dentro de System.
![]()
A diferencia de C++, usingsolo puede importar todos los símbolos de un espacio de nombres (al igual que en C++, Rust o Java). No se puede usar para importar símbolos y clases individuales como se hace en Java.usingnamespaceuse*import*
espacio de nombres Wikipedia.Proyecto ;using System ; using System.IO ;usando Microsoft.Extensions.Logging ;usando Wikipedia.Project.Utility ;clase App { private static ILogger < Program > registrador ;public App () { ConfigLoader cl = new ConfigLoader ( Path . Combine ( "config" , "config_file.txt" )); LoggerFactory loggerFactory = LoggerFactory . Create ( builder => { builder . AddConsole (); }); logger = loggerFactory . CreateLogger < Program > (); logger . LogInformation ( "Iniciando la aplicación..." ); // resto del código } }A diferencia de C++, los espacios de nombres de C# no permiten referencias relativas a símbolos. Por ejemplo, Foo.Bar.Baz.Quxno se puede hacer referencia a la clase como Baz.Quxni siquiera si se hace referencia a ella desde dentro del espacio de nombres : o bien se debe importar Foo.Barel espacio de nombres para hacer referencia a la clase , o bien debe estar completamente cualificado.Foo.Bar.BazQuxFoo.Bar.Baz.Qux
Java
En Java , el concepto de espacio de nombres se materializa en los paquetes Java . Todo el código pertenece a un paquete, aunque no es necesario nombrarlo explícitamente. Se accede al código de otros paquetes anteponiendo el nombre del paquete al identificador correspondiente; por ejemplo, en un paquete se puede hacer referencia a él como (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 características (como la reflexión ) requieren que el programador utilice el nombre completo.classStringjava.langjava.lang.Stringimport
A diferencia de C++, los espacios de nombres en Java no siguen una jerarquía con respecto a la sintaxis del lenguaje. Sin embargo, los paquetes sí se nombran de forma jerárquica. Por ejemplo, todos los paquetes que comienzan con javaforman parte de la plataforma Java : el paquete java.langcontiene clases fundamentales del lenguaje y java.lang.reflectcontiene clases esenciales relacionadas específicamente con la reflexión.
En Java (y Ada , C# y otros lenguajes), los espacios de nombres/paquetes expresan categorías semánticas de código. Por ejemplo, en C#, contiene código proporcionado por el sistema (el framework .NET ). El grado de especificidad de estas categorías y la profundidad de las jerarquías varían según el lenguaje.namespaceSystem
Los ámbitos de las funciones y las clases pueden considerarse como espacios de nombres implícitos que están inextricablemente vinculados con la visibilidad, la accesibilidad y el ciclo de vida de los objetos .
En Java, los paquetes no pueden calificarse parcialmente como en C++. Por ejemplo, no es posible importar el javaespacio de nombres y luego referirse a él java.util.ArrayListcomo util.ArrayList. Los símbolos deben estar completamente calificados o importados completamente al ámbito. importLas declaraciones no son transitivas ni pueden marcarse deliberadamente exportcomo en C++. Todas importlas declaraciones deben aparecer al principio del archivo y no pueden escribirse en ningún otro ámbito. Esto contrasta con C++, donde el stdespacio de nombres puede importarse escribiendo , y luego puede referirse a él como .usingnamespacestd;std::chrono::system_clockchrono::system_clock
paquete org.wikipedia.project ;import java.nio.file.Paths ; import java.util.logging.Level ; import java.util.logging.Logger ;import org.wikipdia.project.util.ConfigLoader ;public class App { private static final Logger logger = Logger . getLogger ( Main . class . getName ());public App () { ConfigLoader cl = new ConfigLoader ( Paths.get ( " config / config_file.txt" )); logger.log ( Level.INFO , " Iniciando la aplicación..." ) ; // resto del código } }Debido a que Java no admite funciones independientes fuera de las clases, los métodos de clase estáticos y las llamadas "clases de utilidad" (clases con constructores privados y todos los métodos y campos estáticos) son el equivalente a los espacios de nombres al estilo C++. Algunos ejemplos son java.lang.Math, que contiene constantes como Math.PIy métodos como Math.sin().
importLas instrucciones se pueden usar para importar todos los símbolos de un paquete, lo que se denomina importación comodín, similar a la de C++. Por ejemplo, escribir importa todas las clases del paquete. Sin embargo, esto puede causar contaminación de símbolos dentro de un archivo. Además, usar instrucciones de importación glob en paquetes que tienen clases con el mismo nombre puede causar ambigüedad y provocará un error de compilación. No obstante, se importa implícitamente en todos los archivos fuente de Java por defecto.usingnamespaceimportjava.util.*;java.utiljava.lang.*
import java.sql.* ; // Importa todas las clases en java.sql, incluyendo java.sql.Date import java.util.* ; // Importa todas las clases en java.util, incluyendo java.util.DateDate d = new Date (); // Referencia de fecha ambigua que resulta en un error de compilación// En su lugar , deben usarse los nombres completos : java.sql.Date sqlDate = new java.sql.Date ( System.currentTimeMillis ( ) ) ; java.util.Date utilDate = new java.util.Date ( ) ;Kotlin
Los paquetes de Kotlin son muy similares a los paquetes de Java, pero a diferencia de Java, donde solo los objetos de tipo clase pueden residir directamente en un paquete, cualquier símbolo de nivel superior (como una variable, una clase, un alias de tipo, etc.) puede residir directamente dentro de un paquete.
paquete org.wikipedia.examplesimport kotlin.math.PIvar myPi = PIfun circleArea ( radio : Double ): Double { return myPi * radio * radio }Sin embargo, aunque Kotlin permite que los objetos que no son de clase de nivel superior residan directamente en un paquete, esto se representa internamente en la Máquina Virtual de Java como si residieran dentro de una clase generada, parecida a algo como lo siguiente:
paquete org.wikipedia.examples ;clase pública final ExampleKt {privado estático doble myPi = Math.PI ;public static final double getMyPi () { return myPi ; }public static final void setMyPi ( double value ) { myPi = value ; }public static final double circleArea ( double radius ) { return myPi * radius * radius ; } }PHP
Los espacios de nombres se introdujeron en PHP a partir de la versión 5.3. Esto permite evitar conflictos de nombres entre clases, funciones y variables. En PHP , un espacio de nombres se define mediante 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 maneras diferentes:
# Archivo index.php# Incluir el archivo include "phpstar/foobar.php" ;# Opción 1: anteponer directamente el espacio de nombres al nombre de la clase $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 para el espacio de nombres use phpstar\FooBar as FB ; $obj_foobar = new FB ();# Acceda a las propiedades y métodos de forma habitual $obj_foobar -> foo (); $obj_foobar -> bar ();![]()
Pitón
En Python , los espacios de nombres se definen mediante 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 él 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 mod_a define dos funciones: func1() y func2() y una clase: Class1 import mod_amod_a.func1 ( ) mod_a.func2 ( ) a : mod_a.Class1 = mod_a.Class1 ( )La instrucción se puede utilizar para insertar los nombres relevantes directamente en el espacio de nombres del módulo que realiza la llamada, y se puede acceder a esos nombres desde el módulo que realiza la llamada sin el nombre calificado:from...import...
# Supongamos que mod_a define dos funciones: func1() y func2() y una clase: Class1. from mod_a import func1func1 () func2 () # esto fallará como nombre indefinido, al igual que el nombre completo mod_a.func2() a : Class1 = Class1 () # esto fallará como nombre indefinido, al igual que el nombre completo mod_a.Class1()Dado que esto importa nombres directamente (sin ninguna condición), puede sobrescribir los nombres existentes sin advertencias.
Una forma especial de la instrucción es 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 está soportada por el lenguaje, generalmente se desaconseja 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 ] aunque su uso en Python puede simplificar espacios de nombres verbosos, como los espacios de nombres anidados.from...import*fromimport
from selenium.webdriver import Firefox from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.remote.webelement import WebElementif __name__ == " __main__ " : driver : Firefox = Firefox ( ) element : WebElement = driver.find_element ( By.ID , " myInputField " ) element.send_keys ( f " Hola Mundo { Keys.ENTER } " ) action : ActionChains = ActionChains ( driver ) action.key_down ( Keys.CONTROL ) .send_keys ( ' a ' ) . key_up ( Keys.CONTROL ) .perform ( )Python también admite como una forma de proporcionar un alias o nombre alternativo para que lo utilice el módulo que realiza la llamada:importxasy
import numpy as np from numpy.typing import NDArray , float32a : NDArray [ float32 ] = np . organizar ( 1000 )Óxido
En Rust , un espacio de nombres se denomina "módulo" y se declara utilizando `<module>` mod. Los símbolos dentro del módulo son privados por defecto y no se puede acceder a ellos externamente, a menos que se declaren con la pubpalabra clave `private`, que los expone. Los módulos pueden contener submódulos, lo que permite la creación de espacios de nombres anidados.
De forma similar a la usingpalabra clave en C++, Rust tiene una usepalabra clave para importar símbolos al ámbito actual.
mod my_module { pub trait Greet { fn greet ( & self ); }pub struct Person { pub name : String , }impl Saludar para Persona { fn saludar ( & self ) { println! ( "Hola, {}!" , self . nombre ); } } }fn main () { use my_module ::{ Person , Greet };let person = Person { name : String :: from ( "Alice" ) }; person . greet (); }Escribir indica al compilador que busque un archivo llamado o . en una instrucción se refiere a la raíz del "crate" (proyecto) actual, mientras que se puede usar para referirse al módulo padre.modutil;util.rsutil/mod.rscrateusesuper
mod util ;usar std :: fs :: File ;use crate :: util :: ConfigLoader ; use crate :: util :: logging ::{ Logger , LoggerFactory };pub struct App { config_loader : ConfigLoader ; }impl App { pub fn new () -> Self { config_loader = ConfigLoader :: new ( File :: open ( "config/config_file.txt" )); config_loader . load (); let logger : Logger = LoggerFactory :: get_logger ( "Main" ); logger . log ( "Iniciando la aplicación..." ); // resto del código } }La usepalabra clave en Rust es más versátil que su equivalente usingen C++. Además de importar símbolos individuales, crear alias de símbolos ase importar comodines, usepuede importar varios símbolos en la misma línea usando llaves (que pueden estar anidadas), importar espacios de nombres individuales y realizar todo lo anterior en una sola instrucción. Este es un ejemplo de cómo usar todas estas funcionalidades:
use std ::{ alloc :: Layout , // importa std::alloc::Layout fmt :: * , // importa todos los símbolos en std::fmt fs ::{ File , Metadata }, // importa std::fs::File y std::fs::Metadata io ::{ prelude :: * , BufReader , BufWriter } // importa todos los símbolos en std::io::prelude::*, std::io::BufReader y std::io::BufWriter process , // importa el espacio de nombres std::process (por ejemplo, std::process::Command puede ser referido como process::Command) time ::{ self , Duration } // importa el espacio de nombres std::time y std::time::Duration };use std :: fmt :: Result as FmtResult ; // cambia el nombre de std::fmt::Result a FmtResultEspacio de nombres XML
En XML , la especificación de espacios de nombres XML permite que los nombres de los elementos y atributos en un documento XML sean únicos, de forma similar a la función de los espacios de nombres en los lenguajes de programación. Mediante los espacios de nombres XML, los documentos XML pueden contener nombres de elementos o atributos de más de un vocabulario XML.
Espacio de nombres de SAP
En los sistemas SAP (especialmente en entornos ABAP), los espacios de nombres se utilizan para evitar conflictos de nombres entre objetos estándar proporcionados por SAP y desarrollos de clientes o socios. [ 15 ]
Un identificador de espacio de nombres está delimitado por “/” (por ejemplo, `/MYNS/`) y se reserva mediante el proceso de registro de espacios de nombres de SAP. Una vez reservados, los objetos creados bajo ese espacio de nombres son identificables de forma única y están protegidos contra sobrescrituras no deseadas por actualizaciones o importaciones de SAP. [ 16 ]
En los entornos SAP modernos (como ABAP en la nube y los contenedores HDI), los espacios de nombres también se utilizan para agrupar semánticamente artefactos o paquetes de desarrollo.
Emulando espacios de nombres
En los lenguajes de programación que carecen de soporte para espacios de nombres, estos pueden emularse hasta cierto punto mediante una convención de nomenclatura de identificadores . Por ejemplo, las bibliotecas de C como libpng suelen usar un prefijo fijo para todas las funciones y variables que forman parte de su interfaz expuesta. Libpng expone identificadores como:
png_create_write_struct png_obtener_firma png_read_row png_set_inválido
Esta convención de nomenclatura proporciona una garantía razonable de que los identificadores son únicos y, por lo tanto, pueden usarse en programas más grandes sin conflictos de nombres . [ 17 ] Del mismo modo, muchos paquetes escritos originalmente en Fortran (por ejemplo, BLAS , LAPACK ) reservan las primeras letras del nombre de una función para indicar el grupo al que pertenece la función.
Esta técnica tiene varios inconvenientes:
- No se adapta bien a los espacios de nombres anidados; los identificadores se vuelven excesivamente largos ya que todos los usos de los identificadores deben estar completamente calificados con el espacio de nombres ;
- Es posible que particulares u organizaciones utilicen convenciones de nomenclatura inconsistentes, lo que podría generar confusión no deseada;
- Las operaciones compuestas o "basadas en consultas" sobre grupos de identificadores, según los espacios de nombres en los que se declaran, resultan difíciles de manejar o inviables;
- En lenguajes con longitud de identificador restringida, el uso de prefijos limita la cantidad de caracteres que se pueden usar para identificar lo que hace la función; este es un problema particular para los paquetes escritos originalmente en FORTRAN 77 , que ofrecían solo 6 caracteres por identificador; por ejemplo, el nombre de la función BLAS
DGEMMindica que opera con números de punto flotante de doble precisión (D) y matrices generales (GE), con solo los dos últimos caracteres (MM) mostrando lo que realmente hace: multiplicación de matriz-matriz.
También tiene algunas ventajas:
- No se requieren herramientas de software especiales para localizar nombres en archivos de código fuente; basta con un programa sencillo como grep .
- No existen conflictos de nombres relacionados con el espacio de nombres;
- No es necesario modificar los nombres, por lo que no existen posibles problemas de incompatibilidad.
Véase también
- Código postal de punto de entrega de 11 dígitos
- Nomenclatura binomial (género-especie en biología )
- nomenclatura química
- Clasificación Decimal Dewey
- identificador de objeto digital
- Sistema de nombres de dominio
- Identidad (programación orientada a objetos)
- Clasificación de la Biblioteca del Congreso
- Catálogos estelares y convenciones de nomenclatura astronómica
- Violación del nivel de abstracción
- Espacio de nombres XML
- Búsqueda de nombres dependiente de argumentos
Referencias
- ↑ Aniket, Siddharth; Aditya, Anushka; Deepa, Chaya; Cermak, Batman; Chaiken, Ronnie; Douceur, John; Howell, Jon; Lorch, Jacob; Theimer, Marvin; Wattenhofer, Roger (2002). FARSITE: Almacenamiento federado, disponible y confiable para un entorno de confianza incompleta (PDF) . Actas del Simposio USENIX sobre diseño e implementación de sistemas operativos. Archivado del original (PDF) el 28 de julio de 2010.
La estructura principal establecida por un sistema de archivos es un espacio de nombres de directorio jerárquico, que es el repositorio lógico para los archivos.
- ↑ "Preguntas frecuentes sobre C#: ¿Qué es un espacio de nombres?" . C# Online Net. Archivado del original el 20/10/2013 . Consultado el 23/02/2010 . Un espacio de nombres no es más que un grupo de ensamblados, 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
de espacios de nombres de C#
permite anidar espacios de nombres.
- ↑ "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 considerarse un concepto abstracto en muchos contextos. 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.
- ↑ "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 gestión del espacio de nombres. ... 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.
- ↑ Espacios de nombres en XML 1.0 . W3C (Informe) (3.ª ed.). Grupo de trabajo XML Core. 8 de diciembre de 2009. Consultado el 30 de marzo de 2012 .
- ↑ Moats, Ryan (mayo de 1997). "Sintaxis" . Sintaxis URN . Grupo de Trabajo de Ingeniería de Internet (IETF). pág. 1, sec. 2. doi : 10.17487/RFC2141 . RFC 2141. Consultado el 30 de marzo de 2012 .
- ↑ Stephen J. Gowdy. "Lista de identificadores USB" . 2013.
- ↑ Sollins y 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 .
- ↑ "Preguntas frecuentes sobre C#: ¿Qué es un espacio de nombres?" . C# Online Net . Archivado del 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.
- ↑ "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 .
- ↑ "Los espacios de nombres permiten agrupar entidades como clases, objetos y funciones bajo un nombre" . Cplusplus.com . Consultado el 26 de julio de 2011 .
- ↑ "6. Módulos" . El tutorial de Python . Fundación de software Python . Consultado el 25 de octubre de 2010 .
- ↑ "Ámbitos y espacios de nombres de Python" . Docs.python.org . Consultado el 26 de julio de 2011 .
- ↑ https://docs.python.org/3/tutorial/modules.html "En general, la práctica de importar * desde un módulo o paquete no está bien vista"
- ↑ "Descripción general del espacio de nombres de SAP" . SAPVista . Consultado el 7 de octubre de 2025.
Los sistemas SAP utilizan espacios de nombres para evitar conflictos de nombres entre los objetos estándar de SAP y los desarrollos específicos del cliente.
- ↑ "SAP Help Portal – Documentación sobre conectividad ABAP y espacios de nombres" . SAP Help Portal . Consultado el 7 de octubre de 2025.
En SAP Application Interface Framework, los espacios de nombres se utilizan para la estructuración lógica de objetos y configuraciones.
- ↑ Danny Kalev. "Por qué odio los espacios de nombres" . Archivado del original el 9 de julio de 2016.
{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )
- Convenciones de nomenclatura
- Comparación de lenguajes de programación