Conteúdo


Criar melhores espaços de nomes em PHP

Dicas para criar espaços de nomes mais intuitivos

Comments

Os espaços de nomes — introduzidos no PHP V5.3 — são uma forma de oferecer contexto às classes, constantes e funções PHP para que os elementos com os mesmos nomes sejam compreendidos como únicos. Os nomes únicos permitem evitar colisões de nomenclatura, que ocorrem quando existem duas classes ou funções com o mesmo nome. Às vezes, essas classes PHP representam os mesmos objetos do domínio físico, mas o comportamento da classe é totalmente diferente. Os nomes de espaços são uma forma de certificar-se de que se tem a classe, constante ou função PHP correta e de que as pessoas utilizando as classes PHP podem ter certeza de que estão utilizando as corretas.

Os nomes de espaços em código funcionam exatamente como contextos no mundo físico. Considere uma classe que representa o automóvel objeto de domínio no mundo real. Para uma empresa que vende automóveis pela Internet, a classe Automobile pode ter comportamentos totalmente diferentes dos de uma classe Automobile de uma empresa que vende seguros.

O desenvolvedor de aplicativo pode usar componentes escritos por outras pessoas. O desenvolvedor pode nunca ter certeza de que as pessoas não decidiram utilizar os mesmos nomes de classe que ele, mas para uma toda uma classe diferente. Antes dos espaços de nomes, era comum um desenvolvedor PHP construir o contexto dentro do nome da classe, como My_Enterprise_Person ou XML_Validator.

A listagem 1 mostra um exemplo de uma classe que reside em um espaço de nomes.

Listagem 1. Declarando uma classe em um espaço de nomes
<?php
namespace IBM;
class Foo {
...
}
?>

Um exemplo de referência a uma classe em um espaço de nomes é demonstrado abaixo.

Listagem 2. Referindo-se a uma classe em um espaço de nomes
<?php
$foo = new \IBM\Foo();
?>

Definir uma política de espaço de nomes é uma boa ideia antes de começar a adicionar espaços de nomes a todas as classes. Embora seja aceitável até determinado limite ampliar os espaços de nomes construindo-os ao longo do tempo, é melhor decidir uma estrutura comum para os espaços de nomes que facilite organizá-los e reduzir a chance de muito retrabalho depois. Quando corretamente utilizados, os espaços de nomes podem ser um método de organizar o código PHP além de fornecer contexto.

Outras linguagens, como Java™ e C#, tiveram espaços de nomes por um longo tempo. Ao escolher como nomear meus espaços de nomes, eu uso convenções semelhantes àquelas linguagens porque são familiares e compreendidas por muitos desenvolvedores. Entretanto, diferente da linguagem Java, os espaços de nomes em PHP não são conectados ao diretório no qual reside a classe. É possível escolher qualquer espaço de nomes para uma classe, função ou constante. É possível usar mais de um espaço de nomes por arquivo. E diferente de C#, é possível atribuir espaços de nomes a funções ou constantes que não estejam dentro das classes.

Espaços de nomes de alto nível

Ao construir aplicativos para uma organização, pode-se utilizar o nome da organização como domínio de alto nível. Criar um espaço de nomes de alto nível com o nome da organização normalmente é suficiente para oferecer contexto ao código PHP e para evitar colisões de nomenclatura, a menos que a organização escreva muitos aplicativos para propósitos diferentes ou para subdivisões.

A listagem 3 contém um exemplo de declaração de espaço de nomes de alto nível.

Listagem 3. Espaço de nome de alto nível
<?php
namespace IBM;
...
?>

Subespaço de nomes

Subespaços de nomes são espaços de nomes dentro de espaços de nomes de alto nível Eles oferecem explicação adicional se o espaço de nome de alto nível não for suficiente para estabelecer o contexto para a classe PHP sendo criada.

Ao criar subespaços de nomes, é importante não se tornar superzeloso e criar muitos. Eles podem ficar difíceis de organizar e consultar mais tarde se forem muito numerosos. Isso é particularmente importante ao utilizar espaços de nomes para fins de organização do código PHP, bem como para evitar colisões de nomenclatura.

Ao decidir quantos subespaços de nomes introduzir em outro espaço de nomes para fins organizacionais, eu tento manter o número limitado a sete (mais ou menos dois) para ter vantagem da ideia de que, conceitualmente, lotes de sete itens são mais fáceis de lembrar. Isso nem sempre funciona, mas eu uso como diretriz para determinar se estou enchendo os espaços de nomes com muitos subespaços de nomes..

A listagem 4 contém um exemplo de declaração de subespaço de nomes dentro de um espaço de nomes de alto nível.

Listagem 4. Subespaço de nomes
<?php
namespace IBM\DeveloperWorks;
...
?>

O subespaço de nomes ("DeveloperWorks") é separado do espaço de nomes de alto nível ("IBM") que o contém com o caractere barra invertida (\).

Ao declarar subespaços de nomes, é possível utilizar algumas técnicas comuns ou uma combinação delas. Um lugar comum para conseguir nomes para subespaços de nome é a partir dos nomes de projeto ou aplicativo; além do nome do domínio.

Definindo por projeto

Se o nome da organização foi utilizado como espaço de nome de alto nível e ainda são necessários subespaços de nomes para fornecer contexto, é possível utilizar nomes de projeto ou aplicativo como nome do subespaço de nomes. Por exemplo, se estiver construindo um novo aplicativo chamado Greeter que pergunte os nomes dos usuários e os cumprimenta, uma boa prática é utilizar um espaço de nomes como o da Listagem 5, para fornecer contexto completo a uma classe chamada Prompt.

Listagem 5. Utilizando o nome do aplicativo como subespaço de nome
<?php
namespace IBM\Greeter;
class Prompt {
...
}
?>
-->

Como Prompt pode ser o nome de uma classe em vários aplicativos ou bibliotecas, fornecer este espaço de nome com o nome da organização e nome do projeto separa este Prompt dos outros.

Definindo por domínio

Utilizar o nome de um domínio é outro esquema comum para escolher os nomes do subespaço de nomes, como demonstrado na Listagem 6. Pode ser usado ou não em adição ao nome do projeto, dependendo dos planos de reutilização (ver "Nomenclatura para reutilização").

Um domínio é um grupo ou classificação de coisas encontradas no domínio de problema maior. Um exemplo de domínio pode ser "Conta", "Clientes" ou "Produtos" em um aplicativo maior que trate contas, clientes e produtos.

Listagem 6. Utilizando o domínio como subespaço de nome
<?php
namespace IBM\MyApp\Account;
class Address {
...
}
?>

Nomenclatura para reutilização

Além de aplicar conceitos de modularidade que permitem a reutilização, a forma de nomear classes e espaços de nomes também fornecem uma finalidade subentendida e, portanto, reutilização. Às vezes, escolhas impensadas de nomenclatura impedem a reutilização porque tais nomes implicam uma classe limitada a um propósito específico. Da mesma forma, quando aplicados incorretamente, os espaços de nome podem "especificar" classes desnecessariamente e torná-las inadequadas para reutilização em qualquer outro lugar.

Pode ser importante em um espaço de nomes de alto nível, que leva o nome de uma organização reservar um espaço de nomes "Common", "Core", "Lib" ou outro que possa ser utilizado para armazenar classes que possam ser reutilizadas entre aplicativos. Exemplos comuns são validação, onde as regras para uma unidade de manutenção de estoque (SKU), número de conta ou de fatura corporativa são as mesmas para formato e comprimento adequados. Para tal classe validadora, um bom espaço de nomes pode ser algo como apresentado na Listagem 7.

Listagem 7. Utilizando um espaço de nomes de validação comum
<?php
namespace MyCompany\Common\Validation;
class NotNullValidator {
...
}
?>

Aqui, o nome da empresa é utilizado como domínio de alto nível ("MyCompany"). O espaço de nomes "Common" é utilizado como projeto. Embora esta classe tenha sido escrita talvez enquanto um aplicativo específico era escrito, a classe pode ser utilizada por qualquer projeto na organização. Finalmente, "Validation" é utilizado como domínio para a classe.

Utilizando aliases

Embora os espaços de nomes ajudem a organizar classes e a evitar convenções de nomenclatura, eles têm o lado negativo de nomes mais longos. Felizmente, PHP oferece a capacidade de utilizar um alias para que seja possível consultar o nome alias mais curto no código. A listagem 8 oferece um exemplo.

Listagem 8. Utilizando um alias
<?php
use MyCompany\Common\Validation as Validators;
?>

Convenções de nomenclatura

É consistente com outras convenções PHP — como a nomenclatura do pacote PHP Extension and Application Repository (PEAR) e nomes de arquivo — utilizar convenções de nomenclatura em Maiúsculas no estilo "camelo" ou nomenclatura PASCAL com os nomes de espaço de nomes. Por exemplo, preferir o espaço de nomes da Listagem 9 ao invés do fornecido na Listagem 10.

Listagem 9. Nomenclatura em Maiúsculas no estilo "camelo" ou nomenclatura PASCAL
<?php
namespace MyNamespace;
?>

Evitar usar convenções de nomenclatura e letras contrárias ao restante das convenções PHP.

Listagem 10. Utilizando uma convenção pobre para letra
<?php
namespace mynamespace;
...
?>

Conclusão

Os espaços de nomes em PHP são uma forma de organizar o código, evitar colisões de nomenclatura e de oferecer contexto às classes, funções e constantes. Utilizar um esquema ou convenção para os espaços de nomes permite que o código seja facilmente compreendido, bem como facilmente consultado e utilizado.


Recursos para download


Temas relacionados


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=406775
ArticleTitle=Criar melhores espaços de nomes em PHP
publish-date=06232009