Skip to content

Instantly share code, notes, and snippets.

@alanwillms
Last active August 29, 2015 14:27
Show Gist options
  • Save alanwillms/1908afc25d5b214c7549 to your computer and use it in GitHub Desktop.
Save alanwillms/1908afc25d5b214c7549 to your computer and use it in GitHub Desktop.
Liskov breaking
<?php
/**
* Interface para meios de transporte para envio de um pedido.
*/
interface TransportePedidoInterface
{
/**
* Envia um pedido.
* @param Pedido $pedido pedido a ser enviado.
* @return boolean se o pedido foi enviado com sucesso ou não.
*/
abstract public function enviar(Pedido $pedido);
}
/**
* Envia pedidos para uma API de terceiros
*/
class TransportePedidoAPI
{
/**
* @inheritdoc
*/
public function enviar(Pedido $pedido)
{
$this->api->postar($pedido->toArray());
}
}
/**
* Envia pedidos depositando arquivos em um FTP.
*/
class TransportePedidoFTP extends Logger
{
/**
* Conecta no serviço de FTP.
* @param string $host host.
* @param integer $porta porta.
* @param string $usuario nome de usuário.
* @param string $senha senha.
* @return boolean se conectou com sucesso ou não.
*/
public function conectar($host, $porta, $usuario, $senha) { ... }
/**
* @inheritdoc
* @throws MissingFtpConnectionException
*/
public function enviar(Pedido $pedido)
{
if (empty($this->conexao)) {
throw new MissingFtpConnectionException;
}
$arquivo = $this->criarArquivo($pedido);
$this->ftp->upload($arquivo);
unlink($arquivo)
}
}
/**
* Dispara os pedidos concluídos.
*/
class ServicoEnvioPedido
{
/**
* Configura as dependências.
* @param TransportePedidoInterface $transporte meio de envio do pedido.
* @return void
*/
public function __construct(TransportePedidoInterface $transporte)
{
$this->transporte = $transporte;
}
/**
* Envia um pedido.
* @param Pedido $pedido pedido a ser enviado
* @return boolean se o pedido foi enviado com sucesso ou não.
*/
public function enviar(Pedido $pedido)
{
return $this->transporte->enviar($pedido);
}
}
// Funciona normalmente:
$transporteAPI = new TransportePedidoAPI;
$envioPedido = new ServicoEnvioPedido($transporteAPI);
$envioPedido->enviar(); // true ou false
// Lança uma exceção:
$transporteFTP = new DatabaseLogger;
$envioPedido = new ServicoEnvioPedido($transporteFTP);
$envioPedido->enviar(); // MissingFtpConnectionException
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment