c++ - que - identificador de variables
c++ uso de espacio de nombres y reglas de nombres (4)
En el proyecto, estamos tratando de llegar a un acuerdo sobre el uso del espacio de nombres. Decidimos que el primer nivel será "productName" y el segundo es "moduleName".
productName::moduleName
Ahora, si el módulo es una especie de módulo de utilidad, no hay problema para agregar un tercer espacio de nombres. Por ejemplo, para agregar "str": productName :: utilityModuleName :: str - para dividir el espacio donde irán todas las cosas relacionadas con "cadenas".
Si el módulo es el módulo principal de negocios, tenemos muchas oportunidades y casi ningún acuerdo.
Por ejemplo
class productName::mainModuleName::DomainObject
y
class productName::mainModuleName::DomainObjectSomethingElseViewForExample
puede ser ambos en
namespace productName::mainModuleName::domainObject
class Data
class ViewForExample
¿Por qué deberíamos crear clases internas no privadas y no espacios de nombres? ¿Por qué deberíamos crear una clase donde todos los métodos son estáticos (excepto en los casos en que esta clase será un parámetro de plantilla)?
El proyecto consiste en 1Gb de código fuente. Entonces, ¿cuál es la mejor práctica para dividir módulos en espacios de nombres en c ++?
Divido los espacios de nombres dependiendo de sus usos:
Tengo un espacio de nombres separado, donde he definido todas mis interfaces (clases virtuales puras).
Tengo un espacio de nombres separado, donde he definido mis clases de biblioteca (como db library, processing library).
Y tengo un espacio de nombres separado, donde tengo mis objetos centrales de negocios (lógica empresarial) (como purchase_order, etc.).
Supongo que se trata de definirlo de una manera, que no se vuelve difícil de manejar en el futuro. Por lo tanto, puede verificar las dificultades que rodearán su diseño actual.
Y si crees que están bien, deberías ir con eso.
Me parece que estás tratando de usar los espacios de nombres como una herramienta de diseño. No están destinados a eso, están destinados a evitar choques de nombres. Si no tiene los choques, no necesita los espacios de nombres.
Todo esto es subjetivo, pero dudaría en profundizar más de 3 niveles. Simplemente se vuelve demasiado difícil de manejar en algún momento. Entonces, a menos que su código base sea muy, muy grande, lo mantendría bastante superficial.
Dividimos nuestro código en subsistemas, y tenemos un espacio de nombres para cada subsistema. Las cosas de utilidad irían a su propio espacio de nombres si de hecho son reutilizables en los subsistemas.
Qué espacios de nombres son para:
Los espacios de nombres están destinados a establecer un contexto solo para que no tenga conflictos de nombres.
Reglas generales:
Especificar demasiado contexto no es necesario y causará más inconvenientes de lo que vale la pena.
Así que quieres usar tu mejor juicio, pero sigue estas dos reglas:
- No seas demasiado general al usar espacios de nombres
- No seas demasiado específico al usar espacios de nombres
No sería tan estricto sobre cómo usar los nombres de los espacios de nombres, y simplemente usar los espacios de nombres basados en un grupo de código relacionado.
Por qué los espacios de nombres que son demasiado generales no son útiles:
El problema de dividir el espacio de nombres que comienza con el nombre del producto es que a menudo tendrá un componente de código o alguna biblioteca base que es común a varios productos.
Tampoco utilizará los espacios de nombres del Producto 2 dentro del Producto1, por lo que especificarlo explícitamente no tiene sentido. Si estaba incluyendo los archivos de Product2 dentro de Product1, ¿es esta conversión de nombres aún útil?
Por qué los espacios de nombres que son demasiado específicos no son útiles:
Cuando tiene espacios de nombres que son demasiado específicos, la línea entre estos espacios de nombres distintos comienza a aparecer borrosa. Comienzas a usar los espacios de nombres dentro de cada uno de un lado a otro. En este momento es mejor generalizar el código común bajo el mismo espacio de nombres.
Clases con todas las plantillas estáticas vs:
"¿Por qué deberíamos crear clases internas no privadas y no espacios de nombres? ¿Por qué deberíamos crear clases donde todos los métodos son estáticos"
Algunas diferencias:
- Los espacios de nombres pueden ser implícitos usando la palabra clave
using
- Los espacios de nombres pueden ser alias, las clases son tipos y se pueden tipear
- Los espacios de nombres se pueden agregar a; Puede agregarle funcionalidad en cualquier momento y agregarla directamente
- Las clases no se pueden agregar sin crear una nueva clase derivada
- Los espacios de nombres pueden tener declaraciones hacia adelante
- Con las clases puedes tener miembros privados y miembros protegidos.
- Las clases se pueden utilizar con plantillas.
Exactamente cómo dividir:
"El proyecto consta de 1 Gb de código fuente. Entonces, ¿cuál es la mejor práctica para dividir módulos en espacios de nombres en c ++?"
Es demasiado subjetivo decir exactamente cómo dividir su código sin el código fuente exacto. La división basada en los módulos, aunque suena lógico, no es todo el producto.