Segmentar o código AL e reduzir conflitos de nomenclatura com namespaces
Os namespaces são usados para organizar o código em grupos lógicos e hierarquias, o que pode evitar conflitos de nomenclatura que podem ocorrer quando as bibliotecas são combinadas. Os namespaces garantem a exclusividade dos nomes de código e permitem a reutilização de nomes em diferentes contextos. Os namespaces fornecem estrutura para a base de código, facilitando a navegação e a compreensão. Namespaces são usados em muitas linguagens de programação e, com o Business Central, estão disponíveis com AL.
Um arquivo AL declara um namespace no início do arquivo, e todos os objetos no arquivo de código pertencem a esse namespace. Um determinado objeto pode pertencer apenas a um namespace, mas o mesmo namespace pode ser usado para vários arquivos AL, o que significa para vários objetos e para vários módulos. Há duas regras do compilador que se aplicam especificamente a namespaces e nomeação de objetos:
Você só pode ter um objeto de um tipo com o mesmo nome em um módulo
Você só pode ter um objeto de um tipo com o mesmo nome em um namespace
Renomear nomes de objetos ou membros existentes é uma alteração significativa; portanto, os namespaces só podem ajudar na estrutura lógica dos objetos existentes.
Qualquer aplicativo que dependa de seu aplicativo será interrompido se você renomear namespaces e, da mesma forma, seu aplicativo será interrompido se alguma de suas dependências renomear seus namespaces.
Para declarar um namespace em AL, você deve usar a palavra-chave namespace seguida do nome do namespace. Algumas práticas recomendadas para palavras-chave de namespace são:
Um namespace deve ser globalmente exclusivo.
A primeira parte de um namespace está vinculada à organização em desenvolvimento ou a uma pessoa, seguida por um nome de produto e um agrupamento lógico no produto, como, por exemplo,
namespace BigCompany.SmartProduct.SomeProductArea. Isso dá suporte aos dois propósitos dos namespaces: nome do objeto exclusivo e agrupamento lógico de funcionalidades relacionadas.Use um nome estável e sem versão específica para o namespace. Alterar o nome de um namespace é uma alteração interruptiva.
O nome do namespace pode ser qualquer identificador AL válido e pode conter pontos para indicar uma hierarquia de namespaces.
O exemplo a seguir mostra a sintaxe de uma declaração de namespace. Todos os objetos declarados no arquivo de código pertencem ao namespace MyNamespace. A sintaxe mostrada aqui é para fins ilustrativos, pois ainda é uma prática recomendada separar objetos em arquivos diferentes e usar o mesmo nome do objeto para o arquivo. Para obter mais informações, consulte Práticas recomendadas para código AL.
namespace MyNamespace;
// codeunits, tables, pages....
Agora, para se referir aos objetos no MyNamespace, você deve usar o nome totalmente qualificado ou a diretiva using. Para obter mais informações, consulte Diretiva using.
Para declarar mais objetos no mesmo namespace, você pode usar a mesma declaração de namespace em outros arquivos .al. Todos os arquivos de código que usam a mesma declaração de namespace pertencem ao mesmo namespace.
A diretiva using
Para se referir a objetos em outros namespaces, você pode usar o nome totalmente qualificado ou a diretiva using. A diretiva using é usada para se referir a objetos em outros namespaces sem a necessidade de usar o nome completo. A diretiva using é colocada na parte superior do arquivo .al, após a declaração do namespace e antes de qualquer declaração de objeto. O exemplo a seguir mostra a ordem da declaração do namespace e da diretiva using. A ordem das diretivas using não importa.
namespace MyNamespace;
using SomeOtherNamespace;
codeunit 10 MyCode
{
...
}
Quando os objetos são resolvidos, eles são resolvidos primeiro usando o escopo mais próximo. Portanto, para resolver um objeto com nome semelhante em uma extensão dependente, a referência deverá usar um nome totalmente qualificado. Como alternativa, é possível definir o uso de políticas para referenciar namespaces externos e evitar nomes totalmente qualificados para referências a objetos neles.
Um namespace aninhado é um namespace declarado dentro de outro namespace. Os namespaces aninhados permitem uma nomenclatura de objetos melhor e mais estruturada, em comparação com a necessidade de expressar a estrutura completa no nome do objeto de 30 caracteres. A sintaxe a seguir mostra uma declaração de namespace aninhado de MyNestedNamespace no namespace MyNamespace, separada por um ponto.
namespace MyNamespace.MyNestedNamespace;
No exemplo, o nome completo do namespace é MyNamespace.MyNestedNamespace. Para fazer referência a objetos no namespace MyNestedNamespace, você deve usar o nome totalmente qualificado ou a diretiva using. Portanto, para poder acessar objetos declarados no MyNestedNamespace, inclua a seguinte instrução em seu código:
using MyNamespace.MyNestedNamespace
Use ações de código para ajudar a adicionar namespaces à origem existente. Para obter mais informações, consulte Ações de código.
Resumo
Um arquivo AL pode definir um namespace na parte superior, que se aplica a todos os objetos no arquivo de código. Um determinado objeto pode pertencer apenas a um namespace, mas o mesmo namespace pode ser usado para vários arquivos e objetos AL.
Quando os objetos são resolvidos, o escopo mais próximo é usado primeiro. Portanto, para resolver um objeto com nome semelhante em uma extensão dependente, a referência deverá usar um nome totalmente qualificado. Ou você pode defini-lo usando políticas para incluir namespaces externos e omitir nomes totalmente qualificados.
Como os namespaces são úteis para segmentação lógica de extensões, o AL Explorer também mostra namespaces para objetos e permite agrupar objetos por namespace. Isso facilita a descoberta de objetos relacionados, o foco nas subáreas do aplicativo e a identificação de inconsistências ao adicionar novos objetos.
Os namespaces aninhados fornecem melhor nomenclatura de objetos do que a expressão da estrutura completa no nome do objeto de 30 caracteres. No entanto, renomear objetos existentes é uma alteração interruptiva; portanto, esse recurso ajuda principalmente na estrutura lógica dos objetos existentes e nos novos nomes futuramente.
Aqui está um exemplo de objetos de aplicativo base agrupados por namespace, com a tabela Customer residindo no namespace Microsoft.Sales.Customer. Agrupar objetos por namespace dessa forma torna mais fácil concentrar-se em objetos relacionados e localizá-los.
