Artigo Clube Delphi 115 - Persistência de Objetos

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (1)  (0)

Neste artigo veremos como automatizar essas tarefas repetitivas de forma elegante, usando uma ferramenta OR/M (mapeamento objeto relacional).

Atenção: esse artigo tem um vídeo complementar. Clique e assista!

Atenção: esse artigo tem uma palestra complementar. Clique e assista!

[lead]Do que trata o artigo

A persistência de dados toma grande parte do tempo de desenvolvimento de nossos sistemas. Neste artigo veremos como automatizar essas tarefas repetitivas de forma elegante, usando uma ferramenta OR/M (mapeamento objeto relacional). Com seu uso poderemos utilizar objetos de negócio em nossos sistemas e não nos preocuparmos como recuperá-los ou mandá-los para um banco relacional. Vamos ver a teoria por trás de uma ferramenta de mapeamento objeto/relacional, como o NHibernate, e como isso pode melhorar nosso desenvolvimento diário.

Para que serve

Uma ferramenta de persistência tem a tarefa de saber como salvar seus objetos em memória, para um dispositivo físico. Isso é feito através do mapeamento objeto relacional, onde apontamos qual campo será utilizado para armazenar determinada propriedade e qual classe/classes representam uma ou mais tabelas.

Em que situação o tema é útil

Quando se deseja utilizar a orientação a objetos para representar seu negócio, contudo, sem perder a facilidade de acesso a banco de dados. Quando se deseja ter uma aplicação realmente independente do banco de dados que é utilizado, sem se preocupar com detalhes específicos de cada um.

Resumo do DevMan

O NHibernate é uma ferramenta de mapeamento objeto relacional que implementa teorias conceituadas sobre o assunto. Ele vem trazer uma ponte de comunicação entre seus objetos de negócio e seu banco de dados, que podem ser bem diferentes. Isso traz vários benefícios, mas também dificuldades. Um dos benefícios é que suas regras de negócio serão independentes de banco de dados. Para mostrar tudo isso, vamos desenvolver uma aplicação desktop onde nenhum SQL será utilizado, em momento algum. Vamos utilizar um banco de dados Firebird para salvar os objetos criados. [/lead]

Você, desenvolvedor Delphi, como a grande maioria de usuários, certamente desenvolve aplicações do tipo desktop, em duas ou três camadas. São aplicações centradas em dados, como são conhecidas. É muito comum nesses cenários fazermos a análise do negócio envolvido e já partirmos para o desenvolvimento do banco de dados, onde posteriormente será acessado por controles Data-aware e seus dados manipulados por sentenças SQL geradas por nós mesmos. Ou seja, além de nos preocupar com as regras envolvidas, temos também a responsabilidade de acessar o banco de dados e utilizá-lo. Quero deixar claro que não há nada de errado nisso. Isso tem funcionado muito bem até hoje, contudo, novas técnicas surgiram. Técnicas essas que proporcionam maior flexibilidade, agilidade ao desenvolvimento e diminuem tarefas repetitivas, retirando dos desenvolvedores a preocupação da persistência dos dados. Uma dessas técnicas é a orientação a objetos. Muito se fala nela no mundo Delphi, mas pouco se aplica de verdade. Para mostrar como utilizá-la faremos uma pequena agenda de contatos utilizando o Delphi Prism como linguagem de desenvolvimento, a plataforma .NET e NHibernate como ferramenta objeto relacional. Quanto ao banco de dados, não interessa porque o NHibernate é compatível com cerca de mais de dez produtos existentes no mercado. Vamos começar pelos conceitos que servem de apoio e alicerce.

[subtitulo]Persistência de dados [/subtitulo]

A persistência, de uma forma geral, é a tarefa de pegar informações contidas em um meio volátil e passá-las para um meio não volátil. Sendo mais específico, é pegar os dados que estão na memória e mandá-los para um HD. Ao se falar de sistemas comerciais, esses dados serão salvos em um banco de dados relacional. Nessa tarefa de persistência temos sub-rotinas, operações, que acontecem o tempo todo durante a execução de um sistema. Esse é o CRUD. Operações de acesso a dados que cuidam da criação, recuperação, atualização e exclusão das informações contidas em um banco de dados.

[subtitulo]Impedância objeto/relacional [/subtitulo]

Esse é o nome que se dá para as diferenças existentes entre seu banco de dados e seus objetos de negócio. Para exemplificar, imagine que no seu modelo classes temos Pessoa e Endereço. Classes distintas, mas possuem um relacionamento entre si. Pessoa possui em sua interface uma referência à classe Endereço, representando que uma pessoa tem um endereço. Contudo em seu banco de dados você pode ter apenas uma tabela para armazenar as duas informações.

[subtitulo]Mapeamento objeto/relacional [/subtitulo]

É a operação que visa diminuir a impedância, as diferenças entre o objeto e o relacional. É o local onde definimos como os objetos serão salvos e recuperados do banco de dados. É onde informamos qual classe se torna uma tabela, qual propriedade se torna um campo. Toda ferramenta que se intitula objeto/relacional (ORM) faz de alguma forma esse mapeamento e oferece meios para pesquisa dos objetos salvos. Existem pequenas definições que se aplicam quando vamos fazer um mapeamento objeto relacional. Veremos com mais detalhes durante o desenvolvimento do projeto.

[subtitulo]Mãos à obra [/subtitulo]

Como já mencionado, vamos utilizar o Framework .NET, Delphi Prism, NHibernate e Firebird para o desenvolvimento de nossa agenda. Nossa agenda irá permitir a inclusão de pessoas, seu endereço, email e telefones. Deverá também oferecer uma forma rápida para localização das pessoas cadastradas. Para começar vamos abrir o Visual Studio 2008 e então acessamos o menu File > New > Project. Configure o projeto como mostra a Figura 1.

Figura 1. Criando um projeto Delphi Prism

Observe que selecionamos a opção Windows de Delphi Prism. Desta forma vamos criar uma aplicação utilizando Windows Forms, que é bem semelhante aos formulários do Delphi win32. Observe também que escolhemos o Framework .net na versão 3.5, o que nos garante utilizar os recursos mais atualizados do mesmo.

[nota]Nota do DevMan

O .NET Framework foi desenvolvido de tal forma que possamos utilizar várias linguagens para o desenvolvimento de sistemas. Existem várias linguagens compatíveis, por exemplo, temos Visual Basic, uma versão do Java conhecida como J#, temos C#, F#, Cobol, o próprio Delphi e muito mais. No caso específico do Delphi, ele funciona como um Plugin dentro do Visual Studio, que é o IDE de desenvolvimento fornecido pela Microsoft. É uma versão evoluída da linguagem Delphi que conhecemos. Nela foram implementados recursos avançados oferecidos pelo .NET Framework. Veja onde baixar o Delphi Prism na seção links. [/nota]

Ao clicarmos em OK temos um projeto com um formulário principal já criado. Como vamos utilizar a orientação a objetos vamos primeiramente desenvolver as classes de negócio envolvidas. Vamos centralizá-las em um projeto do tipo Class Library. Um projeto desse tipo nada mais é do que uma DLL que pode ser reutilizada em vários projetos. Para criá-la clicamos com o botão direito no nome da solução (Agenda) e no menu que surge, escolhemos Add>New Project. Então, escolhemos Class Library, como mostra a Figura 2. Nesse momento seu Solution Explorer deve se parecer com a Figura 3.

Figura 2. Adicionando um novo projeto à solução

Figura 3. Solution Explorer

Veja que temos um arquivo chamado Class1.pas. Clique com o botão direito nele, no menu que aparece escolha Rename e mude seu nome para Pessoa.pas. Altere o nome da classe também no código, para que fique como mostra a Listagem 1.

Listagem 1. Classe Pessoa

  namespace ModeloAgenda;
   
  interface
   
  type
    Pessoa = public class
    private
    protected
    public
    end;
    
  implementation
   
  end. 

Em nosso sistema, uma pessoa terá um Nome, um Endereco, vários Telefones e um Email. Sendo assim vamos alterar a classe pessoa para que reflita essa definição e fique como mostra a Listagem 2.

Listagem 2. Classe Pessoa

  type
    Pessoa = public class
    private
    protected
    public
        property Nome: String;
        property Endereco: Endereco;
        property Telefones: IList<Telefone>;
        property Email: String;
        constructor;  end;
    
  implementation
   
  constructor Pessoa;
  begin
    Endereco := new Endereco;
    Telefones := new List<Telefone>;
  end; 

Veja que agora definimos as propriedades mencionadas. O detalhe fica para a propriedade Endereco, que é do tipo Endereco, uma outra classe que ainda não foi implementada. E também para Telefones, que é uma lista genérica do tipo Telefone, que também ainda não foi implementada. Vamos fazê-lo agora. Clique com o botão direito sobre o projeto ModeloAgenda e escolhe Add>New item. Nessa janela que abrir vamos escolher Class, dando o nome de Telefone. A classe estará vazia. Contudo vamos alterá-la para que fique como na Listagem 3.

Listagem 3. Classe Telefone

  type
    Telefone = public class
    private
    protected
    public
        property Numero: String;
        property Ramal: String;
    end; 

Até o momento então temos as classes Pessoa e Telefone. Veja que definimos telefone com duas propriedades do tipo string, Numero e Ramal. Falta fazermos agora a classe Endereco. Adicione uma nova classe, lhe dê o nome de Endereco e a codifique como na Listagem 4.

Listagem 4. Classe Endereco

    Endereco = public class
    private
    protected
    public
        property Rua: String;
        property Bairro: String;
        property Cidade: String;
        property UF: String;
        constructor ();
    end;
    
  implementation
   
  constructor Endereco();
  begin
    Cidade := "Jaboticabal";
    UF := "SP" ;  
  end; 
"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?