Padrão de Projeto DAO(Data Access Object): Abstraindo o Acesso a Dados

No mundo da programação, construir aplicações robustas e escaláveis é um desafio constante.

À medida que as aplicações crescem, a complexidade aumenta e a manutenção torna-se uma tarefa árdua.

É nesse cenário que o padrão de projeto DAO (Data Access Object) se destaca como um padrão de projeto essencial para os desenvolvedores.

Neste conteúdo vamos entender a teoria por trás e como aplica-lo.

1. O Que é o Padrão de Projeto DAO?

Padrão de Projeto DAO, ou Data Access Object, é um padrão de projeto que visa isolar a lógica de acesso a dados em uma aplicação.

Em vez de misturar o código de banco de dados com a lógica de negócios, o DAO encapsula as operações de persistência em classes dedicadas, promovendo a separação de responsabilidades e simplificando o código.

Basicamente, o padrão de projeto DAO é responsável pelas operações CRUD (Create, Read, Update e Delete) em uma aplicação.

Normalmente, ao adotar esse design pattern, há uma classe responsável pelas regras de validação.

Somente quando todo o processo é validado, a classe DAO é chamada com o método responsável pela inclusão, consulta, atualização ou deleção, por exemplo.

2. Por Que Usar Padrão de Projeto DAO?

Agora que entendemos que o DAO é chamado por outra classe para executar sua responsabilidade essencial de acessar os dados, realizando operações no banco de dados como inclusão, leitura, alteração ou deleção, vamos entender por que esse padrão é útil.

Não seria mais fácil usar tudo em uma única classe? Vamos explorar os motivos.

2.1. Maior Coesão

A coesão refere-se ao grau em que os elementos de um módulo estão relacionados entre si.

Com o padrão de projeto DAO, a camada de negócios pode focar nas regras e na lógica da aplicação, sem ser contaminada por detalhes de acesso a dados.

Isso resulta em um código mais organizado e fácil de entender.

2.2. Flexibilidade Aprimorada

Ao isolar o acesso a dados, mudanças na tecnologia de persistência (como a troca de um banco de dados relacional para um banco NoSQL) podem ser implementadas no DAO sem impactar a camada de negócios.

Essa flexibilidade é crucial para a manutenção e evolução da aplicação.

2.3. Reuso Eficaz

Operações comuns de acesso a dados são centralizadas em um único lugar, eliminando a repetição de código.

Isso não só reduz erros, mas também facilita a manutenção e atualização do código.

2.4. Testabilidade Facilitada

Testar a camada de negócios torna-se mais simples, pois ela não depende diretamente de detalhes de implementação do banco de dados.

Utilizando mocks e stubs, é possível testar a lógica de negócios de forma isolada e eficaz.

3. Implementando DAO em PHP

Para ilustrar o poder do DAO (Data Access Object), vamos construir um exemplo prático em PHP.

Embora o padrão de Projeto DAO seja amplamente utilizado em Java, optamos por usar PHP neste exemplo.

No entanto, é importante destacar que o padrão pode ser aplicado na maioria das linguagens orientadas a objetos.

3.1. Cenário de Exemplo

Para ilustrar a aplicação do padrão DAO de forma simples, imagine o seguinte cenário: você precisa realizar a persistência dos dados de um cliente no banco de dados.

A tabela cliente possui os seguintes atributos: nome, cnpj, cep, estado, cidade, bairro, numero e complemento. Para esta aplicação, é necessário utilizar uma classe DAO com o nome ClientDao. Vamos à implementação dessas regras.

3.1.1. Criação da classe ClientDao

<?php
class ClientDao {
    private $connection;

    public function __construct($connection) {
        $this->connection = $connection;
    }

3.1.2. Create

// Método para inserir um novo cliente no banco de dados

    public function inserirCliente($nome, $cnpj, $cep, $estado, $cidade, $bairro, $numero, $complemento) {
        $sql = "INSERT INTO cliente (nome, cnpj, cep, estado, cidade, bairro, numero, complemento) VALUES (:nome, :cnpj, :cep, :estado, :cidade, :bairro, :numero, :complemento)";
        $stmt = $this->connection->prepare($sql);
        $stmt->bindParam(':nome', $nome);
        $stmt->bindParam(':cnpj', $cnpj);
        $stmt->bindParam(':cep', $cep);
        $stmt->bindParam(':estado', $estado);
        $stmt->bindParam(':cidade', $cidade);
        $stmt->bindParam(':bairro', $bairro);
        $stmt->bindParam(':numero', $numero);
        $stmt->bindParam(':complemento', $complemento);
        $stmt->execute();
    }

3.1.3. Update

// Método para atualizar um cliente no banco de dados

    public function atualizarCliente($id, $nome, $cnpj, $cep, $estado, $cidade, $bairro, $numero, $complemento) {
        $sql = "UPDATE cliente SET nome = :nome, cnpj = :cnpj, cep = :cep, estado = :estado, cidade = :cidade, bairro = :bairro, numero = :numero, complemento = :complemento WHERE id = :id";
        $stmt = $this->connection->prepare($sql);
        $stmt->bindParam(':id', $id);
        $stmt->bindParam(':nome', $nome);
        $stmt->bindParam(':cnpj', $cnpj);
        $stmt->bindParam(':cep', $cep);
        $stmt->bindParam(':estado', $estado);
        $stmt->bindParam(':cidade', $cidade);
        $stmt->bindParam(':bairro', $bairro);
        $stmt->bindParam(':numero', $numero);
        $stmt->bindParam(':complemento', $complemento);
        $stmt->execute();
    }

3.1.4. Delete

// Método para deletar um cliente no banco de dados
    public function deletarCliente($id) {
        $sql = "DELETE FROM cliente WHERE id = :id";
        $stmt = $this->connection->prepare($sql);
        $stmt->bindParam(':id', $id);
        $stmt->execute();
    }

3.1.5. Consultar todos

  // Método para clientes do banco de dados
    public function obterClientes() {
        $sql = "SELECT * FROM cliente";
        $stmt = $this->connection->prepare($sql);
        $stmt->bindParam(':id', $id);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        return $result;
    }

3.1.6. Consultar por ID

// Método para obter um cliente do banco de dados
    public function obterCliente($id) {
        $sql = "SELECT * FROM cliente WHERE id = :id";
        $stmt = $this->connection->prepare($sql);
        $stmt->bindParam(':id', $id);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($result) {
            return $result;
        } else {
            return null;
        }
    }

Esses exemplos mostram como criar a DAO com os métodos que acessam o banco de dados.

A classe DAO é chamada com o método correspondente no momento em que o acesso ao banco de dados se faz necessário.

Vamos ver um exemplo.

<?php
require 'ClientDao.php';

try 
{
    $clientDao = new ClientDao($connection);

    // Inserindo um novo cliente
    $clientDao->inserirCliente("Empresa XYZ", "12.345.678/0001-99", "12345-678", "SP", "São Paulo", "Centro", "123", "Apto 45");
    echo "Cliente inserido com sucesso!<br>";

    // Atualizando um cliente existente
    $clientDao->atualizarCliente(1, "Empresa ABC", "98.765.432/0001-99", "87654-321", "RJ", "Rio de Janeiro", "Zona Sul", "321", "Sala 10");
    echo "Cliente atualizado com sucesso!<br>";

    // Obtendo um cliente
    $cliente = $clientDao->obterCliente(1);
    if ($cliente) {
        echo "Cliente obtido: " . $cliente['nome'] . "<br>";
    } else {
        echo "Cliente não encontrado.<br>";
    }

    // Deletando um cliente
    $clientDao->deletarCliente(1);
    echo "Cliente deletado com sucesso!<br>";

} 
catch (PDOException $e) {
    echo 'Erro: ' . $e->getMessage();
}
?>

Conclusão: Padrão de Projeto DAO

O DAO (Data Access Object) é um padrão de projeto poderoso para estruturar aplicações robustas e escaláveis em PHP ou em qualquer outra linguagem orientada a objetos.

Ao isolar o acesso a dados e promover a separação de responsabilidades, o DAO contribui significativamente para a manutenção e a evolução do código.

Com o DAO como aliado, você estará bem equipado para construir aplicações PHP que resistem ao teste do tempo e entregam valor real aos seus usuários.

Marcos R.S
Marcos R.S

Olá, pessoal! Sou Marcos, apaixonado por aprender, especialmente sobre tecnologia. Estou sempre em busca de lapidar os conhecimentos que já possuo e adquirir novos. Atuo com análise e desenvolvimento de sistemas, sou graduando em Sistemas de Informação e tenho formação técnica em Informática.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *