La maggior parte delle lingue (tutti?) con spazi dei nomi tendono ad essere orientate agli oggetti. Molte volte un nome leggibile dall'uomo per un tipo è appropriato, anche se esistono più implementazioni incompatibili. (questo solleva altri problemi sul riutilizzo orientato agli oggetti, ma non è di questo che si tratta). Ad esempio, in Java si dispone di un timer utilizzato per le attività dell'interfaccia utente in background e di un timer utilizzato per le attività in background (non legate alle attività AWT / Swing). Lo spazio dei nomi ti consente di avere questi stessi oggetti con nome che vivono in diverse API secondarie.
Il motivo per cui gli spazi dei nomi sono nati ha a che fare con l'irragionevole compito di anticipare ciò che altri sviluppatori chiameranno i loro oggetti. Il C ++ ha introdotto il concetto (o almeno è stata la prima lingua a cui sono stato esposto con il concetto) ed è stato utile anche se non ci sono state linee guida sulle migliori pratiche d'uso. Java ha adattato il concetto e aggiunto alcune "best practice" che includevano il nome della tua azienda nello spazio dei nomi. In questo modo dovevi preoccuparti solo della tua compagnia.
Il prefisso può diventare piuttosto complicato. Quando lo applicate? Quando lo usi non ? Le strutture / classi / metodi globali ottengono il prefisso? E i metodi? Che dire delle proprietà nella struttura. Ho visto tutte queste cose nel codice, anche se per fortuna non tutto in una volta. Namespace offre una certa prevedibilità a tutte queste domande e lo rende una funzionalità linguistica piuttosto che una "best practice" personale.