Méritos dos namespaces / pacotes


14

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?

Respostas:


16

Os prefixos de nome não são a mesma coisa que namespacing , exceto pelo fato de ser feito de uma maneira que é menos útil e mais difícil de ler / analisar? A pergunta não responde a si mesma?


Colocar um prefixo no início do nome de um identificador não é a mesma coisa que usar um recurso de idioma como espaços para nome. Por exemplo, em C ++, você pode dizer que é usingum espaço para nome específico e não precisa colocar o prefixo no início dos identificadores nesse espaço para nome.
precisa saber é o seguinte

2
@ user9521 - que é o meu ponto ...
Nicole

+1 A grande vantagem dos espaços para nome é que você pode pular / encurtar o prefixo quando não for necessário - no espaço para nome em que a coisa específica referida é definida, por using, por import xxxxxxxxx as yyyetc.

1
Como a maioria dos programadores é preguiçosa, você prefere declarar using SDL;ou ter que digitar em SDL_*todos os lugares?
Berin Loritsch

2
+1, mas acho que você realmente quis dizer "menos útil, mais difícil de ler e não verificado pelo compilador".
Larry Coleman

5

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.


Haskell tem namespaces (módulos) e não é orientado a objetos.
Jeremy Heiler

3

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.


1
No entanto, no caso da convenção específica de Java, nem todo mundo tem um site. Além disso, se você mover seu programa de um site para outro (por exemplo, Sourceforge para Github), faria sentido, mas seria inconveniente alterar os pacotes se outras coisas dependessem do seu código.
compman

1
A convenção de Java se aplica à sua organização, não ao local em que está hospedada. Você pode simplesmente se declarar uma organização e terminar com ela. Há também o problema de URLs que permitem caracteres que não podem ser usados ​​em nomes de pacotes. Mas não vamos lá. Então, para você, basta usar "me.user9521" como o nome do seu pacote e você está definido.
Berin Loritsch

1
A convenção não é sobre nomes da web, mas sobre nomes de domínio. Você pode ter um domínio sem um site.
precisa

1

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 arelacionamentos, bem como relacionamentos is a(herança).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.