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:

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

Formulário frmLogin
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:

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