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.

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.

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.

Persistência de dados

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.

Impedância objeto/relacional

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.

Mapeamento objeto/relacional

É 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.

Mãos à obra

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.

Criando um projeto Delphi Prism
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:

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.

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.

Adicionando um novo projeto à solução
Figura 2. Adicionando um novo projeto à solução
Solution Explorer
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;
        

Vejam que dessa vez temos algo novo. Além das propriedades esperadas para um endereço, incluímos um construtor para a classe. Fazemos isso porque quero que, sempre que um endereço for criado, a Cidade seja “Jaboticabal” e a UF “SP”.

...

Quer ler esse conteúdo completo? Tenha acesso completo