2009-06-13 21 views
18

No tomé la ruta CS habitual para aprender programación y a menudo escucho sobre espacios de nombres pero realmente no entiendo el concepto. Las descripciones que he encontrado en línea suelen estar en el contexto de C con el que no estoy familiarizado.¿Qué es un espacio de nombres?

He estado haciendo Ruby durante 2 años y estoy tratando de obtener una comprensión más profunda del lenguaje y la programación orientada a objetos.

+7

No te desanimes: un título CS no es un buen predictor de un buen desarrollador y sospecho que la mayoría de los desarrolladores a nivel mundial no están tan afligidos. –

Respuesta

13

Un espacio de nombres proporciona un envase para guardar cosas como las funciones, clases y constantes como una forma de agruparlos de manera lógica y para ayudar a evitar conflictos con funciones y clases con el mismo nombre escrito por otra persona.

En Ruby esto se logra utilizando módulos.

3

simplemente pensar en ella como una agrupación lógica de objetos y funcionalidad

2

Wikipedia tiene un artículo breve pero útil en espacios de nombres en general, así como mucho más detallada one de espacios de nombres en la informática, con el lenguaje específico ejemplos & c.

El punto clave es que cuando no se pueden "agrupar lógicamente" nombres en espacios de nombres, es decir, solo tiene un único "espacio" indiferenciado donde viven todos los nombres, para evitar choques accidentales se vuelve a implementar torpemente la funcionalidad de espacio de nombres rudimentario mediante trucos como los prefijos de nombre & c. Por ejemplo, "dibujar" significa algo muy diferente a un artista o a un pistolero; si no pudiera tener espacios de nombres separados para cosas de artistas y cosas de pistolero, terminaría con identificadores como artist_draw y gunslinger_draw, y todavía riesgo de conflictos accidentales si algunos autores de la biblioteca usan convenciones diferentes, etc.

2

De php.net:

¿Cuáles son los espacios de nombres? En la definición más amplia , los espacios de nombres de definición son una forma de encapsular elementos . Esto se puede ver 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. Como un ejemplo concreto de , el archivo foo.txt puede existir en tanto directorio/home/greg como en /home/other, pero dos copias de foo.txt no pueden coexistir en el mismo directorio. Además, para acceder al archivo foo.txt fuera del/ directorio/home Greg, hay que anteponer el nombre directorio para el nombre del archivo usando el separador de directorio para obtener /home/greg/foo.txt. Este mismo principio se extiende a los espacios de nombres en el mundo de programación .

Por lo tanto, como se menciona en otro cartel, los espacios de nombres se pueden usar para agrupar elementos.

Para ver por qué esto podría ser útil, supongamos que desea escribir un complemento para, por ejemplo, Wordpress, y desea crear una clase llamada 'MyClass'. Sin embargo, el problema es que no tienes idea si algún otro desarrollador ya ha escrito otro complemento de Wordpress usando una clase llamada 'MyClass'. Entonces, para evitar conflictos de nombres, en su lugar debe nombrar a su clase 'MyPluginMyClass'. Esto es molesto, pero probablemente evita conflictos de nombres.

Pero luego viene el lanzamiento de PHP 5.3, que finalmente admite espacios de nombres (asumamos, también, que Wordpress y todos los servidores en los que se implementa actualizan a PHP 5.3). Ahora puede crear un espacio de nombres, decir 'MyPlugin' y encapsular 'MyClass' dentro de él. Una vez hecho esto, puede publicar su plugin sin preocuparse de que su versión de 'MyClass' entrará en conflicto con la versión de 'MyClass' de otra persona.

15

Definición de namespace de Wikipedia:

Un espacio de nombres es un contenedor abstracto o entorno creado para sostener una agrupación lógica de identificadores únicos (es decir, nombres). ...

Por ejemplo, un lugar donde puedes encontrar espacios de nombres utilizable es algo como esto:

se define una constante o una variable, o incluso una clase que tiene un nombre genérico. Si no desea renombrar esta constante/variable/clase, pero necesita tener otra con el mismo nombre, puede definir esa nueva instancia en diferentes espacios de nombres.

En ruby, un módulo es básicamente lo mismo que un espacio de nombres en C++.

por ejemplo:

module Foo 
    BAZ = 1 
end 

module Bar 
    BAZ = 2 
end 

puts Foo::BAZ #=> 1 
puts Bar::BAZ #=> 2 

Así que, ahí, se tiene constante BAZ declarado en dos módulos (espacios de nombres de alias en rubí)

42

Voy a proporcionar una descripción más común.

Digamos que mi esposa tiene una hermana llamada Sue, y yo también. ¿Cómo puedo diferenciarlos en una conversación? Al usar sus apellidos ("Sue Larson" vs "Sue Jones"). El último nombre es el espacio de nombres.

Este es un ejemplo limitado, por supuesto, y en la programación, los posibles miembros de la familia pueden ser mucho más numerosos que mi ejemplo, por lo tanto, el potencial de colisiones es mayor. Los espacios de nombre también son jerárquicos en algunos idiomas (por ejemplo, java), que no tiene un paralelo con los apellidos.

Pero, por lo demás, es un concepto similar.

+1

Gracias por su maravillosa explicación. Tan simple cuando se explica así. – Sam

+6

Otro ejemplo: si tiene 'Building :: Key' y' Piano :: Key' en la misma aplicación, los espacios de nombres mantienen separadas las clases 'Key'. –

2

Respuesta más corta: espacios de nombres crean alcance.

+0

¿Qué quiere decir con "alcance" en este contexto? –

+0

El ámbito abarca el contexto donde se asocian los objetos. Consulte: http://winterdom.com/dev/cpp/nspaces. ¿Estás de acuerdo? – Ninad

Cuestiones relacionadas