Delphi 8, ECO!

Enterprise Core Objects, MDA para .NET

 

O Delphi 8 For .NET oferece a nós desenvolvedores uma ótima ferramenta para o desenvolvimento de aplicações utilizando MDA. Composta por um framework e diversos componentes, chamada Enterprise Core Objects (ECO). Que aplica flexibilidade ao design das camadas de negócios e persistência dos dados, tornando o processo de desenvolvimento de software mais simples e rápido. Neste artigo veremos como ele implementa este desenvolvimento de aplicações utilizando MDA.

MDA – Model Driven Architecture

A arquitetura MDA foi definida pela entidade responsável pelos padrões de tecnologia a OMG. Outros padrões também são utilizados para compor esta arquitetura, entre eles a UML – Unified Modeling Language, que define uma série de diagramas entre outras estruturas.

Um dos problemas freqüentemente encontrados no desenvolvimento é que mesmo utilizando um modelo UML, durante a implementação normalmente são introduzidas mudanças, que nem sempre são atualizadas no modelo original. O modelo não é usado pela aplicação durante a execução, sendo que todos os relacionamentos e restrições de negócio devem ser implementados no código fonte, deixando poucas chances para outras utilizações.

O ECO faz com que o modelo de classes seja uma parte integrante do sistema, durante o projeto e codificação e em tempo de execução, tornando o modelo UML realmente executável. Através da utilização da OCL (Object Constraint Language), que também faz parte da especificação oficial da UML, pode-se definir expressões para acessar classes, objetos e associações, realizar consultas e especificar restrições. Vejamos alguns exemplos de expressões OCL:

 

Obter todos os contatos

Contato.allInstances

 

Obter todos os funcionários com idade maior que 18 anos

Funcionario.allInstances->select(idade >= 18)

 

Obter todas as compras feitas pelo usuário José

Compras.allInstances->select(usuario.nome.sqlLike(’José%’))

ECO na prática!

Agora que sabemos para que serve o framework, veremos do que ele é capaz na prática. Para iniciarmos construiremos um exemplo simples, e depois, iremos o complementando com novas funcionalidades. Para isso, no Delphi inicie uma nova aplicação do tipo: ECO Windows Forms Application, salve-a o como ClubeDelphi. Automaticamente alguns arquivos, além do formulário da aplicação são criados. Veja abaixo a descrição dos arquivos criados:

CoreClassesUnit.pas

É neste arquivo que nossas classes ficarão armazenadas.

ClubeDelphiEcoSpace.pas

Este arquivo contém o ECOSpace da aplicação. O que vem a ser ECOSpace? É o lugar onde os objetos criados em run-time ficarão. Ele também possibilita a ligação entre objetos e mecanismos para a persistência de dados como o XML, por exemplo.

WinForm.pas

O WinForm de uma aplicação ECO vem inclusos componentes que fazem acesso ao EcoSpace pré-definidos.

Criando o modelo

Como o ECO usa um subconjunto da UML. Para criarmos o modelo utilizaremos peças específicas da linguagem como: diagrama de classes e a OCL. Vá em View | Model View, veja na figura 1. Dê um clique-duplo no item selecionado na figura: CoreClasses, para que seja aberto sua área de modelagem.

 

Figura 1. Model View com o arquivo CoreClasses selecionado.

Iremos criar a classe Contato, para isso, dentro da área de modelagem, clique com o botão direito do mouse e selecione a opção Add | Class. Ou se preferir, utilize a Tool Palette para inserir um classe. Seu nome será Contato e sua propriedade Abstract marque como True. Insira agora três atributos, para isso, clique com o direito sobre a classe, selecione Add | Atribute, no Object Inspector configure a propriedade Name como Nome e Type como String. Adicione também os atributos email e telefone ambos do tipo string.

Adicione mais duas classes, uma chamada Empresa e outra Pessoa. Precisamos agora criar um relacionamento generalizado entre a classe Pessoa e a classe Contato. Este relacionamento especifica que Pessoa é um tipo de Contato, e herda todos os atributos e operações de Contato. Para esta tarefa, selecione na Tool Palette a ferramenta Generalization/Implementation, selecione a classe Pessoa e arraste-a para a classe Contato. Faça o mesmo com a classe Empresa, sua área de modelagem deverá ficar igual á figura 2.

Figura 2. As classes do exemplo, relacionadas.

Criando o formulário

Agora que criamos nosso modelo, precisamos criar a interface com o usuário.

 

Nota: É importante que neste ponto, você compile a aplicação, o framework necessita que você tenha um modelo compilado para que os controles gráficos possam reconhece-lo. Ou simplesmente, marque a opção Auto Compile no menu Tool | Options | Eco General Option.

 

Após compilar a aplicação selecione o component rhRoot, em sua propriedade EcoSpacecType aponte para o EcoSpace do exemplo. Feito isso adicione no formulário três componentes DataGrids (DB Controls), dois Buttons (Windows Forms) e três ExpressionHandles (Enterprise Core Objects). Configure suas propriedades de acordo com a listagem abaixo:

 

Button

Name: btnAddPessoa

Caption: Adicionar Pessoa

 

Button

Name: btnAddEmpresa

Caption: Adicionar Empresa

 

ExpressionHandle

Name: EHContato

Root: rhRoot

Expression: Contato.allinstances

 

ExpressionHandle

Name: EHPessoa

Root: rhRoot

Expression: Pessoa.allinstances

 

ExpressionHandle

Name: EHEmpresa

Root: rhRoot

Expression: Empresa.allinstances

 

DataGrid

Name: DGContato

DataSource: EHContato

 

DataGrid

Name: DGPessoa

DataSource: EHPessoa

 

DataGrid

Name: DGEmpresa

DataSource: EHEmpresa

 

Veja na figura 3, o formulário da aplicação.

 

Figura 3. O formulário da aplicação.

Crie duas variáveis globais como abaixo, estas variáves representarão os objetos da aplicação, neste caso, pessoa e empresa.

 

var

  VPessoa : Pessoa;

  VEmpresa : Empresa;

 

Adicione ao evento Click do botão btnAddPessoa o seguinte código:

 

procedure TWinForm.BtnAddPessoa_Click(sender: System.Object; e: System.EventArgs);

begin

  VPessoa := Pessoa.Create(EHPessoa);

end;

 

Adicione ao evento Click do botão btnAddEmpresa o seguinte código:

 

procedure TWinForm.BtnAddEmpresa_Click(sender: System.Object; e: System.EventArgs);

begin

  VEmpresa := Empresa.Create(EHEmpresa,);

end;

 

Se executarmos a aplicação neste ponto, veremos que a primeira grid, lista todo o conteúdo da classe Contato, independentemente de Pessoa ou Empresa. Já nas outras duas temos a possibilidade de incluir uma nova pessoa ou empresa e a grid nos mostra o conteúdo da classe Pessoa e da classe Empresa.

Incluindo a funcionalidade para excluir uma pessoa ou uma empresa

 

Adicione mais dois Buttons (Windows Forms) e configure-os como abaixo:

 

Button

Name: btnExcPessoa

Caption: Excluir Pessoa

 

Button

Name: btnExcEmpresa

Caption: Excluir Empresa

 

No evento Click do botão btnExcPessoa insira o seguinte código:

 

procedure TWinForm.BtnExcPessoa_Click (sender: System.Object; e: System.EventArgs);

begin

  VPessoa.AsIObject.Delete;

end;

 

No evento Click do botão btnExcEmpresa insira o seguinte código:

 

procedure TWinForm. BtnExcEmpresa_Click (sender: System.Object; e: System.EventArgs);

begin

  VPessoa.AsIObject.Delete;

end;

 

Pronto! Nosso exemplo já esta incluindo e excluindo registros!

Persistência de dados

Veremos agora como manter persistentes os dados de nosso exemplo, o ECO nos oferece dois métodos. Salvar dados em arquivos XML ou salvar dados em Banco de dados. Em nosso exemplo iremos explorar os dois recursos.

 

Salvando em arquivos XML

Para que possamos salvar dados em arquivos XML, vá ao Project Manager selecione o arquivo ClubeDelphiECOSpace.pas e chame o editor de design. Adicione um componente PersistenceMapperXML (Enterprise Core Objects) configurando sua propriedade FileName para ClubeDelphi.xml. No ECOSpace aponte a propriedade persistenceMapper para o persistenceMapperXML1.

Volte ao formulário da aplicação, adicione mais um button (Windows Controls) e altere sua propriedade name para BtnPersisteXML e caption para Salvar em XML. Em seu evento Click adicione o seguinte código:

 

procedure TWinForm.btnPersisteXML_Click(sender: System.Object; e: System.EventArgs);

begin

  EcoSpace.UpdateDatabase;

end;

 

sExecute a aplicação insira alguns dados e clique no botão, navegue até o diretório onde a aplicação se encontra e veja o arquivo ClubeDelphi.xml criado, como na figura 4.

 

Figura 4. O arquivo XML criado.

Salvando em RDBMs

Agora que já sabemos como persistir dados em arquivos XML, veremos como utilizar banco de dados para guardar nossas informações.

Aplicações desenvolvidas com ECO utilizam os componentes persistenceMapper para acessar banco de dados. Esses componentes atuam entre o ECOSpace e os componentes de acesso a dados da plataforma .NET.

Para darmos continuidade ao exemplo utilizaremos o Interbase como banco de dados, no gerenciador de sua escolha crie um banco de dados em branco. Criei o meu no diretório C:\ECO com o nome de database.gdb. Com o banco criado volte ao Delphi e no ClubeDelphiECOSpace exclua o componente persistenceMapperXML e adicione um persistenceMapperBdp (Enterprise Core Objects) e um BdpConnection (Borland Data Provider), configure-os como a listagem abaixo:

 

BdpConnection

Name: bdpConnection1

 

Clique com o botão direito do mouse e selecione a opção Connection Editor, nele adicione uma nova conexão chamado ClubeDelphiECO, configure sua propriedade Database para localhost:C:\ECO\DATABASE.GDB clique em OK.

 

persistenceMapperBdp

Name: persistenceMapperBdp1

Connection: BdpConnection1

 

Nota: Não esqueça de informar ao ECOSpace o novo PersistenceMapper, portanto, em sua propriedade persistenceMapper aponte para persistenceMapperBdp1.

 

Figura5.

Com os componentes configurados corretamente, selecione a opção Create Database Schema localizada na parte inferior esquerda do ECOSpace. Veja na figura 5 a estrutura de dados criada com sucesso.

Figura 5 – A mensagem informando que a estrutura foi criada com sucesso e no IBConsole as tabelas criadas com sucesso.

 

Volte ao formulário da aplicação, altere o caption do botão “Salvar em XML” para “Salvar no IB”. Pronto! Nosso exemplo já esta configurado para salvar os dados no banco de dados. Veja na figura 6 o exemplo em execução e os dados no IBConsole já persistidos.

 

Figura 6.O exemplo em execução com os dados gravados no banco.

Conclusão

O framework ECO nos oferece uma maneira de desenvolver aplicações onde gastamos mais tempo com o desenvolvimento da lógica de negócio e menos tempo com o código da aplicação. Isso permite que o custo da mudança seja reduzido além de permitir que o código esteja mais organizado. Com o ECO temos uma separação entre a camada de apresentação, lógica e camada de persistência entre uma série de recursos que facilitam na hora de desenvolver uma aplicação bem estruturada.