Organizando NameSpaces

 

Com a introdução do .NET Framework, novos desafios surgiram para nós desenvolvedores Delphi, entre eles posso citar o aprendizado das classes que compõem o framework, o conhecimento de como o framework trabalha para que possamos utiliza-lo de forma otimizada. Mas o mais simples, mas que pode causar dores de cabeça, é como organizar ou criar uma estrutura de namespaces. Quem aqui nunca sentiu dificuldade em nomear métodos, classes ou até mesmo variáveis?

Não existe uma regra que diz: “É assim”. Em um software orientado a objetos é uma boa, e porque não dizer obrigatória, prática dividir a arquitetura do software em camadas, ou subsistemas. Aplicando isso aos namespaces podemos dizer que devemos organizá-los de tal forma que represente essa separação.

Quero apresentar neste artigo uma das possíveis formas para se organizar namespaces, não é uma regra, é apenas uma prática.

Apresentando o Cenário

Digamos que trabalhamos em uma empresa chamada  ClubeDelphi e nossa empresa possui um software chamado Sample (exemplo em inglês) que está divido na seguintes camadas:

·         Interface com usuário (Web e Winforms)

·         Camada de serviço que utiliza padrão façade

·         Regras de negócio

·         Acesso a dados

 

Para que não haja conflitos em namespaces existentes ou futuros, é recomendado que o namespace inicie sempre com o nome da empresa seguido pelo nome da aplicação a qual ele pertence. Portanto para nossa empresa e software nossos namespaces iniciam com:

 

ClubeDelphi.Sample

 

Seguindo o modelo de organizar por camadas temos a seguinte hierarquia:

 

·         Interface com usuário

ClubeDelphi.Sample.UI

        .Web: contém elementos de interface com usuários para Web

                 .Pages : contém as páginas

                 .WebControls: contém controles personalizados

        .Windows: contém  elementos de interface com usuários para Windows

                 .Forms: contém os formulários do projeto

                 .Controls: contém os controles personalizados

 

·         Camada de Serviço

ClubeDelphi.Sample.Services

        .Facade: contém os métodos façade para acesso às classes de negócio

        .Security: responsável por verificar permissões de usuários aos objetos

 

·         Regras de Negócio

ClubeDelphi.Sample.Business

        .Classes: Contém as classes envolvidas no negócio, como Clientes, Fornecedores

        .Rules: Contém regras, validações das operações de negócios

       

·         Acesso a dados

ClubeDelphi.Sample.DataAccess

        .DataSets: Contém os DataSet utilizados

        .Helpers: Contém classes auxiliadoras para acesso aos dados

Constantes e Exceções

Agora você pode perguntar, onde coloco minhas exceções personalizadas, minhas constantes?  Eu particularmente prefiro coloca-las no grupo a que se dizem respeito. Por exemplo, se tenho constantes e exceções para lidar com páginas web, eu as colocariam respectivamente em:

 

ClubeDelphi.Sample.Web.Pages.Consts

ClubeDelphi.Sample.Web.Pages.Exceptions

 

Caso existam rotinas, ou constantes  ou exceções ou que mais que seja que devem  ser vistas por toda aplicação, podemos definir então um o seguinte namespace e inseri-las nele:

 

ClubeDelphi.Sample.Globals

Frameworks personalizados

Se a equipe de sua empresa possui o bom hábito de criar rotinas comuns que serão reutilizadas com todos os projetos da empresa, como por exemplo um conjunto de classes personalizado por vocês para acesso a arquivos, ou para tratamento de strings, ou geração de sentenças SQL poderíamos ter os seguintes namespaces particularmente:

 

ClubeDelphi.Frameworks.FileAccessHelpers

ClubeDelphi.Frameworks.StringHelpers

ClubeDelphi.Frameworks.SQLHelpers

 

Veja que o namespace  representa o nível de reusabilidade desses frameworks, isso facilita a leitura de código e entendimento da organização do mesmo.

Conclusões

Foi apresentada uma sugestão de como organizar seu código, facilitando a visão organizacional do mesmo. Vale lembrar que esta sugestão de organização de código não é restrita apenas ao Delphi2005 ou Delphi2006 em desenvolvimento para .NET, a partir do Delphi 7 é permitido utilizar as chamadas dotted units, ou units pontuadas. Por exemplo:

 

ClubeDelphi.Frameworks.StringHelpers.pas

ClubeDelphi.Frameworks.SQLHelpers.pas

 

Abraço e até a próxima!