PauloRB.dev

Desenvolvedor de Software

Design Pattern Facade em PHP : Exemplo prático | PauloRB.dev Design Pattern Facade em PHP : Exemplo prático – PauloRB.dev
Design Pattern Facade em PHP : Exemplo prático

Design Pattern Facade em PHP : Exemplo prático

O Design Pattern Facade é uma solução elegante para simplificar a interface de um subsistema complexo, tornando-o mais fácil de usar. Ele atua como uma fachada que esconde a complexidade de classes e interações internas, oferecendo uma interface simplificada para o cliente. Vamos explorar este padrão em PHP com exemplos práticos e sem a necessidade de bibliotecas externas.

Quando Usar o Facade?

  • Quando você deseja oferecer uma interface simplificada para um sistema complexo.
  • Quando várias classes e objetos precisam ser utilizados em conjunto, mas você quer minimizar o acoplamento do cliente a essas classes.
  • Quando é necessário reduzir a complexidade das interações entre componentes.

Exemplo: Sistema de Pedidos

Imagine que estamos desenvolvendo um sistema de pedidos online. Ele envolve diferentes partes: processamento de pagamento, estoque e envio. Sem o Facade, o cliente precisaria interagir diretamente com cada uma dessas partes.

Vamos criar um exemplo de como seria sem o Facade, e depois aplicaremos o padrão para simplificar a interação.

Sem Facade:

class Estoque {
    public function diminuirEstoque($produtoId, $quantidade) {
        echo "Estoque reduzido para o produto $produtoId em $quantidade unidades.\n";
    }
}

class Pagamento {
    public function processarPagamento($valor) {
        echo "Pagamento de R$$valor processado com sucesso.\n";
    }
}

class Envio {
    public function enviarProduto($produtoId) {
        echo "Produto $produtoId enviado.\n";
    }
}

// Cliente precisando lidar com tudo
$estoque = new Estoque();
$pagamento = new Pagamento();
$envio = new Envio();

// Fluxo de pedido
$estoque->diminuirEstoque(101, 2);
$pagamento->processarPagamento(150);
$envio->enviarProduto(101);

Neste exemplo, o cliente precisa conhecer e interagir diretamente com as classes Estoque, Pagamento e Envio, o que pode tornar o código difícil de gerenciar à medida que o sistema cresce.

Com Facade

Agora, vamos criar uma classe PedidoFacade para simplificar a interação.

class PedidoFacade {
    protected $estoque;
    protected $pagamento;
    protected $envio;

    public function __construct() {
        $this->estoque = new Estoque();
        $this->pagamento = new Pagamento();
        $this->envio = new Envio();
    }

    public function processarPedido($produtoId, $quantidade, $valor) {
        $this->estoque->diminuirEstoque($produtoId, $quantidade);
        $this->pagamento->processarPagamento($valor);
        $this->envio->enviarProduto($produtoId);
    }
}

// Cliente agora só interage com o Facade
$pedidoFacade = new PedidoFacade();
$pedidoFacade->processarPedido(101, 2, 150);

Agora, o cliente precisa interagir apenas com o PedidoFacade, que esconde a complexidade do sistema. Isso torna o código mais limpo e fácil de manter.

Explicação

  1. Facade (PedidoFacade): A classe PedidoFacade age como uma “fachada” para o subsistema de pedidos. Ela conhece os objetos internos (Estoque, Pagamento, Envio), mas o cliente não precisa se preocupar com eles.
  2. Subsistema: As classes Estoque, Pagamento e Envio formam o subsistema que executa o trabalho real. Elas permanecem desacopladas e focadas em suas responsabilidades específicas.

Vantagens do Facade

  • Simplicidade: O cliente interage com uma interface simplificada e não precisa se preocupar com a implementação dos componentes.
  • Desacoplamento: O cliente não depende diretamente de várias classes. Mudanças internas no subsistema não afetam a interface exposta pelo Facade.
  • Manutenção: O código se torna mais fácil de manter, já que a complexidade interna fica encapsulada.

O padrão Facade é uma maneira eficaz de ocultar a complexidade de sistemas com múltiplas classes e responsabilidades, simplificando a interação para o cliente. Neste exemplo em PHP, criamos um sistema de pedidos onde o cliente interage com uma única classe (PedidoFacade), deixando todo o trabalho pesado para o subsistema. Este padrão ajuda a manter o código mais organizado e mais fácil de manter, especialmente em sistemas complexos.

 

Mais Posts

Laravel: Como visualizar a SQL com os valores preenchidos para facilitar o debug

Laravel: Como visualizar a SQL com os valores preenchidos para facilitar o debug

No dia a dia do desenvolvimento com Laravel, é comum precisarmos inspecionar uma query SQL gerada dinamicamente. A primeira ferramenta... Leia mais

Entendendo as Diferenças Entre Programação Orientada a Objetos e Funcional: Java vs. Elixir

Entendendo as Diferenças Entre Programação Orientada a Objetos e Funcional: Java vs. Elixir

A escolha entre programação orientada a objetos (OOP) e programação funcional (FP) é mais do que uma preferência de estilo;... Leia mais

Laravel: Trabalhando com whereHas e with de forma simples

Laravel: Trabalhando com whereHas e with de forma simples

Quando trabalhamos com Eloquent no Laravel, frequentemente precisamos realizar consultas baseadas em relacionamentos entre modelos. Para isso, o Laravel oferece... Leia mais

Por que whereNull não funciona com updateOrCreate no Laravel (e como evitar bugs silenciosos)

Por que whereNull não funciona com updateOrCreate no Laravel (e como evitar bugs silenciosos)

O updateOrCreate() é um dos métodos mais utilizados no Eloquent para garantir que registros sejam atualizados ou criados sem duplicações.... Leia mais