POO e DAO Pattern no Delphi: Criando uma tela de login

Veja neste artigo como utilizar de maneira prática assuntos como Programação Orientada a Objetos, DAO Pattern, e o framework DbExpress 4, assuntos muito importantes dentro da comunidade Delphi.

A POO (Programação Orientada a Objetos), cujos pilares básicos são: Herança, Polimorfismo e Encapsulamento, é uma metodologia inteligente de desenvolvimento de software, que visa tornar os sistemas mais flexíveis a mudanças, fáceis de manter, e permite uma grande reutilização de código.

Um dos problemas encontrados em sistemas escritos de maneira procedural é a descentralização de responsabilidades (regras de negócio misturadas a camada de apresentação), onde o mesmo código aparece repetidas vezes em diferentes pontos do sistema, tornando o custo de manutenção cada vez maior. Não são raros os casos de empresas que precisaram reescrever sistemas do zero por tais problemas.

Para corrigir este problema, podemos utilizar a POO em conjunto com o Design Pattern DAO.

O Padrão DAO (Data Access Object) é um pattern que permite separar acesso a dados e regras de negócio da camada de apresentação, centralizando as responsabilidades de manipulação do banco de dados e facilitando a manutenção.

Neste tutorial criaremos um sistema simples de Login, utilizando conceitos de programação orientada a objetos e separação de camadas com DAO Pattern, utilizando a linguagem e IDE Delphi.

O Delphi é uma linguagem de alto nível, compilada, fortemente tipada, que suporta os paradigmas de programação estruturada e orientada a objetos, sendo uma excelente ferramenta de desenvolvimento.

Para esse artigo foi utilizado o Delphi XE e banco de dados Firebird 2.5

Criação do Projeto

Crie um novo diretório, onde serão salvos o Banco de Dados (caso use firebird/interbase) e os arquivos do Projeto.

Utilizando o Banco de Dados e o Front End de sua preferência, crie um novo banco e execute os scripts da Listagem 1 para criação da tabela Usuarios, e o usuario administrador, respectivamente:

// Criação da tabela USUARIOS CREATE TABLE USUARIOS ( CODIGO INTEGER NOT NULL, USUARIO VARCHAR(20) NOT NULL, SENHA VARCHAR(20) NOT NULL, CONSTRAINT PK_USUARIOS PRIMARY KEY (CODIGO) ) // INSERT do primeiro Usuario da tabela INSERT INTO USUARIOS (CODIGO, USUARIO, SENHA) VALUES (1,’administrador’,’admin123’)
Listagem 1. Scripts do Banco de Dados

Utilizando o Delphi, crie um novo projeto no Menu New -> VCL Forms Application – Delphi.

Adicione uma nova Unit ao projeto no Menu New -> Unit –Delphi.

Utilizaremos a nova Unit para criação da classe TLoginModel, que será responsável por transferir informações entre a camada de negócios e a camada de apresentação.

A classe TLoginModelspan> possui dois campos, que são: FUsuario e FSenha.

Respeitando as boas práticas de POO, não iremos expor publicamente nossos campos, mas encapsularemos o acesso a eles utilizando métodos getters, setters e propriedades, como mostra a Listagem 2.

unit uLoginModel; interface Type TLoginModel = class strict private // campos FUsuario: string; FSenha: string; // getters function GetUsuario: string; function GetSenha: string; // setters procedure SetUsuario(const Value: string); procedure SetSenha(const Value: string); public // propriedades property Usuario : string read GetUsuario write SetUsuario; property Senha : string read GetSenha write SetSenha; end; implementation { TLoginModel } function TLoginModel.GetSenha: string; begin Result := FSenha; end; function TLoginModel.GetUsuario: string; begin Result := FUsuario; end; procedure TLoginModel.SetSenha(const Value: string); begin FSenha := Value; end; procedure TLoginModel.SetUsuario(const Value: string); begin FUsuario := Value; end; end.
Listagem 2. Class TLoginModel

Volte ao formulário da aplicação e altere a propriedade Name para frmLogin.

Utilizando a Tool Palette, adicione os seguintes controles:

Altere a propriedade Name dos controles para:

Organize o formulário e altere a propriedade Caption dos controles conforme a Figura 1.

Figura 1. Formulário frmLogin

Utilizando o menu New, adicione um Data Module ao seu projeto.

Adicione um controle do tipo SQLConnection da paleta DbExpress, que será usado para criar uma conexão com o Banco de Dados.

Configure o controle SQLConnection de acordo de o caminho do seu banco.

Defina a propriedade LoginPrompt como False para que a senha do banco não seja solicitada novamente a cada nova conexão.

Altere a propriedade Name do Data Module para dm_dados e a propriedade Name SQLConnection para LOGINOO.

Salve o projeto e as units no diretório criado no início do artigo, seguindo a nomenclatura:

Inclua uma nova Unit no Menu New -> Unit –Delphi e em seguida salve-a como uLoginDAO.

A classe TLoginDAO será usada para centralizar as regras de negócio e o acesso ao banco de dados.

Para nossa classe TLoginDAO, utilizaremos métodos do framework DbExpress 4, que é a engine de acesso e manipulação de dados mais utilizada pelos programadores Delphi.

A nova arquitetura do DbExpress 4 traz novas features que permitem um desenvolvimento totalmente orientado a objetos, de maneira simples e elegante.

Digite as informações da classe TLoginDAO, e não esqueça de dar uses nas Units uLoginModel, DBXCommon, SysUtils, como mostra a Listagem 3.

unit uLoginDAO; interface uses uLoginModel, DBXCommon, SysUtils; type TLoginDAO = class public // função Logar passando um objeto LoginModel como parâmetro function Logar(LoginModel: TLoginModel): Boolean; end; implementation uses Dialogs; { TLoginDAO } function TLoginDAO.Logar(LoginModel: TLoginModel): Boolean; var dbcon : TDBXConnection; // objeto para conexao sql : TDBXCommand; // objeto para executar instruçoes SQL parametro : TDBXParameter; // objeto para parametrizar instruçao SQL reader : TDBXReader; // objeto que guarda o resultado de um TDBXCommand; begin try try // fabrica uma conexão com o banco dbcon:=TDBXConnectionFactory.GetConnectionFactory.GetConnection('LOGINOO', 'sysdba','masterkey'); // cria um comando sql no objeto dbcon sql := dbcon.CreateCommand; // instrução SQL sql.Text := 'SELECT * FROM USUARIOS WHERE UPPER(USUARIO) = UPPER(?) ' + ' AND UPPER(SENHA) = UPPER(?)'; // parametro Usuario parametro := sql.CreateParameter; parametro.DataType := TDBXDataTypes.WideStringType; parametro.Name := 'pUsuario'; sql.Parameters.AddParameter(parametro); sql.Parameters.Parameter[0].Value.SetWideString(LoginModel.Usuario); // parametro Senha parametro := sql.CreateParameter; parametro.DataType := TDBXDataTypes.WideStringType; parametro.Name := 'pSenha'; sql.Parameters.AddParameter(parametro); sql.Parameters.Parameter[1].Value.SetWideString(LoginModel.Senha); sql.Prepare; // prepara a instrução SQL para executar no Banco reader := sql.ExecuteQuery; // executa o SQL e guarda o resultado no reader; while (reader.Next) do // retorna True se o reader não estiver vazio Result := True; except on E : Exception do ShowMessage('Não foi possível logar no sistema' + #13 + E.Message); end; finally // libera os objetos da memória FreeAndNil(dbcon); FreeAndNil(sql); FreeAndNil(reader); end; end; end.
Listagem 3. Classe TLoginDAO

Passaremos agora à codificação do formulário de nossa aplicação, presente na Listagem 4. Adicione o seguinte código ao evento OnClick do botão btnLogar.

procedure TfrmLogin.btnLogarClick(Sender: TObject); var LoginModel: TLoginModel; LoginDAO: TLoginDAO; begin LoginModel := TLoginModel.Create; // cria o objeto LoginModel na Memória LoginDAO := TLoginDAO.Create; // cria o objeto LoginDAO na Memória // verifica se há algum edit em branco if (edtUsuario.Text = '') or (edtSenha.Text = '') then raise Exception.Create('Digite usuário e senha') else begin try LoginModel.Usuario := edtUsuario.Text; LoginModel.Senha := edtSenha.Text; if LoginDAO.Logar(LoginModel) then begin ShowMessage('Acesso Autorizado'); end else ShowMessage('Acesso não liberado'); finally // libera os objetos da memória FreeAndNil(LoginModel); FreeAndNil(LoginDAO); end; end; end;
Listagem 4. Evento OnClick do Botão btnLogar

No evento OnClick do botão btnSair, digite o seguinte o seguinte comando da Listagem 5.

procedure TfrmLogin.btnSairClick(Sender: TObject); begin Application.Terminate; // encerra a aplicação; end;
Listagem 5. Evento OnClick do Botão btnSair

Conclusão

A programação orientada a objetos e a aplicação do DAO Pattern melhoram em muito a qualidade de nosso código.

Este é apenas um exemplo de como criar aplicações orientadas a objetos no Delphi. Teste o código, refatore e otimize este exemplo.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados