Estoy descubriendo que lo que he considerado una "mejor práctica" para el uso del espacio de nombres en C++ está perjudicando la legibilidad de mi código y haciendo que me pregunte cómo usarlos bien.C++ namespace best practice dilemma
Mi programa consiste en unos pocos módulos diferentes que están principalmente integrados en las bibliotecas que utiliza la aplicación "principal". Cada biblioteca utiliza su propio espacio de nombres, y sus espacios de nombres están todos "dentro" de un espacio de nombres de proyecto para ayudar a evitar conflictos de nombres con código de terceros. Así que termino con nombres de clase como "myproject :: logging :: Logger" y "myproject :: reporting :: ReportType" (como ejemplos compilados).
Hasta ahora todo bien. Y en mis archivos .cpp no tengo ningún problema. Utilizo "using myproject :: logging" en la parte superior, por ejemplo, y puedo referirme limpiamente a mi clase Logging. En el improbable caso de un conflicto entre dos de mis espacios de nombres, puedo decir explícitamente cuál quiero. Esto funciona bien
Sin embargo, los archivos de encabezado son diferentes. Se considera una mala práctica colocar declaraciones en los archivos de encabezado, ya que afectarán el código no relacionado que puede no esperarlas. Así que siempre califico completamente todos los nombres en archivos .hpp. Eso fue algo feo pero manejable hasta ahora, así que lo aguanté. Pero ahora estoy aumentando el uso de código de plantilla en mis bibliotecas, lo que significa que hay mucho más código actual en mis archivos .hpp ahora. Y tener que calificar completamente cada nombre hace que el código sea prácticamente ilegible debido a la longitud de los nombres de tipo.
Estoy empezando a sentir que los beneficios de los espacios de nombres y las mejores prácticas para usarlos están empezando a ser superados por la imposibilidad de escritura del código que estoy escribiendo. Estoy empezando a preguntarme si sería mejor abandonar el uso de espacios de nombres para obtener el beneficio de un código más legible y solucionar cualquier conflicto de nombres si aparecen y cuando aparecen.
Una alternativa es usar espacios de nombres de una sola capa, así que en lugar de "myproject :: logging :: Logger" simplemente tendría "log :: Logger" que ayudaría mucho pero haría que la probabilidad de conflictos de espacio de nombres fuera mucho mayor , y también tienen espacios de nombres que transmiten información menos útil.
Como he dicho, esto sólo afecta realmente el código en archivos .hpp como estoy feliz usando "el uso de espacio de nombres" en mis archivos de implementación para facilitar su uso, pero es convierta en un problema cuando miro mi código de plantilla en archivos .hpp ahora y piensa "eww ...." que no puede ser bueno: P
¿Alguien tiene algún consejo práctico?
'directivas using' están en el ámbito, por lo que quizás se podrían hacer algunas abreviaturas espacio de nombres que no se escapan fuera del archivo de cabecera? –