que - ¿Prefieres espacios de nombres explícitos o ''usar'' en C++?
using namespace std que es (8)
Escribir extra no es el problema aquí. El problema con los nombres explícitamente calificados es el desorden visual. Reconozcámoslo, la sintaxis de C ++ es desordenada. No hay necesidad de empeorar esto innecesariamente haciendo nombres más largos y rociando el código generosamente con ::
s.
Estoy con Jeff Atwood: El mejor código es No Code At All . Esto es tan cierto.
Las importaciones del espacio de nombres son una excelente manera de reducir el desorden sin inconvenientes: siempre que el alcance de los espacios de nombres abiertos se reduzca a una sola unidad de compilación 1 , los conflictos de nombres, en caso de que aparezcan, se pueden resolver fácilmente.
Por qué los nombres explícitos deberían (en general) ser más legibles siempre ha sido un misterio para mí. Los lectores generalmente deberían conocer el código lo suficientemente bueno para poder deducir la semántica. Si no lo son, el código debe arreglarse de todos modos.
1) Corolario: ¡no using
en los encabezados!
Al utilizar espacios de nombres C ++, ¿prefiere nombrarlos explícitamente de esta manera?
std::cout << "Hello, world!/n";
¿O prefiere using namespace
?
using namespace std;
cout << "Hello, world!/n";
Y si prefieres lo último, ¿declaras tus usos al alcance del archivo o la función?
Personalmente prefiero nombrarlos explícitamente, es más tipear, pero al usar una mezcla de espacios de nombres (por ejemplo, std
y boost
) me resulta más legible.
Mi regla general es usar siempre explícitamente el espacio de nombres en los encabezados, y usualmente usarlo en el código. La razón para lo primero es dejar explícitamente claro en cada parte de la definición lo que se está utilizando, y la razón para esto último es que hace que sea fácil usar reemplazos de otro espacio de nombres si es necesario. es decir, si queremos comenzar a usar foo :: string en lugar de std :: string, solo necesitamos actualizar el encabezado y la instrucción using en lugar de reemplazar cada instancia de std :: string con foo :: string en el código.
Por supuesto, eso es menos útil para las clases que residen en el espacio de nombres std ::, incluso si reemplaza una clase, es probable que use otras en std, y puede encontrar problemas de ambigüedad, pero eso fue sólo un ejemplo.
Siempre uso el using namespace
de using namespace
para std & boost. Todo lo demás tiendo a usar un espacio de nombres explícito a menos que se use tanto que pueda saturar el código.
En los encabezados, nunca uso el using namespace
de using namespace
para evitar contaminar el espacio de nombres global de la fuente #including.
Solo uso espacios de nombres explícitos cuando hay alguna ambigüedad. Es más legible, pero el tipeo extra es demasiado tedioso, y debes asumir que otros desarrolladores tienen un nivel básico de familiaridad con las bibliotecas estándar.
Las únicas otras veces que deletreo un espacio de nombres son cuando solo lo uso una o dos veces, como agregar una declaración de depuración rápida, o si estoy usando alguna biblioteca no estándar.
Por lo general, declaro el espacio de nombres en el alcance del archivo, pero si está mezclando espacios de nombres, podría tener sentido colocar la declaración más cerca del punto donde se usa, en el alcance de la función.
Tiendo a importar explícitamente los nombres que necesito en la parte superior del archivo .cpp, así que ...
usando std :: cout; usando std :: endl;
etc ...
De esa manera tengo control sobre los nombres que uso y es fácil ver de dónde vienen y el código no está desordenado en el punto de uso.
En los raros casos en que utilizo dos nombres de diferentes espacios de nombres, los califico completamente en el punto de uso.
Siempre utilizo nombres totalmente calificados en los encabezados y casi nunca utilizo ''using namespace x'' en cualquier lugar ...
Yo uso siempre los explícitos. Escribir std no me duele y veo claramente de dónde viene. Es útil cuando tienes algún proyecto heredado que cuidar con sus propias "cadenas", "vectores", etc. para mantener. Cuanta más información lleve el código, mejor.
using
en el alcance de la función, o si la función es muy pequeña (a menudo lo es), solo espacio de nombres explícito
using
y el using namespace
son muy, muy útiles para hacer que el código sea más legible: elimine el desorden.
Pero en cualquier caso en el que sea más difícil averiguar de dónde viene un símbolo, me niego a importar su espacio de nombre completo.
Intento limitar el alcance de los espacios de nombres importados:
void bar() {
// do stuff without vector
{ using std::vector;
// do stuff with vector
}
// do stuff without vector
}
Para bibliotecas "generalmente conocidas", como std
, me atrevería a using namespace std
. Hay razones para creer que todos los que leen este código conocen estos símbolos.
Como nota al margen, la palabra clave using
también se usa para indicar que una clase derivada también exporta los miembros sobrecargados de su superclase.
class A {
void f( A );
void f( bool );
};
class B : public A {
using A::f; // without this, we get a compilation error in foo()
void f(bool);
};
void foo() {
B b;
b.f( A() ); // here''s a compilation error when no `using` is used in B
}