2012-04-08 10 views
11

Siempre pensé que el objetivo principal de un espacio de nombres es evitar la colisión de nombres y la ambigüedad.Uso de 'uso' o 'uso' en lenguajes de programación

# 1 problema fijado por espacios de nombres de php.net:

conflictos de nombres entre el código se crea, y PHP interna clases/funciones/constantes o de terceros clases/funciones/constantes.

Sin embargo, la mayoría de los idiomas implementan la palabra clave "use" de alguna manera para alias o importar otro espacio de nombres al actual. Sé cómo funciona, pero no entiendo por qué se usa esa funcionalidad.

¿No está utilizando una palabra clave de 'uso' que infringe efectivamente el propósito de un espacio de nombres?

namespace core\utils; 

class User { 
    public static function hello(){ 
     return "Hello from core!"; 
    } 
} 
//--------------------------------------------------- 

namespace core2\utils; 

class User { 
    public static function hello(){ 
     return "Hello from core2!"; 
    } 
} 
//--------------------------------------------------- 

namespace core2; 

//causes name collision, we now have two different classes of type 'utils\User' 
use core\utils; //without this line the result is 'Hello from core2' 

class Main { 
    public static function main(){ 
     echo utils\User::hello(); 
    } 
} 

Main::main(); 
//outputs Hello from core! 
?> 

Me estoy perdiendo algo o se uso de palabras clave 'uso' muy general desanimado?

De cualquier manera, ¿en qué circunstancias es realmente una buena idea sacrificar la encapsulación?

Solía ​​usar, pero ahora no estoy seguro de cuándo se debe usar.

Edit: Bien, déjenme aclarar esto: si uso 'use' para obtener un nombre corto, ¿cómo es eso mejor que simplemente declarar la clase en el espacio de nombres global? Vea a continuación:

namespace core\utils\longname {  
    class User {} //declare our class in some namespace 
} 

//------------------Other File--------------------------- 
namespace { //in another file import our long name ns and use the class 
    use core\utils\longname\User as User; 
    new User(); 
} 

^¿Cuál es la ventaja de namespacing así en contra de esta declaración:

namespace {  
    class User {} //declare our class in global namespace 
} 

//------------------Other File--------------------------- 
namespace { //in another file just use the class 
    new User(); 
} 

¿Hay alguna diferencia entre los dos?

+0

"Uso" se usa porque es a la vez un dolor de cabeza y, contrariamente a la buena comprensión visual, tener que deletrear todo todo el tiempo. –

+0

Eso es cierto, pero parece que estoy lastimando el espacio de nombres. ¿Dónde está el límite entre la ambigüedad y la legibilidad? – Webmut

+0

Los alias deben ser redundantes.Pero actualmente son un subproducto de los espacios de nombres que no se utilizan para los fines previstos, sino que se crean taxonomías de identificador. – mario

Respuesta

3

1 cuestión muy interesante

Mi opinión

La palabra clave use como tantos usos y funcionalidades imaginar este

use core\utils\sms\gateway\clickatell\http\SmsSender as SmsCSender 
use core\utils\sms\gateway\fastSMS\ftp\Smssender as SmsFSender 

ahora Comparar

if(!SmsCSender::send($sms)) 
{ 
    SmsFSender::send($sms); 
} 

Para

if(!core\utils\sms\gateway\clickatell\http\SmsSender::send($sms)) 
{ 
    core\utils\sms\gateway\fastSMS\ftp\SmsSender::send($sms); 
} 

Conclusión

Sin namespace y use yo no sería capaz de lograr un código legible tales limpia así que lo que pienso es que namespace and use complement each other en lugar de 'uso' derrotar el propósito de un espacio de nombres

+0

Sí, el paradigma 'use ... as' es mucho mejor que los esquemas con solo' use/using/import/et al'. Desafortunadamente, no está disponible en todos los idiomas, y cuando lo hace, a veces hay restricciones extrañas (o al menos "convenciones" arcaicas que lo hacen menos que ideal). –

+0

Por supuesto, esta es probablemente la razón por la que la mayoría de la gente usa 'usar'. Sin embargo, ¿no es lo mismo que simplemente declarar la clase en el espacio de nombres global entonces? De esta forma, no tiene que meterse con 'usar', _y_ tiene código limpio. ¿Qué ventajas sigues obteniendo a través de ns globales cuando al final simplemente fusionas los espacios de nombres de todos modos con 'use'? – Webmut

+0

sin global 'ns' esa instancia no sería posible .. global' ns' es lo que define la ruta que 'use' está actuando sobre – Baba

Cuestiones relacionadas