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

Manipulando Strings em GOLANG

Manipulando Strings em GOLANG

Resolvi retormar meus estudo em Go Lang e assim vamos ao primeiro post dessa série de estudos onde vamos aprender... Leia mais

Como instalar o DBEAVEr via PPA no Ubuntu Linux e derivados.

Como instalar o DBEAVEr via PPA no Ubuntu Linux e derivados.

Vamos a mais um post HOW TO…. Abra o Terminal: Você pode fazer isso procurando por “Terminal” no menu de... Leia mais

Como Executar Migrations e Seeders Específicas no Laravel

Como Executar Migrations e Seeders Específicas no Laravel

Para rodar uma migration específica no Laravel, você pode usar o comando migrate com a opção --path. Siga os passos... Leia mais

Habilitar Sudo no Debian e seus derivados

Habilitar Sudo no Debian e seus derivados

Por padrão o debian não trás o sudo habilitado como estamos acostumados no Ubuntu e outro de seus derivados como... Leia mais