Menu
Coddy logo textTech

Recapitulação - Processador de Pagamentos

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 37 de 91.

challenge icon

Desafio

Fácil

Vamos criar um sistema completo de processamento de pagamentos que reúne tudo o que você aprendeu sobre polimorfismo. Você criará uma arquitetura baseada em interface na qual diferentes métodos de pagamento podem ser processados por meio de um único processador unificado, demonstrando como o polimorfismo torna o código flexível e extensível.

Você organizará seu código em cinco arquivos:

  • PaymentMethod.php: Defina uma interface PaymentMethod com duas assinaturas de método: process(float $amount): string para lidar com o pagamento e um método estático getMethodName(): string que retorna o nome do tipo de pagamento. Esse contrato garante que qualquer método de pagamento possa ser processado de maneira uniforme.
  • CreditCard.php: Crie uma classe CreditCard que implemente PaymentMethod. Inclua o arquivo da interface. A classe deve ter uma propriedade privada $lastFourDigits definida por meio do construtor. Implemente process() para retornar "Processing $[amount] via Credit Card ending in [lastFourDigits]" (formate o valor com 2 casas decimais). Implemente o método estático getMethodName() usando vinculação estática tardia para retornar "Credit Card".
  • PayPal.php: Crie uma classe PayPal que implemente PaymentMethod. Inclua o arquivo da interface. A classe deve ter uma propriedade privada $email definida por meio do construtor. Implemente process() para retornar "Processing $[amount] via PayPal account [email]" (formate o valor com 2 casas decimais). Implemente o método estático getMethodName() para retornar "PayPal".
  • PaymentProcessor.php: Crie uma classe PaymentProcessor que coordene os pagamentos. Inclua o arquivo da interface. Adicione um método executePayment(PaymentMethod $method, float $amount): string que use a indicação de tipo da interface para aceitar qualquer método de pagamento. Esse método deve retornar o resultado da chamada de process() no método de pagamento. Adicione outro método describeMethod(PaymentMethod $method): string que retorne "Payment via: [methodName]" usando o método estático getMethodName() da classe do método de pagamento passado.
  • main.php: Inclua todos os arquivos das classes de pagamento e o processador. Crie uma instância de PaymentProcessor. Você receberá três entradas: os quatro últimos dígitos de um cartão de crédito, um endereço de e-mail do PayPal e um valor de pagamento. Crie uma instância de CreditCard e uma de PayPal com seus respectivos identificadores. Converta o valor para um float. Use o processador para executar um pagamento primeiro com o cartão de crédito e depois com o PayPal. Imprima cada resultado em sua própria linha. Por fim, imprima a descrição do método para o método de pagamento do PayPal.

A beleza desse design é que seu PaymentProcessor não sabe nada especificamente sobre cartões de crédito ou PayPal. Ele conhece apenas a interface PaymentMethod. Você poderia adicionar uma classe BankTransfer ou Cryptocurrency amanhã, e o processador lidaria com elas sem nenhuma modificação. Esse é o poder do polimorfismo baseado em interfaces combinado com a vinculação estática tardia!

Experimente você mesmo

<?php
// Inclua todos os arquivos necessários
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// Leia as entradas
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: Crie uma instância de PaymentProcessor

// TODO: Crie uma instância de CreditCard com os últimos quatro dígitos

// TODO: Crie uma instância de PayPal com o e-mail

// TODO: Execute o pagamento com cartão de crédito e imprima o resultado

// TODO: Execute o pagamento com PayPal e imprima o resultado

// TODO: Imprima a descrição do método para o método de pagamento PayPal
?>

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de PHP online