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?
"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. –
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
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