Clase VERSUS espacio de nombres, O clase y espacio de nombres? [cerrado]

Tanto la clase como el espacio de nombres?

Esta pregunta es sobre un patrón que me estoy viendo cada vez más: tener una clase y un espacio de nombres para los conceptos relacionados. Creo que esto está motivado principalmente por los artefactos del lenguaje C ++, pero no totalmente.

Supongo que la pregunta de nivel superior es: ¿es una buena idea? ¿Tener tanto una clase como un espacio de nombres para conceptos relacionados?

Pregunta de nivel inferior:

¿Cuál es la mejor manera de hacer esto?

¿Clase anidada dentro del espacio de nombres ?:

namespace Foo_Namespace {
   class Foo_Class {
       ...
   };
}

¿O separados, pares, clase y espacio de nombres ?:

class Foo_Class {
    ...
};
namespace Foo_Namespace {
   // non-class free functions, etc.
}

Debo admitir que me inclino por anidar la clase dentro del espacio de nombres. A pesar de que lleva a nombres feos. Pero incluso si hago eso, qué convenciones de nombres debo usar:

Lo siguiente es demasiado largo, lo que lleva a nombres realmente feos Foo_Namespace :: Foo_Class

namespace Foo_Namespace {
   class Foo_Class {
       ...
   };
}

No es necesario usar ningún sufijo o indicador en el nombre:

namespace Foo {
   class Foo {
       ...
   };
}

Pero luego me siento incierto, cuando veo Foo :: bar (), si esa es una barra de función libre en namespace :: Foo, es decir :: Foo :: bar (), o una función miembro en la clase Foo en namespace :: Foo :: Foo :: bar ().

Y nombres como :: Foo :: Foo :: bar todavía no son, umm, bien.

Actualmente estoy haciendo

No es necesario usar ningún sufijo o indicador en el nombre:

namespace Foo_ns {
   class Foo {
       ...
   };
}

principalmente porque normalmente creo la clase primero, y luego me doy cuenta de que un espacio de nombres sería bueno.

Me pregunto si debería revivir una convención de nombres que no he usado en años: _c para la clase, _ns para los espacios de nombres:

namespace Foo_ns {
   class Foo_c {
       ...
   };
}

Detalles:

No repetiré lo que he dicho anteriormente, pero añadiré un poco más.

La razón más práctica que conozco para usar un espacio de nombres además de una clase es que se le permite hacer declaraciones de funciones libres en un espacio de nombres, pero no se le permite hacer declaraciones de algunos métodos de una clase. Es decir. Con una clase tienes que declararlo todo o nada. Mientras que con las funciones libres en general, y las funciones libres en los espacios de nombres en particular, puede declararlo poco a poco. Las partes se pueden declarar en diferentes archivos de cabecera. En lugar de #incluir una biblioteca masiva de solo encabezado para una clase masiva, puede usar declaraciones hacia adelante para solo una o dos funciones. Etc.

(Ver, por ejemplo,http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations, aunque Google se opone a las declaraciones a futuro en lugar de incluir un encabezado.)

Otra razón es que un espacio de nombres permite que la clase se mantenga pequeña.

La mayor ventaja para una clase es que una clase se puede pasar a una plantilla, mientras que un espacio de nombres no puede ser.

Prefiero tener la clase anidada dentro del espacio de nombres, Foo_ns / Foo_ns :: Foo_c en lugar de tenerlos como compañeros Foo_ns / Foo_c, porque a menudo una clase necesita clases auxiliares, por ejemplo. Foo_ns / Foo_ns :: Foo_c / Foo_ns :: Foo_Helper_c. Si la clase y el espacio de nombres son iguales, parece extraño tener Foo_ns / Foo_c pero Foo_ns :: Foo_Helper_c.

Me gustan los espacios de nombres, porque estoy de acuerdo con Andrei Alexandresciu:http://laser.inf.ethz.ch/2012/slides/Alexandrescu/1-C++%20course%20parts%201%20and%202.pdf

 Class methods vs. free functions

 • Conventional wisdom: methods are cool, free functions are so 1960s
 • Yet:
   ◦ Free functions improve encapsulation over methods
   ◦ Free functions may be more general
   ◦ Free functions decouple better
   ◦ Free functions support conversions on their left-hand argument

  Surprising fact #2

    Making a function a method should be
    your last, not first, choice

  (c) 2012– Andrei Alexandrescu. 32 / 59

Es mejor crear funciones libres que métodos en clases.

Pero a veces las clases solo tienen que usarse, por ejemplo, para plantillas.

Convención de nombres sabio

Usé Foo_ns / Foo_ns :: Foo_c en el pasado

Estoy usando Foo_ns / Foo_ns :: Foo ahora

(Por cierto, tiendo a usar Class_Names_With_Underscores_and_Initial_Caps, no CamelCase).

Si tiene sentido, podría omitir el sufijo _ns en el espacio de nombres, por ejemplo, donde el espacio de nombres y la (s) clase (s) no necesitan tener el mismo nombre.

No me gusta que tengan el mismo nombre. Considere un constructor para una clase Foo dentro de un espacio de nombres foo:

:: Foo :: Foo :: Foo () vs :: Foo_ns :: Foo :: Foo ()

Este último no es mucho mejor, pero es un poco menos confuso.

Creo que normalmente creo la clase por sí misma, sin anidarla en un espacio de nombres. De hecho, probablemente agregue algunos métodos estáticos, antes de darme cuenta de que una clase anidada dentro de un espacio de nombres sería mejor. En esa etapa puede ser un problema refactorizar, y a veces termino creando funciones de reenvío, que reenvían desde el método estático de clase a la función libre en el espacio de nombres, o viceversa. Esto hace que me arrepienta de botar para saltar a la clase dentro del espacio de nombres desde el paso 1.

Conclusión

Mi BKM actual es Foo_ns / Foo_ns :: Foo, es decir,

namespace Foo_ns {
   class Foo { 
   ...
   };
}

Apreciaría cualquier sugerencia, cualquier mejora.

¿O simplemente estoy roto por hacer esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta