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’)
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.
Volte ao formulário da aplicação e altere a propriedade Name para frmLogin.
Utilizando a Tool Palette, adicione os seguintes controles:
- 3 Labels;
- 2 Edits;
- 2 Buttons.
Altere a propriedade Name dos controles para:
- 3 Labels (lblTitulo, lblUsuario, lblSenha);
- 2 Edits (edtUsuario, edtSenha);
- 2 Buttons (btnLogar, btnSair);
Organize o formulário e altere a propriedade Caption dos controles conforme a Figura 1.

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:
- Formulário Login - uFrmLogin;
- Unit Login Model - uLoginModel;
- Data Module - uDm_Dados;
- Nome do Projeto – LOGINOO;
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.
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;
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;
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.