programa - Enfoque coherente para cambiar el nombre de los espacios de nombres en C++
programa que pida nombre y edad en c++ (1)
Cuando se usan espacios de nombres anidados, a veces los nombres completamente calificados terminan siendo bastante largos. Sé que puedo usar el namespace abc = aaa::bbb::ccc
para reducir la cantidad de escritura (también puede mejorar la legibilidad en algunos casos).
No estoy seguro, sin embargo, cuál es la mejor manera de lograr este cambio de nombre en todos los archivos de un proyecto. El enfoque directo (es decir, para cambiar el nombre de espacios de nombres largos en una base por uso) podría llevar a usar diferentes nombres cortos para el mismo nombre completo en diferentes archivos. Por lo tanto, estaba pensando en encontrar una manera más consistente de hacer esto.
Por ejemplo, asumamos algo como:
project
|- client
| |- core
| |- plugin
| |- util
|- server
...
Estaba pensando en crear un encabezado por directorio incluyendo los nombres reducidos. Por ejemplo, project/client/core/core.h
contendría el namespace pr_cl_core = project::client::core
(Sé que el ejemplo para este nombre corto es bastante pobre, pero en proyectos reales tienen más sentido). Luego, incluiría core.h
en todos los archivos de encabezado en project/client/core
para que cuando se incluya un encabezado de ese directorio, digamos, project/client/plugin/plugin_foo.h
, las versiones de espacios de nombres cortos sean fáciles disponible.
¿Es este un buen enfoque para hacerlo? ¿Hay alguna otra forma mejor?
He encontrado varias preguntas sobre los espacios de nombres de C ++ en SO (por ejemplo, 1 y 2 ), pero ninguna de ellas se relaciona con la forma de resolver el cambio de nombre del espacio de nombres de una manera que abarque todo el proyecto.
EDITAR: Además, este mecanismo podría usarse para renombrar sistemáticamente espacios de nombres largos (como los de Boost) para un proyecto completo. Por ejemplo, normalmente renombro algunos espacios de nombres como:
namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;
Actualmente lo hago por unidad de traducción, pero me gustaría hacerlo utilizando un enfoque global para todo el proyecto.
Yo diría que si tiene que escribir repetidamente nombres largos de espacio de nombres, entonces algo está mal en su jerarquía de espacio de nombres.
Supongamos que tendrías lo mismo con las clases, encontrándote repetidamente escribiendo obj->sub()->subsub()->some_method()
. Esto sería una violación de la Ley de Deméter . En el caso de las clases, usted debería refactorizar su código (escribiendo funciones de envoltorio) para que las clases en la jerarquía solo tengan que acceder a los métodos de un nivel superior.
Lo mismo se debe hacer con los espacios de nombres: si tiene que llamar a project::client::core
entonces debe escribir funciones de contenedor / clases en el client
para exponer las interfaces necesarias para project
. Si necesita hacer esto en todas partes, ¿por qué no aplana la estructura de su espacio de nombres para que el client
y el core
estén al mismo nivel?
El hecho de que Boost use el espacio de nombres anidado solo es en parte cierto, ya que la mayoría de los espacios de nombres anidados como aux
y detail
no deben ser llamados por los clientes. Por ejemplo, Boost.MPL es un ejemplo realmente bueno de una biblioteca que tiene cuidado de no exponer de forma gratuita los espacios de nombres anidados.