Last active
August 29, 2015 14:27
-
-
Save alanwillms/1908afc25d5b214c7549 to your computer and use it in GitHub Desktop.
Liskov breaking
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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