Algumas linguagens de programação (por exemplo, Java e C ++) possuem recursos de linguagem chamados "packages" ou "namespaces". Quão útil é realmente ter espaços para nome? É possível marcar funções e classes como pertencentes a alguma biblioteca específica sem usar esse recurso de linguagem, como o SDL (por exemplo SDL_BlitSurface()
). Os espaços para nome não são úteis o suficiente para valer a pena? Eles são úteis em bibliotecas, mas não em aplicativos? Eles são úteis em qualquer lugar, exceto em pequenos projetos? Pensamentos?
organization
naming
packages
compman
fonte
fonte
using
um espaço para nome específico e não precisa colocar o prefixo no início dos identificadores nesse espaço para nome.using
, porimport xxxxxxxxx as yyy
etc.using SDL;
ou ter que digitar emSDL_*
todos os lugares?A maioria dos idiomas (todos?) Com namespaces tendem a ser orientados a objetos. Muitas vezes, um nome legível por humanos para um tipo é apropriado, mesmo que haja várias implementações incompatíveis. (isso traz outras questões sobre a reutilização orientada a objetos, mas não é sobre isso que se trata). Por exemplo, em Java, você possui um Timer usado para tarefas da interface do usuário em segundo plano e um Timer usado para tarefas do aplicativo em segundo plano (não vinculadas ao AWT / Swing). O espaço para nome permite que você tenha esses objetos com o mesmo nome vivendo em diferentes sub-APIs.
A razão pela qual os namespaces surgiram tinha a ver com a tarefa irracional de antecipar como outros desenvolvedores nomeariam seus objetos. O C ++ introduziu o conceito (ou pelo menos foi o primeiro idioma ao qual fui exposto) e foi útil, mesmo que não houvesse diretrizes sobre as melhores práticas de uso. Java adaptou o conceito e adicionou algumas "práticas recomendadas" que incluíam o nome da sua empresa no espaço para nome. Dessa forma, você só precisava se preocupar com sua própria empresa.
A prefixação pode se tornar bastante confusa. Quando você aplica? Quando você não o aplica? Estruturas / classes / métodos globais obtêm o prefixo? E os métodos? E as propriedades na estrutura. Eu já vi todas essas coisas no código, embora felizmente nem todas de uma vez. Os espaços para nome fornecem alguma previsibilidade para todas essas perguntas e o tornam um recurso de linguagem e não uma "melhor prática" pessoal.
fonte
Eu acho que os namespaces são uma ótima idéia. Eles ajudam a evitar conflitos de nomes, limitando o escopo de um nome. Nos pacotes Java, a convenção de nomenclatura sugerida é baseada em nomes de domínio, que devem ser exclusivos, o que ajuda a evitar conflitos de nomes nas bibliotecas personalizadas. No geral, eles tornam os nomes um pouco mais exclusivos no sentido amplo, enquanto ainda dão ao programador um pouco mais de liberdade em nomear suas peças sem ter que seguir alguma convenção de nomes obscura.
fonte
Espaços para nome / Módulos / Pacotes são úteis para evitar conflitos de nome. O mesmo ocorre com a prefixação de nomes, mas os namespaces têm a conveniência adicional de poder importar símbolos para o namespace atual, para que você não precise se preocupar com todo o Namespace :: *.
Alguns idiomas (como Python) ampliam essa capacidade, permitindo importar apenas símbolos específicos para o módulo atual ou importar símbolos como um nome diferente. Isso é útil se você estiver interessado apenas em algumas classes / funções / constantes ou se alguns dos símbolos entrarem em conflito com os símbolos no seu espaço para nome, mas outros não.
Algumas linguagens (como Ruby) permitem incluir os métodos de um módulo em sua classe. Isso é útil para polimorfismo e genéricos. Por exemplo, se você tiver várias classes que possuem iteradores que agem da mesma maneira, é possível misturar métodos a todas essas classes a partir de um módulo separado que fornece métodos para classificar e filtrar os dados no objeto. Isso permite
has a
relacionamentos, bem como relacionamentosis a
(herança).fonte