La mayoría de los idiomas (¿todos?) con espacios de nombres tienden a estar orientados a objetos. Muchas veces, un nombre legible para un tipo es apropiado, aunque existen múltiples implementaciones incompatibles. (Esto plantea otros problemas en la reutilización orientada a objetos, pero de eso no se trata esta pregunta). Por ejemplo, en Java tiene un temporizador que se usa para tareas de UI en segundo plano y un temporizador que se usa para tareas de aplicación en segundo plano (no vinculado a AWT / Swing). El espacio de nombres le permite tener estos objetos del mismo nombre que viven en diferentes sub-APIs.
La razón por la que surgieron los espacios de nombres tuvo que ver con la tarea irrazonable de anticipar lo que otros desarrolladores nombrarán sus objetos. C ++ introdujo el concepto (o al menos fue el primer lenguaje al que fui expuesto con el concepto), y fue útil aunque no existían pautas sobre las prácticas de mejor uso. Java adaptó el concepto y agregó algunas "mejores prácticas" que incluían el nombre de su empresa en el espacio de nombres. De esa manera, solo tenía que preocuparse por su propia empresa.
El prefijo puede ser bastante desordenado. ¿Cuándo lo aplicas? ¿Cuándo no lo aplica? ¿Las estructuras / clases / métodos globales obtienen el prefijo? ¿Qué pasa con los métodos? ¿Qué pasa con las propiedades en la estructura. He visto todas estas cosas en código, aunque afortunadamente no todas a la vez. Los espacios de nombres proporcionan cierta previsibilidad a todas estas preguntas y lo convierten en una característica del lenguaje en lugar de una "mejor práctica" personal.